SQL注入攻击实验
【实验要求】
1)Sql注入攻击的实现与防御,其中防御模块为可选作部分。
2)要求:提交源代码和可执行文件,提供用户使用文档和实验报告文档(包括开发环境、运行主要截图、实验收获等说明)。
【实验原理】
1、结构化查询语言(SQL)是一种用来和数据库交互的文本语言,SQL Injection就是利用某
些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询。
2、SQL注入攻击主要是通过构建特殊的输入,这些输入往往是SQL语法中的一些组合,
这些输入将作为参数传入Web应用程序,通过执行SQL语句而执行入侵者的想要的操作,一般想要攻击成功,需要做到以下三点:
1)确定Web应用程序所使用的技术:注射式攻击对程序设计语言或者硬件关系密切,但是这些可以通过适当的踩点或者索性将所有常见的注射式攻击都搬出来逐个试一
下就知道了。为了确定所采用的技术,攻击者可以考察Web页面的页脚,查看错
误页面,检查页面源代码,或者使用诸如Nessus等工具来进行刺探。
2)确定所有可能的输入方式:Web应用的用户输入方式比较多,其中一些用户输入方式是很明显的,如HTML表单;另外,攻击者可以通过隐藏的HTML表单输入、
HTTP头部、cookies、甚至对用户不可见的后端AJAX请求来跟Web应用进行交互。一般来说,所有HTTP的GET和POST都应当作用户输入。为了出一个Web 应用所有可能的用户输入,我们可以求助于Web代理,如Burp等。
3)查可以用于注射的用户输入:在出所有用户输入方式后,就要对这些输入方式进行筛选,出其中可以注入命令的那些输入方式。这个任务好像有点难,但是这
里有一个小窍门,那就是多多留意Web应用的错误页面,很多时候您能从这里得
到意想不到的收获。
3、SQL注入攻击的特点。
4)变种极多:有经验的攻击者会手动调整攻击参数,致使攻击数据的变种是不可枚举的,这导致传统的特征匹配检测方法仅能识别相当少的攻击,难以防范。
5)攻击过程简单:目前互联网上流行众多的SQL注入攻击工具,攻击者借助这些工具
可很快对目标WEB系统实施攻击和破坏。
6)危害大:由于WEB编程语言自身缺陷以及具有安全编程能力的开发人员少之又少,大多数WEB业务系统均具有被SQL注入攻击的可能。而攻击者一旦攻击成功,可以对控制整个WEB业务系统,对数据做任意的修改,破坏力达到及至。
4、SQL注入攻击过程。
1)判断Web环境是否可以SQL注入。如果URL仅是对网页的访问,不存在SQL注
入问题,如:/162414739931.shtml就是普通的网页访问。
只有对数据库进行动态查询的业务才可能存在SQL注入,如:
le/webhp?id=39,其中?id=39表示数据库查询变量,这种语句会在数据库中执行,因此可能会给数据库带来威胁。
2)寻SQL注入点。完成上一步的片断后,就要寻可利用的注入漏洞,通过输入一
些特殊语句,可以根据浏览器返回信息,判断数据库类型,从而构建数据库查询语
句到注入点。
3)猜解用户名和密码。数据库中存放的表名、字段名都是有规律可言的。通过构建特
殊数据库语句在数据库中依次查表名、字段名、用户名和密码的长度,以及内容。
这个过程可以通过网上大量注入工具快速实现,并借助破解网站轻易破译用户密码。
4)寻WEB管理后台入口。通常WEB后台管理的界面不面向普通用户开放,要寻
到后台的登陆路径,可以利用扫描工具快速搜索到可能的登陆地址,依次进行尝试,就可以试出管理台的入口地址。
5)入侵和破坏。成功登陆后台管理后,接下来就可以任意进行破坏行为,如篡改网页、
上传木马、修改、泄漏用户信息等,并进一步入侵数据库服务器。
【实验环境】
操作系统:Windows 7 旗舰版
IDE  :Myeclipse 8.6
服务器:Tomcat 7.0.11
数据库:SQLServer 2005
浏览器:搜狗浏览器3.2.0
【实验过程】
本次的实验过程主要用自己架设的网站进行SQL注入攻击的测试和防御。
1、新建网站SQLInjection项目,新建index.jsp进行SQL注入攻击演示。
这里以index.jsp为登陆界面,用户输入用户名和密码后进行登陆,获取参数后传递给LoginDeal(Servlet)进行处理,再根据处理的结果跳转到不同的页面。
1)页面预览如下:
2)这个页面的处理流程如下:
a)页面提交的用户名和密码通过表单提交,代码为
<form action="loginDeal" method="POST">
<input type="text" name="userName" value="用户名">
<input type="password" name="passwd">
</form>
b)当点击登陆后,即提交表单到loginDeal,在loginDeal里获取到userName
和passwd后调用com.sqlInjection.util.RequestDeal类进行登陆的验证,如果验证成功则跳转到welcom.jsp页面,如果失败则设置相应的提示信息后跳转回index.jsp页面。
c)RequestDeal进行验证的方法为利用userName和passwd两个参数构造查询
语句"select * from users where name='" + userName +"' and passwd='"
+ passwd + "'",查询后返回ResultSet set,如果()为true,则表
示表中存在这样的一个记录,用户合法,所以验证成功。
3)这里用到的数据库为sqlinjection,用到的users表结构为:
安装sql server数据库没到
+------------+-------------+------+-----+---------+-------+
| Field      | Type        | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| name      | varchar(25) | YES  |    | NULL    |      |
| passwd    | varchar(35) | YES  |    | NULL    |      |
| permission | varchar(10) | YES  |    | NULL    |      |
+------------+-------------+------+-----+---------+-------+
其中name为用户名,passwd为密码,permission为等级。
4)正常的话用户输入自己的用户名和密码,如果正确则会跳转到welcome.jsp,如果
失败则会提示错误信息如下:
5)接下来我们进行简单的SQL注入攻击,我们可以通过最常用的‘和-- 来达到我
们的目的,实现任何用户在不知道密码的情况下进行登陆,我们可以通过用户名或者是在密码处进行查询语句的构造,以密码为例,使密码的结构为:
随机密码’ or 1=1 --
这里注意单引号不能丢失,因为密码的验证是字符串,所以在密码后面要补全语法中的单引号,然后加上永真的逻辑语句or 1=1 ,再用-- 注释掉原有语句后面还有的内容(注意-- 后面至少要有一个空格),这样一来,不管输入什么随机密码,只要表中有用户记录,那么查询的结果就一定会为真,也就是说一定能登陆成功。
6)用以上构建的密码尝试进行登陆,以kejack用户为例,用户名为:kejack,密码为:
1234’ or 1=1 -- ,如图(以下所有攻击的字串请手动敲入,复制单引号出错)
点击登陆后我们可以发现登陆成功了(正确的密码应该是kejack)
由此简单地用注入攻击绕过了用户的密码验证,得到了用户kejack的控制权,假设我们用这样的方法登陆admin帐号的话,那么就能得到admin的权限,进行非法的操作了。
7)接下来我们可以尝试通过SQL注入攻击添加一个管理员权限的用户,通过;来进行
SQL语句的批执行添加,这次我们以用户名为例,我们的目的不再是进行登陆,而是在于添加一个用户,所以不再关心登陆结构,构造语句如下:
kejack' ; insert into users values ('hake','hake','admin') --
通过;隔开后我们添加了一个添加用户的SQL语句,再注释掉之后的语句。
8)执行上面的注入语句结果如下:
在做这个多语句插入的过程中尝试了几次都失败,发现执行SQL语句的时候报错了,最开始的时候我用是MYSQL5.5做的实验,查相关的材料才知道原来MYSQL默认是禁用了多语句执行的,在连接的时候要打开多语句执行许可才行,方法为更改jdbc驱动连接语句如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。