SQL注入攻击(回显注入-1)
实验目的
- 学习并掌握SQL回显注入攻击的原理
- 学习并掌握SQL回显注入攻击的过程
实验原理
SQL Injection,即SQL注入,SQLi,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。SQL注入漏洞的危害巨大,常常会导致整个数据库被“脱裤”,如今SQL注入仍是现在最常见的Web漏洞之一。
SQL 注入一般按照注入方式可以分为普通注入和盲注。普通注入就是注入的页面是直接显示数据库中的字段内容的,可以通过 SQL 注入一步一步把数据库中我们想要的内容显示在页面中。而盲注则要困难很多,页面并没有直接显示数据库字段内容,显示的可能只是一个判断结果(是或者否),页面只能告诉你你构造的 SQL 语句对还是错,你要查询的内容存在还是不存在。这种情况下,我们只能全部靠猜。更有甚者,连是否的结果都不显示,我们可能还需要通过返回数据的延迟来判断是否猜对。
实验步骤
1 打开DVWA
在浏览器输入http://127.0.0.1/dvwa,输入用户名admin,密码password。
2 设置DVWA安全级别
打开搭建好的web环境dvwa,首先设置安全级别,点击submit保存。
打开SQL注入页面,如下:
3 SQL注入 low
首先在文本框随便输入一个 ID 号,发现可以返回用户信息。同时发现 URL 中出现了提交的参数信息,说明该页面提交方式为 GET。
结果:
通过上面输出可以基本判断,该sql语句可能为select firstname, subname from table_x where userid = '1'
。因此针对大概语句进行分析。
为了猜测该是否存在sql注入漏洞,可以随意输入,检查是否有错误信息等。由于是实验环境,知道有sql注入漏洞,因此使用1'
来测试输入后返回的结果,如下:
可以看到输入如下错误:
发现页面报错,说明单引号被执行,存在 SQL 注入漏洞(因为'
在SQL语句中是有语义的,让我们输入'
时出错,说明在该SQL语句中并没有将'
视为用户输入的一部分,所以存在着SQL注入漏洞),并从报错信息中得知该站点的数据库为 MySQL。在输入框中输入其他内容,如1 and 1=1
或者 1 and 1=2
,都能返回数据,说明可能注入漏洞不是数字型(如果注入漏洞时数字型的,那么在1 and 1=2
输入中,条件1=2
判断为否,因此查询的东西应该为空,而不会返回结果,而现在能返回结果,只能说明件1=2
是一个字符串,而不是一个数学等式)。
在文本框输入 1' and 1=1#
,可以返回数据(此时sql语句可能为select firstname, subname from table_x where userid = '1' and 1=1#'
,#表示注释#号后的内容),输入 1' and 1=2#
,没有数据返回,说明注入成功,确认漏洞为字符型。
为了进一步判断该数据库中的其他内容,同样可以构造其他sql语句,如在文本框输入1' order by 1#
和 1' order by 2#
,有数据返回,输入 1' order by 3#
,页面报错,说明本页面只查询了 2 个字段,
为了进一步搞清楚该表中的其他内容,可以构造如下语句1' union select 1,2#
,此时完整的sql查询语句可以表示为select firstname, subname from table_x where userid = '1' union select 1, 2#'
,因此此时就可以通过union语句查询到该表内的所有内容.
如果想获取到数据库的名字,同样可以构建1' union select database(),2#
输入,即可查询到数据库的名字,如下:
进一步,1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
,可以查询到所有的表名。
获取列名,1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#
到了这里就剩最后一步,猜测用户密码,直接输入1' union select group_concat(user_id,first_name,last_name,user),group_concat(password) from users#
获取的数据都是哈希值,可以使用之前学过的John the ripper攻击解密。
SQL注入漏洞修复建议
- 对进入数据库的特殊字符(’"\尖括号&*;等)进行转义处理,或编码转换。
- .严格限制变量类型,数据库中的存储字段必须对应为int型。
- 数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。
- 网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。
- 严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。
- 避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。
- 在网站发布之前建议使用一些专业的SQL注入检测工具进行检测,及时修补这些SQL注入漏洞。
- 确认PHP配置文件中的magic_quotes_gpc选项保持开启。