sql注入程序_Java应用程序中SQL注入

sql注入程序

在本文中,我们将讨论什么是SQL注入攻击。 以及它如何影响任何Web应用程序使用后端数据库。 在这里,我专注于Java Web应用程序。 开放Web应用程序安全性项目(OWAP)列出了SQL注入是Web应用程序的主要漏洞攻击。 黑客将Web请求中SQL代码注入Web应用程序并控制后端数据库,即使后端数据库未直接连接到Internet也是如此。 我们将看到如何解决和防止Java Web Application中SQL注入。

为此,我们需要1个工具。 这些工具是完全开源的。 SQL Map – SqlMap是一个开放源代码渗透测试工具,可自动执行检测和利用SQL Injection的过程。 我们可以从这里得到。

SQL注入

SQL注入是通过Web应用程序提取数据库信息的技术。
场景:

我们有一台数据库服务器[MySQL]和Web应用程序服务器[Tomcat]。 考虑数据库服务器未连接到Internet。 但它与应用程序服务器连接。 现在,我们将看到使用Web应用程序如何使用sql-injection方法提取信息。

在查看sql注入之前,我们创建了小型Web应用程序。 它包含单个jsp页面,像这样

<form action='userCheck'><input type='text' name='user' value=''/><input type='submit' value='Submit'/></form>

在userCheck中,Servlet接收用户输入字段并连接到数据库服务器,并根据用户输入触发sql查询,并接收ResultSet并将其迭代打印到网页中。
userCheck servlet

protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType('text/html;charset=UTF-8');PrintWriter out = response.getWriter();try {String user = request.getParameter('user');Connection conn = null;String url = 'jdbc:mysql://192.168.2.128:3306/';String dbName = 'anvayaV2';String driver = 'com.mysql.jdbc.Driver';String userName = 'root';String password = '';try {Class.forName(driver).newInstance();conn = DriverManager.getConnection(url + dbName, userName, password);Statement st = conn.createStatement();String query = 'SELECT * FROM  User where userId='' + user + ''';out.println('Query : ' + query);System.out.printf(query);ResultSet res = st.executeQuery(query);out.println('Results');while (res.next()) {String s = res.getString('username');out.println('\t\t' + s);}conn.close();} catch (Exception e) {e.printStackTrace();}} finally {out.close();}

当我们执行上面的代码时。 在正常的输入执行中,如下所示

当我们使用“ ramki”之类的正常值时,请单击“提交”按钮,然后输出如下内容

在正常行为中,它是完全正确的。 当我在输入框中输入一些特殊字符或某些sql语句时会发生什么?

当我们单击“提交”按钮时,它将像这样显示表中的所有行

这是我应用程序中的一个重大安全漏洞。 发生了什么……是一种SQL注入。

让我们来看看发生了什么。

当我在输入框中输入正常值时,我的servlet接收并替换sql查询并执行它。

SELECT * FROM User where userId='ramki'

是正确的,我们得到了正确的输出。

当我放入sdfssd'或'1'='1时会发生什么

SELECT * FROM用户,其中userId =' sdfssd'或'1'='1 '

它的手段

SELECT * FROM User where userId ='sdfssd' or '1'='1'

像这样。 因此,我们的查询已更改。 现在新查询有2个条件。 第二条件始终为真。 第一个条件可能是正确的,也可能不是。 但是这两个条件与或逻辑相连。 因此,where子句对于所有行始终为true。 结果是它们带来了表中的所有行。

这称为盲SQL注入。 如果您想了解更多有关SQL注入的详细信息,请点击此处

  • http://www.unixwiz.net/techtips/sql-injection.html
  • http://www.imperva.com/resources/glossary/sql_injection.html
  • http://www.applicure.com/blog/owasp-top-10-2010

现在我们可以直接在输入框中输入sql语句

喜欢

ramki'UNION SELECT * FROM mysql.`user` u-

然后

SELECT * FROM User where userId =' ramki'UNION SELECT * FROM MySQL.`user` u — '

然后它的意思

SELECT * FROM User where userId ='ramki' UNION SELECT * FROM mysql.`user` u --'

在这里他们不会使用*,因为它与第一个表不匹配。 因此,他们找到了多少列,然后将Union与第二张表一起使用。他们想要的用户特定列。 结果,获取mysql数据库用户信息通过我们的Web应用程序公开。

sqlmap

它配备了强大的检测引擎,针对最终渗透测试仪的众多细分功能以及从数据库指纹识别到从数据库获取数据的广泛转换

在您的系统中安装sqlmap或使用BackTrack Linux

在这里,我使用了回溯Linux,因为它已经预先安装了许多应用程序,例如sqlmap。

在回溯中,sqlmap位于/ pentest / web / scanner / sqlmap中

