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注入程序

sql注入程序_Java应用程序中SQL注入相关推荐

  1. sql 解析字符串添加到临时表中 sql存储过程in 参数输入

    sql 解析字符串添加到临时表中  sql存储过程in 参数输入 解决方法 把字符串解析 添加到 临时表中 SELECT * into #临时表   FROM dbo.Func_SplitOneCol ...

  2. sql azure 语法_Azure Data Studio中SQL Server Profiler

    sql azure 语法 In this article, we will explore SQL Server Profiler in Azure Data Studio in detail inc ...

  3. sql azure 语法_Azure Data Studio中SQL Server架构比较扩展

    sql azure 语法 This article explores the SQL Server Schema Compare extension in the Azure Data Studio. ...

  4. mysql sql优化_浅谈mysql中sql优化

    说到sql优化,一般有几个步骤呢,在网上看到了一篇很不错的帖子.在这分享一下吧,也是自己学习的一个过程. 一.查找慢查询 1.1.查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; ...

  5. 经典的java程序_Java经典程序

    } } } ----------------- 结果: A B D C B D C B ----------------- 2.写出程序运行结果 import java.lang.StringBuff ...

  6. sql azure 语法_Azure Data Studio中SQL代码段

    sql azure 语法 This article will fully cover the code snippet SQL developer productivity feature in Az ...

  7. sql limit 子句_Java 8流中的常见SQL子句及其等效项

    sql limit 子句 功能编程允许使用通用语言进行准声明性编程 . 通过使用功能强大的流畅API(例如Java 8的Stream API )或jOOλ的顺序Stream扩展Seq或更复杂的库(例如 ...

  8. oracle中SQL语句ge的用法,Oracle中SQL语句的几种用法

    在诊断数据库系统性能的过程中,总会涉及到跟踪效率低下的SQL语句,Oracle数据库10g包含一种新的实用程序trcsess,它可以让您基于会话ID或模块名称之类的条件,有选择地从大量跟踪文件中抽取出 ...

  9. java sql特殊字符处理_java用字符串拼接SQL语句的特殊字符转义问题

    在实际的项目开发中,往往会根据用户在界面的文本框中输入的信息,去数据库中做模糊查询.如果使用的是原始的JDBC和SQL,往往需要对用户的输入进行转义,避免生成的sql语法错误,或者防止SQL注入.比如 ...

最新文章

  1. 高可用性网络的简单配置方案(一)
  2. 集中式管理助推服装企业腾飞
  3. ARM开发培训的总结报告
  4. iBATIS.net获取运行时sql语句
  5. 插入模板_现场组装楼梯踏步模板施工支设细节
  6. 图片效果集合(js、jquery或html5)
  7. python watchdog的使用_python watchdog监控文件修改
  8. 华罗庚先生教会我如何学习
  9. python源码中的学习笔记_第8章_函数
  10. 几个C#控件出现闪烁的问题的解决方案(转)
  11. svg转换pdf用php实现,如何使用javascript在JSPDF中将SVG文件转换为PDF
  12. eclipse如何导入okhttp 2.x源码
  13. matlab中可调节负载,请教MOC3022控制可控硅的电路调节负载功率的问题
  14. android 字体加粗
  15. linux7.5开放端口,Centos/linux开放端口
  16. 安全事件日志中的事件编号与描述
  17. 用C语言代码编写一个五子棋小游戏
  18. python 基础学习 day6-字典
  19. YAMAHA机器人(EtherNet/IP)与西门子S71500系列PLC(PROFINET)通讯
  20. 【Halcon】区域分割:background_seg

热门文章

  1. 什么是线程安全,你真的了解吗
  2. JAVA面试常考系列五
  3. 学习java多线程,这必须搞懂的这几个概念
  4. 【Python】有效资源爬取并集
  5. React中的各个目录文件功能
  6. mysql - Docker Wordpress连接到本地主机上的数据库服务器
  7. 本地java判断zk节点是否存在
  8. JVM参数设置、分析(转)
  9. 使用junit进行单元测试_使用JUnit对ADF应用程序进行单元测试
  10. 运动基元_Java更快地对基元数组进行排序?