当前位置:文档之家› 中山大学实验3-SQL注入攻击实验

中山大学实验3-SQL注入攻击实验

1.实验报告如有雷同,雷同各方当次实验成绩均以0分计。

2.当次小组成员成绩只计学号、姓名登录在下表中的。

警示3.在规定时间内未上交实验报告的,不得以其他方式补交,当次成绩按0分计。

4.实验报告文件以PDF格式提交。

院系班级组长学号学生实验分工SQL注入攻击实验【实验目的】了解SQL注入攻击的过程。

通过SQL注入攻击,掌握网站的工作机制,认识到SQL注入攻击的危害,加强对Web攻击的防范。

禁止恶意入侵,不可对他人网站造成不良影响。

建议自行搭建简易网站进行实验。

【实验原理】结构化查询语言SQL是一种用来和数据库交互的文本语言,SQL注入就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。

它的产生主要是由于程序对用户输入的数据没有进行细致的过滤,导致非法数据的导入查询。

在下面的攻击实验中,需要用到wed.exe和wis.exe两个命令行工具(从网络上下载),其中wis.exe 用于扫描某个站点中是否存在SQL注入漏洞;wed.exe是用于破解SQL注入用户名和密码。

将两个工具结合起来,就可以体验从寻找注入点到注入攻击完成的整个过程。

【实验过程】(给出实验使用的真实网址,测试需要贴出适当的截图)(1)判断环境,寻找注入点使用wis.exe寻找注入漏洞,其使用格式:wis 网址例如,检测某个网址/,首先进入命令提示窗口,然后输入命令:wis /命令输入结束后,单击回车键,即可开始扫描。

注意命令格式,在输入网址时,网址需放在http://和/之间,否则扫描无法进行。

你找到有SQL注入漏洞的网站是:(2)查看SQL注入攻击漏洞扫描结束后,可以看到网站上有否存在SQL注入攻击漏洞。

漏洞信息一般以红色字体显示,以“SQL Injection Format”开头的那些行。

假设扫描后其中某行如下:SQL Injection Format:/xygk.asp?typeid=34&bigclassid=98这是特征明显的数据库查询语句,可以选择其来做破解用户名和密码实验。

如果要将其网页打开,可在浏览器地址栏中输入完整网址/xygk. asp?typeid=34&bigclassid=98。

你的扫描结果是:/rjz/sort.asp?classid=1/dyz/sort.asp?classid=1/dyz/list.asp?id=2705其中的漏洞信息是:在地址栏中输入“/rjz/sort.asp?classid=1”,打开了网站页面,是一个下载网页。

(3)SQL注入破解管理员账号使用wed.exe破解管理员账号,其使用格式:wed 网址进入命令提示窗口,输入命令:wed /xygk.asp?typeid=34&bigclassid=98asp?回车后查看运行情况。

注意输入网址时,最后面不要加上符号/,但前面的的http://不可缺。

该程序在运行时,使用了用来破解用户数据库中的字表名、用户名和用户密码所需的字典文件。

如TableName.dic、UserField.dic和PassField.dic。

在破解过程中还可以看到“SQL Injection Detected.”的字符串字样,表示程序还会对需要注入破解的网站进行检测,以确定是否存在SQL注入漏洞,成功后才开始猜测用户名。

如果检测成功,很快就获得了数据库表名,例如是“admin”;然后得到用户表名和字长,例如为“username”和“6”;再检测到密码表名和字长,例如为“password”和“8”。

系统继续执行,wed.exe程序开始用户名和密码的破解,最终获得了用户名和密码。

你的破解结果是:获得了数据库表名“admin”,然后得到用户表名和字长,为“username”和“6”;再检测到密码表名和字长,为“password”和“8”随后得到了用户名和密码了——“admina”、“pbk&7*8r”如果不通破解,说明原因是:输入网址时,最后面加上了那个“/”,或者前面的“http://”头也少了。

(4)搜索隐藏的管理登录页面重新回到(1)打开的网站页面中,用已经检测到的管理员的帐号和密码,进入管理登录页面,但当前的页面中还没有管理员的入口链接。

再次使用wis.exe程序,该程序除了可以扫描出网站中存在的所有SQL注入点外,还可以找到隐藏的管理员登录页面。

在命令行窗口中输入:wis /xygk.asp?typeid=34&bigclassid=98/a注意行末输入了一个参数“/a”。

如果出现扫描不成功,可以认为管理员登录页面只可能隐藏在整个网站的某个路径下。