sqlmap命令

检索所有数据库

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki --dbs

检索所有表

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test --tables

从特定表中检索所有列

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test -T User --columns

转储特定表中所有值的列

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test -T User --dump

转储特定表中某些值的列

./sqlmap.py -u http://localhost:8080/SQLInject/userCheck?user=ramki -D test -T User -C userId,password --dump

观看视频以获取完整的演示(高清观看):

http://www.youtube.com/watch?feature=player_embedded&v=C5PQ86nWMkM

如何防止SQL注入

  • 在替代查询之前,我们需要进行验证。 删除ir可以避免使用特殊字符(如单引号),关键字(如select,Union)等。
  • 与占位符一起使用准备好的语句
PreparedStatement  preparedStatement=conn.prepareStatement('SELECT * FROM  usercheck where username=?') ;
preparedStatement.setString(1, user);

setXXX()方法进行所有验证并转义特殊字符

现在,如果使用相同的盲注SQL注入

sdfssd'或'1'='1然后

SELECT * FROM User where userId='sdfssd\' or \'1\'=\'1'

在这里,所有特殊字符都被转义。当我们使用JPA类的ORM工具(例如Hibernate,EclipseLink,TopLink)时,也可能出现sqlinjection。

为了防止SQL注入,我们需要使用NamedQuery而不是普通的Query。 因为NamedQuery在内部使用PreparedStement,但普通查询在Java中使用norma Stement。

JPA中的普通查询

String q='SELECT r FROM  User r where r.userId=''+user+''';
Query query=em.createQuery(q);
List users=query.getResultList();

所以不要使用普通查询,而是使用命名查询

Query query=em.createNamedQuery('User.findByUserId');
query.setParameter('userId', user);
List users=query.getResultList();


您可以从GitHub (或) Google代码下载演示代码

参考:在Ramki Java Blog博客上,请我们的JCG合作伙伴 Rama Krishnan 注意Java应用程序中的SQLInjection 。

翻译自: https://www.javacodegeeks.com/2012/11/sql-injection-in-java-application.html

sql注入程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++设计模式-Prototype原型模式

作用&#xff1a; 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 Prototype模式提供了一个通过已存在对象进行新对象创建的接口&#xff08;Clone&#xff09;&#xff0c; Clone()实现和具体的语言相关&#xff0c;在C中通过拷贝构造函数实现。…

[SHOI2008]cactus仙人掌图

Description 如果某个无向连通图的任意一条边至多只出现在一条简单回路&#xff08;simple cycle&#xff09;里&#xff0c;我们就称这张图为仙人掌图&#xff08;cactus&#xff09;。所谓简单回路就是指在图上不重复经过任何一个顶点的回路。 举例来说&#xff0c;上面的第一…

java 导入导出txt文件_Java读取和写入txt文件

1 问题描述对于java的读取和写入txt一直心存疑惑&#xff0c;随着知识的积累&#xff0c;又重新进行学习&#xff0c;对java的文件读写理解更加深刻&#xff0c;在这里将自己的小小经验总结分享给大家。下面是大家了解java流的一个基本框架。2 问题分析在java中&#xff0c;jav…

[国家集训队] tree Ⅱ

bzoj2631&#xff08;权限题。。。&#xff09;:链接 落咕:链接 考察的是LCT维护链上信息。 但是这个题不一样的是又有加法又有乘法。。。&#xff08;有木有想到落咕的模板——线段树2qwq&#xff09; 因为乘法的运算优先度比加法高&#xff0c;所以我们要先做乘法再做加法&am…

C++拷贝构造函数(深拷贝,浅拷贝)

对于普通类型的对象来说&#xff0c;它们之间的复制是很简单的&#xff0c;例如&#xff1a; int a88; int ba; 而类对象与普通对象不同&#xff0c;类对象内部结构一般较为复杂&#xff0c;存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include <iostream>u…

java用for循环修改密码_Java for循环的几种用法分析

J2SE 1.5提供了另一种形式的for循环。借助这种形式的for循环&#xff0c;可以用更简单地方式来遍历数组和Collection等类型的对象。本文介绍使用这种循环的具体方式&#xff0c;说明如何自行定义能被这样遍历的类&#xff0c;并解释和这一机制的一些常见问题。在Java程序中&…

apache camel_Apache Camel入门

apache camel在先前的博文中&#xff0c;我们了解了企业集成模式&#xff08;EIP&#xff09;。 现在&#xff0c;在这篇文章中&#xff0c;我们将研究实现这些模式的Apache Camel框架。 关于骆驼&#xff1a; Apache Camel是一个开放源代码项目&#xff0c;已有将近5年的历史…

C++拷贝构造函数详解

