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,一经查实,立即删除!

相关文章

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 …

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

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

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

原因&#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处理异常。 此接口定义一个方法&…

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

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

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

大家都知道&#xff0c;苹果手机在更新几个大版本后&#xff0c;手机不是变得非常卡&#xff0c;就是非常的耗电&#xff0c;大大的缩短了手机的使用寿命。所以&#xff0c;许多人都不会选择更新系统&#xff0c;但是手机只要连上WiFi并且在充电状态&#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; 虚拟代理–设想一种…

使用inetaddress测试目标可达性_PDPS软件机器人虚拟仿真:Smart Place功能介绍与使用方法...

概述对于机器人工作站或生产线的虚拟仿真&#xff0c;很大一部分的作用是找出机器人与工装夹具等外围设备的最佳布局位置。市面上大多数的工业机器人虚拟仿真软件都有这种专门用于检测机器人与外围设备之间最佳布局位置的功能&#xff0c;比如DELMIA软件中的“Auto Place”功能…

angular js 使用pdf.js_排名靠前的几个JS框架发展趋势和前景

转载自&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。原文出处&#xff1a;https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02随着信息技术领域的发展&#xff0c;企业…

debian dhcp服务启动不了_DHCP服务器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于动态配置工作站网络接口&#xff0c;使工作站的网络接口管理自动化。DHCP服务器软件dhcpd网站&#xff1a;http://www.isc.org安装方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

C++map类型 之 简单介绍

一&#xff1a;map的前世今生&#xff08;1&#xff09;从关联容器与顺序容器说起。关联容器通过键&#xff08;key&#xff09;存储和读取元素。而顺序容器则通过元素在容器中的位置顺序存储和訪问元素&#xff08;vector,queue,stack,list等&#xff09;。关联容器&#xff0…

MySql Socket 完成数据库的增查Demo

需求: 利用MySql数据库结合前端技术完成用户的注册(要求不使用Web服务技术),所以 Demo采用Socket技术实现Web通信. 第一部分:数据库创建 数据库采用mysql 5.7.18, 数据库名称为MyUser, 内部有一张表 user.字段有 Id,UserName,Psd,Tel 第二部分:数据库连接与Socket通信 创建控…

苹果桌面主题_看腻了手机自带的桌面主题,试试这个

在这个看脸的时代&#xff0c;颜值似乎越来越重要了。尤其是我们每天都要看到的手机桌面&#xff0c;如果它的颜值好一点&#xff0c;也许我们的心情会更好&#xff0c;所以有不少人都用手机自带的主题来美化桌面&#xff0c;但是对于喜欢个性的我们&#xff0c;手机自带的主题…

Java SE 11:推动Java向前发展

介绍 在我看来&#xff0c;这篇文章提出了Java语言应该如何发展以保持其作为首选语言的地位。 它还提供了一些我喜欢但有时&#xff08;可能永远不会&#xff09;成为Java一部分的功能&#xff0c;由于我将要解释的某些原因&#xff0c;这些功能有时我已经爱上了。 我真的很想…

Hexo使用细节及各种问题

解决markdown图片不显示(返回403 forbidden)、添加本地图片无法显示、修改文章page模板、同时部署发布同步到多个仓库站点(Github、coding、gitee 码云) 图片不显示 在使用过程中&#xff0c;会发现有的引用图片无法显示的问题。但是如果直接复制图片地址到浏览器打开的话显示…

智能小车37:异常在ARM、JAVA、硬件里的实现

几乎所有编程语言都有异常&#xff0c;可以说有程序就有异常。今天学习Arm的中断(异常)处理,联想到Java的异常,硬件中如何实现等问题&#xff0c;下面给大家分享一下。 一、Arm的中断。 1.触发异常 2.保存现场 3.cpu进入异常工作模式&#xff0c;程序指针(pc)跳入异常入口&…

c++builder提高批量动态创建panel的速度_骑行时影响速度的事项有哪些 怎样有效提高骑行速度 单车租赁信息...

撇开人的因素在自行车的组件中对车速影响最大的几项是什么?车重?自锁?轮组?传动?我的个人感受&#xff0c;从提高幅度上来讲&#xff0c;而不是重要性上来讲一、自锁起码提高你50%的速度&#xff0c;我不用自锁和别人一起走AVS25就很辛苦了&#xff0c;用了自锁&#xff0…

哈希三道题

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意…