Java应用程序中的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 --'

在这里,他们不会使用*,因为它与第一个表不匹配。 因此,他们找到了多少列,然后将联合表与第二个表一起使用。他们想要的用户特定列。 结果,获取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

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

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

相关文章

【转】ReactNativeweexDeviceOne对比

React Native出来有一段时间了&#xff0c;国内的weex和deviceone是近期发布的&#xff0c;我可以说从2011年就开始关注快速开发的跨平台平台技术了&#xff0c;接触过phoneGap、数字天堂、appcan等早期的移动中间件技术&#xff0c;也跟朋友也讨论过这类的轻量级框架。这些年通…

bluetooth射频已关闭请打开bluetooth射频_希杰大功率射频放大器烧了维修诊断步骤...

如果电阻值过低&#xff0c;说明电源内部存在短路&#xff0c;正常时其阻值应能达到100千欧以上;电容器应能够充放电&#xff0c;如果损坏&#xff0c;则表现为AC电源线两端阻值低&#xff0c;呈短路状态&#xff0c;否则可能是开关管击穿。然后检查直流输出部分脱开负载&#…

java中整数如何表示,在Java中如何在位级别上内部表示整数?

慕瓜9086354Java整数为32位&#xff0c;并且总是带符号的。这意味着&#xff0c;最高有效位(MSB)用作符号位。用an表示的整数int不过是位的加权和。权重分配如下&#xff1a;Bit# Weight31 -2^3130 2^3029 2^29... ...2 2^21 2^10 …

洛谷-P1160 队列安排

题目 Problem Description 一个学校里老师要将班上N个同学排成一列&#xff0c;同学被编号为1&#xff5e;N&#xff0c;他采取如下的方法&#xff1a; 1.先将1号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2.2&#xff5e;N号同学依次入列&#xff0c;编号…

1.HTML小结

HTML 基本文档 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>文档标题</title> </head> <body> 可见文本... </body> </html> <!DOCTYPE html>html文件声明。charset"UTF-8…

方法参数名称和Spring

继续之前的博客文章有关构造函数和方法参数以及Java在运行时不保留参数名称的情况–先前的文章涉及构造函数不保留参数名称及其对Spring中的Contructor注入的含义&#xff0c;在此我将介绍更多内容不保留参数名称的情况对Spring有影响&#xff1a; 1.考虑带参数的Spring MVC C…

Fragment Or DialogFragment Can not perform this action after onSaveInstanceState

转载&#xff1a;http://blog.csdn.net/chenshufei2/article/details/48747149 public void show(FragmentManager manager, String tag) {mDismissed false;mShownByMe true;FragmentTransaction ft manager.beginTransaction();ft.add(this, tag);ft.commit(); //注意这里…

php延迟更新,ThinkPHP开发指南-模型-高级模型之延迟更新

导航&#xff1a;上一页我们经常需要给某些数据表添加一些需要经常更新的统计字段&#xff0c;例如用户的积分、文件的下载次数等等&#xff0c;而当这些数据更新的频率比较频繁的时候&#xff0c;数据库的压力也随之增大不少&#xff0c;我们可以利用高级模型的延迟更新功能缓…

three.js制作3d模型工具_3D打印模型打磨抛光常用工具

对于追求更好模型品质的人来说&#xff0c;对3D打印模型进行后处理工作是必不可少的&#xff0c;而后处理&#xff0c;首要的便是对模型进行打磨、抛光&#xff0c;将不属于模型的耗材去除&#xff0c;提高表面光洁度。在此工作中&#xff0c;我们需要用到很多工具&#xff0c;…

Linux中文档去掉windows文本的多余的回车符(^M)

1) 使用sed 去掉windows下的回车符 &#xff08;注意^M 在linux 下写法 按^M 是回车换行符,输入方法是按住CTRLv,松开v,按m)sed -i s/^M//g filename 2) 在vim下类似 :%s/^M//g &#xff08;^M输入方法和上面方法相同&#xff09; 3) 使用dos2unix dos2unix filename 个人觉得第…