一. 什么是拷贝构造函数 首先对于普通类型的对象来说&#xff0c;它们之间的复制是很简单的&#xff0c;例如&#xff1a; [c-sharp] view plaincopyint a 100; int b a; 而类对象与普通对象不同&#xff0c;类对象内部结构一般较为复杂&#xff0c;存在各种成员变量。 …

mysql经典总结文章_MySQL基础篇(01):经典实用查询案例,总结整理

一、连接查询图解示意图1、建表语句部门和员工关系表&#xff1a;CREATE TABLE tb_dept (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键ID,deptName varchar(30) DEFAULT NULL COMMENT 部门名称,PRIMARY KEY (id)) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8;CREAT…

针对故障场景的血液,汗液和书写自动集成测试

去年冬天&#xff0c;我为仍在工作的客户编写并发布了一项服务。 总体而言&#xff0c;该服务满足了业务需求和性能要求&#xff0c;但是使用该服务的一个团队告诉我&#xff0c;他们定期遇到一个问题&#xff0c;该问题是该服务将返回500个错误&#xff0c;并且在重新启动该服…

java 8 update 11_从Java 8升级到Java 11应该注意的问题

从 Java 8迁移到Java 11比大多数升级更棘手。以下是这个过程的一些注意事项。模块在Java 9中Java引入了历史上最大的变化之一 是模块&#xff0c;但&#xff1a;不必将你自己的代码模块化以后才能升级到Java 11。在大多数情况下&#xff0c;放在类路径classpath上的代码能继续在…

标签树的三种遍历

一、标签树的下行遍历 属性说明.contents子节点的列表&#xff0c;将<tag>所有儿子节点存入列表中&#xff08;只能获取下一级儿子节点&#xff09;.children子节点的迭代类型&#xff0c;与.contents类似&#xff0c;用于循环遍历儿子节点.descendants子孙节点的迭代类型…

Git 使用规范流程

团队开发中&#xff0c;遵循一个合理、清晰的Git使用流程&#xff0c;是非常重要的。 否则&#xff0c;每个人都提交一堆杂乱无章的commit&#xff0c;项目很快就会变得难以协调和维护。 下面是ThoughtBot 的Git使用规范流程。我从中学到了很多&#xff0c;推荐你也这样使用Git…

oracle安装静默

安装环境&#xff1a;centos71、修改主机名 /etc/sysconfig/network#HOSTNAMEoracledb.012、修改ip和对应的主机名 /etc/hosts#10.5.1.190 oracledb.013、关闭Selinux /etc/selinux/config#SELINUXdisabled4、参考官方文档安装依赖的软件包 binutils-2.23.52.0.1-12.el7.x86_64…

[MEGA DEAL] Ultimate Java开发和认证指南(59%折扣)

通过介绍世界上最受欢迎的编程语言之一掌握Java编程概念 嘿&#xff0c;怪胎&#xff0c; 本周&#xff0c;在我们的JCG Deals商店中 &#xff0c;我们提供了一个极端的报价 。 我们提供的《 Ultimate Java Development and Certification Guide 》 仅售20美元&#xff0c;而…

python浅拷贝的说法_Python中List的复制(直接复制、浅拷贝、深拷贝)

直接赋值&#xff1a;如果用 直接赋值&#xff0c;是非拷贝方法。这两个列表是等价的&#xff0c;修改其中任何一个列表都会影响到另一个列表。old [1,[1,2,3],3]new []for i in range(len(old)):new.append(old[i])new[0] 3new[1][0] 3-----------------------Before:[1,…

AliOS-Things Visual studio code helloworld 入门

配置环境的时候别忘了下载&#xff1a;GCC工具链&#xff1a;https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads AliOS Things 完成第一个应用&#xff1a;Hello World 全局掌控 从Git上下载源码用VSCode打开源码&#xff0c;查看源码的目录结构打开Hello…

java 联网_java网络

这个图很形象的展示了OSI的五层架构之间的关系。OSI被称为开放式互联&#xff0c;是国际标准组织制定的网络模型&#xff0c;本来是七层&#xff0c;后来把表现层和会话层加到应用层里面了。那么五层模型中的每一层具体都是干什么的呢&#xff1f;在标准的网络模型中&#xff0…

[小米OJ] 4. 最长连续数列

思路&#xff1a; 时间限制为O(n)&#xff0c;即不能使用先排序后寻找的方法。 这里利用哈希表查询插入复杂度都为O(1)的特性来解&#xff0c;利用一个哈希表来保存每一个数字以及其所在数列的长度。 遍历每一个数字n&#xff1a;查询表中是否存在n-1和n1&#xff0c;若存在&am…

控制反转

控制反转[编辑] 维基百科&#xff0c;自由的百科全书控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种设计原则&#xff0c;可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入&#xff08;Depe…