于是输入“wis /a”,对整个网站的登录页面进行扫描。

注意扫描语句中网址的格式。

在扫描过程中,如找到的隐藏登录页面会在屏幕上以红色字体进行显示。

扫描结束后,结果以列表形式显示在命令窗口中。

一般可以看到列表中有多个以“/rsc/”开头的管理员登录页面网址,例如“/rsc/gl/manage.asp”、“/rsc/gl/login.asp” 、“/rsc/gl/admin1.asp” 等。

任意选择一个网址,比如在浏览器中输入网址“/ rsc/gl/admin1.asp”,就会出现本来隐藏着的管理员登录页面。

输入用户名和密码,就可以进入到后台管理系统。

你搜索隐藏到的管理登录页面是:/rjz/gl/admin1.asp如果搜索不到,说明原因是:当前在扫描注入点,肯定就不能成功了,管理员登录页面只可能隐藏在整个网站的某个路径下。

所以可以输入“wis.exe / /a”,对整个网站进行扫描。

注意扫描语句中网址的格式。

程序开始对网站中的登录页面进行扫描,在扫描过程中,找到的隐藏登录页面会在屏幕上以红色进行显示。

很快就查找完了,在最后以列表显示在命令窗口中。

可以看到列表中有多个以“/rjz/”开头的登录页面网址,包括“/rjz/gl/manage.asp”、“/rjz/gl/login.asp”、“/rjz/gl/admin1.asp”等。

【实验思考】防御SQL注入攻击的有效方法如下:1、普通用户与系统管理员用户的权限要有严格的区分。

如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。

在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。

那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。

故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。

如此可以最大限度的减少注入式攻击对数据库带来的危害。

2、强迫使用参数化语句。

如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。

而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。

也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。

与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。

参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。

采用这种措施,可以杜绝大部分的SQL注入式攻击。

不过可惜的是,现在支持参数化语句的数据库引擎并不多。

不过数据库工程师在开发产品的时候要尽量采用参数化语句。

3、加强对用户输入的验证。

总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。

在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。

测试字符串变量的内容,只接受所需的值。

拒绝包含二进制数据、转义序列和注释字符的输入内容。

这有助于防止脚本注入,防止某些缓冲区溢出攻击。

测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。

这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。

如可以使用存储过程来验证用户的输入。

利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。

如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。

在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。

在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。

如分号分隔符,它是SQL注入式攻击的主要帮凶。

如注释分隔符。

注释只有在数据设计的时候用的到。

一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。

把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。

故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。

这是防止SQL注入式攻击的常见并且行之有效的措施。

4、多多使用SQL Server数据库自带的安全参数。

为了减少注入式攻击对于SQL Server数据库的不良影响,在SQLServer数据库专门设计了相对安全的SQL参数。

在数据库设计过程中,工程师要尽量采用这些参数来杜绝恶意的SQL注入式攻击。

如在SQL Server数据库中提供了Parameters集合。

这个集合提供了类型检查和长度验证的功能。

如果管理员采用了Parameters这个集合的话,则用户输入的内容将被视为字符值而不是可执行代码。

即使用户输入的内容中含有可执行代码,则数据库也会过滤掉。

因为此时数据库只把它当作普通的字符来处理。

使用Parameters集合的另外一个优点是可以强制执行类型和长度检查,范围以外的值将触发异常。

如果用户输入的值不符合指定的类型与长度约束,就会发生异常,并报告给管理员。

如上面这个案例中,如果员工编号定义的数据类型为字符串型,长度为10个字符。

而用户输入的内容虽然也是字符类型的数据,但是其长度达到了20个字符。

则此时就会引发异常,因为用户输入的内容长度超过了数据库字段长度的限制。

5、多层环境如何防治SQL注入式攻击?在多层应用环境中,用户输入的所有数据都应该在验证之后才能被允许进入到可信区域。

未通过验证过程的数据应被数据库拒绝,并向上一层返回一个错误信息。

实现多层验证。

对无目的的恶意用户采取的预防措施,对坚定的攻击者可能无效。

更好的做法是在用户界面和所有跨信任边界的后续点上验证输入。

如在客户端应用程序中验证数据可以防止简单的脚本注入。

但是,如果下一层认为其输入已通过验证,则任何可以绕过客户端的恶意用户就可以不受限制地访问系统。

故对于多层应用环境,在防止注入式攻击的时候,需要各层一起努力,在客户端与数据库端都要采用相应的措施来防治SQL语句的注入式攻击。

相关主题