为何要清除浮动?如何清除?

原因&#xff1a; 元素设置了float属性后&#xff0c;就会脱离文档流&#xff0c;当 包含框 的高度小于 浮动框 的时候&#xff0c;会出现高度塌陷。因此才需要清除浮动&#xff01; 表现如图&#xff1a;包括框container已经包不住float的图片了&#xff01; 清除浮动方法&a…

Spring MVC错误处理示例

这篇文章描述了在Spring MVC 3中执行错误处理的不同技术。该代码在GitHub上的Spring-MVC-Error-Handling目录中可用。 它基于带有注释的Spring MVC示例。 在Spring 3之前处理异常 在Spring 3之前&#xff0c;使用HandlerExceptionResolvers处理异常。 此接口定义一个方法&…

PLSQL 学习之路(1)创建用户,表空间,表,数据

1.用SYS用户登录PL/SQL SYSXE as SYSDBA 2.创建表空间 create tablespace Mars datafile F:\oracle\Mars.dbf size 500M autoextend on next 100M maxsize unlimited logging extent management local autoallocate segment space management auto; 3.创建用户 create user Mar…

php数字取反,[转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)

PHP7和PHP5上的安全区别preg_replace()不再支持/e修饰符利用\e修饰符执行代码的后门大家也用了不少了&#xff0c;具体看官方的这段描述:如果设置了这个被弃用的修饰符&#xff0c; preg_replace() 在进行了对替换字符串的 后向引用替换之后, 将替换后的字符串作为php 代码评估…

如何关闭苹果手机自动扣费_教你关闭苹果手机系统的自动更新功能,旧手机还能再用几年!...

大家都知道&#xff0c;苹果手机在更新几个大版本后&#xff0c;手机不是变得非常卡&#xff0c;就是非常的耗电&#xff0c;大大的缩短了手机的使用寿命。所以&#xff0c;许多人都不会选择更新系统&#xff0c;但是手机只要连上WiFi并且在充电状态&#xff0c;就会在半夜自动…

meta标签的常见用法

一、定义和用法 <meta> 标签始终位于 head 元素中。<meta> 元素可提供有关页面的元信息&#xff08;meta-information&#xff09;&#xff0c;元数据不会显示在页面上&#xff0c;但是对于机器是可读的。比如针对搜索引擎和更新频度的描述和关键词。 元数据&…

HttpClient的使用

新引入Hutool-HttpUtil的使用&#xff08;更简单&#xff0c;更强大&#xff01;&#xff09;&#xff0c;详见&#xff1a;http://www.cnblogs.com/jiangbei/p/7667858.html 一、概述 1.简介 根据凡技术必登其官网的原则&#xff08;如果有&#xff09;&#xff0c;我们可以先…

四人帮–代理设计模式

代理是另一种结构设计模式 &#xff0c;可以“代表”另一个对象或“代替”另一个对象以访问后面的对象。 何时使用此模式&#xff1f; 当我们需要创建一个包装来覆盖客户端的主要对象的复杂性时&#xff0c;将使用代理模式。 有哪些使用场景&#xff1f; 虚拟代理–设想一种…

面试题38_数字在排序数组中出现的次数

题目描写叙述 统计一个数字在排序数组中出现的次数。解题思路 数组是排序的&#xff0c;所以反复出现的数字是相邻排列的。 用二分查找算法&#xff0c;找到第一次出现的位置。和 最后一次出现的位置。 推断第一次出现的位置条件为&#xff1a;当前数字的前一个是否与之相等。若…

Hex hsl 转换 php,关于 RGB,HEX,HSL 颜色相互转换

最近一段时间在折腾一个微信在线编辑器的项目&#xff0c;使用 UEditor 进行二次开发。关于 UEditor 的定制&#xff0c;用到的都太粗浅&#xff0c;官方文档上都能找得到。主题使用的样式表是 ueditor.css 而不是ueditor.min.css&#xff0c;定制主题要注意这一点。而对整个项…