请选择 进入手机版 | 继续访问电脑版

落羽黑客论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 263|回复: 5

sqlmap开源渗透测试工具简要教程系列【8】

[复制链接]

66

主题

68

帖子

226

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
226
发表于 2021-2-10 10:59:26 | 显示全部楼层 |阅读模式
  1. 绕过反CSRF保护
  2. 选项:--csrf-token和--csrf-url

  3. 许多站点都以令牌,每个页面响应期间随机设置的隐藏字段值的形式结合了反CSRF保护。SqlMap的会自动尝试识别并绕过这种保护,但也有选项--csrf-token,并--csrf-url可以用来进一步微调它。选项--csrf-token可用于设置包含随机标记的隐藏值的名称。在网站为此类字段使用非标准名称的情况下,这很有用。选项--csrf-url可用于从任意URL地址检索令牌值。如果易受攻击的目标URL首先不包含必需的令牌值,但需要从其他位置提取该令牌值,则此功能很有用。

  4. 强制使用SSL / HTTPS
  5. 开关: --force-ssl

  6. 如果用户想要向目标强制使用SSL / HTTPS请求,则可以使用此开关。在使用option收集URL--crawl或为option提供Burp日志的情况下,这很有用-l。

  7. 在每个请求期间评估自定义python代码
  8. 选项: --eval

  9. 如果用户想更改(或添加新的)参数值(最可能是由于某些已知的依赖关系),则他可以向sqlmap提供带有选项的自定义python代码,--eval该代码将在每次请求之前进行评估。

  10. 例如:

  11. $ python sqlmap.py -u "http://www.target.com/vuln.php?id=1&hash=c4ca4238a0b9238\
  12. 20dcc509a6f75849b" --eval="import hashlib;hash=hashlib.md5(id).hexdigest()"
  13. 这种运行的每个请求都将重新评估GET参数的值,hash以包含一个新的MD5哈希摘要作为parameter的当前值id。

  14. 优化
  15. 这些开关可用于优化sqlmap的性能。

  16. 捆绑优化
  17. 开关: -o

  18. 此开关是一个别名,它隐式设置以下选项和开关:

  19. --keep-alive
  20. --null-connection
  21. --threads=3 如果未设置为更高的值。
  22. 请阅读以下有关每个开关的详细信息。

  23. 输出预测
  24. 开关: --predict-output

  25. 此开关在推理算法中用于对要检索的值的字符进行顺序统计预测。根据给定的项目并txt/common-outputs.txt结合当前使用的枚举知识,构建具有最有希望的字符值的统计表。在可以在公共输出值中找到该值的情况下,随着过程的进行,后续字符表的范围越来越窄。如果与系统表名称和特权一起与常见DBMS实体的检索结合使用,则速度非常重要。当然,例如,如果您注意到数据库表名称或类似名称中的公共模式,则可以根据需要编辑公共输出文件。

  26. 请注意,此开关与--threads开关不兼容。

  27. HTTP保持活动
  28. 开关: --keep-alive

  29. 此开关指示sqlmap使用持久HTTP连接。

  30. 请注意,此开关与--proxy开关不兼容。

  31. HTTP NULL连接
  32. 开关: --null-connection

  33. 有一些特殊的HTTP请求类型,可用于获取HTTP响应的大小而无需获取HTTP正文。这种知识可以在盲目注射技术被用来区分True来自False响应。提供此开关后,sqlmap将尝试测试和利用两种不同的NULL连接技术:Range和HEAD。如果目标Web服务器支持其中任何一种,则可以明显节省已使用的带宽,从而提高速度。

  34. 这些技术在白皮书《SQL盲注入中的性能提升-Take 2(带宽)》中有详细介绍。

  35. 请注意,此开关与switch不兼容--text-only。

  36. 并发HTTP(S)请求
  37. 选项: --threads

  38. 可以指定允许sqlmap执行的并发HTTP(S)请求的最大数量。此功能依赖于多线程概念,并继承了它的优点和缺点。

  39. 此功能适用于蛮力开关以及通过任何一种盲目SQL注入技术完成数据提取的情况。对于后一种情况,sqlmap首先在单线程中计算查询输出的长度,然后启动多线程。每个线程都被分配为检索查询输出的一个字符。检索到该字符后,线程结束-使用sqlmap中实现的二等分算法,最多需要7个HTTP(S)请求。

  40. 出于性能和站点可靠性的原因,并发请求的最大数量设置为10。

  41. 请注意,此选项与switch不兼容--predict-output。

  42. 注射
  43. 这些选项可用于指定要测试的参数,提供自定义注入有效负载和可选的篡改脚本。

  44. 可测试的参数
  45. 选项:-p,--skip和--param-exclude

  46. 默认情况下,sqlmap测试所有GET参数和POST参数。当的值--level> = 2时,它还会测试HTTPCookie标头值。当此值> = 3时,它还会测试SQL注入的HTTPUser-Agent和HTTPReferer标头值。但是,可以手动指定要sqlmap测试的参数的逗号分隔列表。这也将绕过对价值的依赖--level。

  47. 例如,要测试GET参数id和User-Agent仅HTTP ,请提供-p "id,user-agent"。

  48. 如果用户希望从测试中排除某些参数,则可以使用option --skip。当您要使用更高的值--level并测试所有可用参数(通常不测试某些HTTP标头)时,这特别有用。

  49. 例如,跳过测试对于HTTP标头User-Agent和HTTP头Referer在--level=5,提供--skip="user-agent,referer"。

  50. 也有可能基于基于某些参数的名称的正则表达式从测试中排除某些参数。在这种情况下,用户可以使用option --param-exclude。

  51. 例如,要跳过对包含字符串token或其session名称的参数的测试,请提供--param-exclude="token|session"。

  52. URI注入点
  53. 在特殊情况下,注入点位于URI本身内。除非手动指出,否则sqlmap不会对URI路径执行任何自动测试。您必须在命令行中通过在希望sqlmap测试和利用SQL注入的每个URI点后附加一个星号(*)(注意:%INJECT HERE%还支持Havij样式)来指定这些注入点。

  54. 例如,当使用Apache Web服务器的mod_rewrite模块或其他类似技术时,此功能特别有用。

  55. 有效命令行的示例为:

  56. $ python sqlmap.py -u "http://targeturl/param1/value1*/param2/value2/"
  57. 任意注入点
  58. 与URI注入点类似,星号(*)(注意:%INJECT HERE%还支持Havij样式)也可以用来指向GET,POST或HTTP标头中的任意注入点。注射点可以通过标记它的GET参数值内(一个或多个)提供有选项来指定-u,POST参数值(一个或多个)提供选项--data,HTTP标头中提供的选项值(S) ,-H,,和/或,或在通用处内部HTTP请求从文件中加载,带有选项。--headers--user-agent--referer--cookie-r

  59. 有效命令行的示例为:

  60. $ python sqlmap.py -u "http://targeturl" --cookie="param1=value1*;param2=value2"
  61. 强制DBMS
  62. 选项: --dbms

  63. 默认情况下,sqlmap自动检测Web应用程序的后端数据库管理系统。sqlmap完全支持以下数据库管理系统:

  64. 的MySQL
  65. 甲骨文
  66. PostgreSQL的
  67. Microsoft SQL服务器
  68. Microsoft Access
  69. IBM DB2
  70. SQLite的
  71. 火鸟
  72. Sybase公司
  73. SAP MaxDB
  74. Informix
  75. 玛丽亚数据库
  76. 佩尔科纳
  77. 内存SQL
  78. TiDB
  79. 蟑螂数据库
  80. 数据库
  81. H2
  82. MonetDB
  83. 阿帕奇德比
  84. 亚马逊Redshift
  85. Vertica
  86. 麦科伊
  87. 普雷斯托

  88. MimerSQL
  89. CrateDB
  90. 青梅
  91. 细雨
  92. 阿帕奇点燃
  93. 笨拙的
  94. 系统间缓存
  95. 虹膜
  96. 极限数据库
  97. FrontBase
  98. 如果在识别出SQL注入后sqlmap由于某种原因无法检测到后端DBMS,或者如果您想要避免活动的指纹,则可以自己提供后端DBMS的名称(例如postgresql)。对于MySQL和Microsoft SQL Server分别提供了他们在形式MySQL <version>和Microsoft SQL Server <version> ,其中 <version>是数据库管理系统的有效版本; 例如5.0MySQL和2005Microsoft SQL Server。

  99. 如果--fingerprint与一起提供--dbms,则sqlmap仅会为指定的数据库管理系统执行扩展指纹,请阅读以下内容以获取更多详细信息。

  100. 请注意,此选项不是强制性的,强烈建议仅在绝对确定后端数据库管理系统时使用此选项。如果您不知道,请让sqlmap为您自动为其指纹。

  101. 强制数据库管理系统的操作系统名称
  102. 选项: --os

  103. 默认情况下,当此信息依赖于任何其他提供的开关或选项时,sqlmap会自动检测Web应用程序的后端数据库管理系统基础操作系统。目前,完全支持的操作系统是:

  104. 的Linux
  105. 视窗
  106. 如果您已经知道操作系统名称,则可以强制使用它,这样sqlmap就可以避免这样做。

  107. 请注意,此选项不是强制性的,强烈建议仅在绝对确定有关后端数据库管理系统基础操作系统的情况下使用此选项。如果您不知道它,请让sqlmap自动为您识别它。

  108. 强制使用大数字来使值无效
  109. 开关: --invalid-bignum

  110. 在sqlmap需要使原始参数值(例如id=13)无效的情况下,它使用经典的取反(例如id=-13)。使用此开关,可以强制使用大整数值来实现相同的目标(例如id=99999999)。

  111. 强制使用逻辑运算来使值无效
  112. 开关: --invalid-logical

  113. 在sqlmap需要使原始参数值(例如id=13)无效的情况下,它将使用经典取反(例如id=-13)。通过此开关,可以强制使用布尔运算来实现相同的目标(例如id=13 AND 18=19)。

  114. 强制使用随机字符串来使值无效
  115. 开关: --invalid-string

  116. 在sqlmap需要使原始参数值(例如id=13)无效的情况下,它使用经典的取反(例如id=-13)。通过此开关,可以强制使用随机字符串来实现相同的目标(例如id=akewmc)。

  117. 关闭有效载荷投放机制
  118. 开关: --no-cast

  119. 检索结果时,sqlmap使用一种机制,将所有条目都强制转换为字符串类型,并在出现NULL值的情况下将其替换为空格字符。这样做是为了防止出现任何错误状态(例如,NULL值与字符串值的连接)并简化数据检索过程本身。但是,在某些情况下(例如,MySQL DBMS的较早版本),由于数据检索本身存在问题(例如None,返回值),因此需要关闭(使用此开关)此机制。

  120. 关闭字符串转义机制
  121. 开关: --no-escape

  122. 在sqlmap需要在有效负载(例如SELECT 'foobar')中使用(单引号分隔)字符串值的情况下,这些值会自动转义(例如SELECT CHAR(102)+CHAR(111)+CHAR(111)+CHAR(98)+CHAR(97)+CHAR(114))。之所以这样做是因为两件事:混淆有效内容,并防止后端服务器上的查询转义机制(例如magic_quotes和/或mysql_real_escape_string)出现潜在问题。用户可以使用此开关将其关闭(例如,以减小有效负载大小)。

  123. 定制注入有效载荷
  124. 选项:--prefix和--suffix

  125. 在某些情况下,仅当用户提供要添加到注入有效负载的特定后缀时,漏洞参数才可利用。当用户已经知道查询语法并想通过直接提供注入有效载荷前缀和后缀来检测和利用SQL注入时,这些选项很方便出现的另一种情况就会出现。

  126. 易受攻击的源代码示例:

  127. $query = "SELECT * FROM users WHERE id=('" . $_GET['id'] . "') LIMIT 0, 1";
  128. 为了检测和利用此SQL注入,您可以让sqlmap在检测阶段为您检测边界(如SQL有效负载前缀和后缀的组合),也可以自行提供。

  129. 例如:

  130. $ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_str_brackets.php\
  131. ?id=1" -p id --prefix "')" --suffix "AND ('abc'='abc"
  132. [...]
  133. 这将导致所有sqlmap请求最终以如下查询结束:

  134. $query = "SELECT * FROM users WHERE id=('1') <PAYLOAD> AND ('abc'='abc') LIMIT 0, 1";
  135. 这使得查询在语法上正确。

  136. 在这个简单的示例中,sqlmap可以检测SQL注入并加以利用,而无需提供自定义边界,但是有时在实际应用中,当注入点位于嵌套JOIN查询中时,有必要提供它。

  137. 篡改注入数据
  138. 选项: --tamper

  139. sqlmap本身不会混淆发送的有效负载,只是单引号之间的字符串被它们的CHAR()-alike表示代替。

  140. 在您和后端数据库管理系统之间的输入验证机制较弱的情况下,此选项可能非常有用且功能强大。此机制通常是由应用程序源代码,昂贵的企业级IPS设备或Web应用程序防火墙(WAF)调用的自行开发的输入验证例程。所有用于定义相同概念的流行语,通常以不同的方式实现且花费大量资金。

  141. 要利用此选项,请为sqlmap提供以逗号分隔的篡改脚本列表,这将处理有效负载并将其转换为有效负载。您可以定义自己的篡改脚本,在tamper/文件夹中使用sqlmap脚本,也可以对其进行编辑,只要将它们以逗号分隔作为选项值即可--tamper(例如--tamper="between,randomcase")。

  142. 有效的篡改脚本的格式如下:

  143. # Needed imports
  144. from lib.core.enums import PRIORITY

  145. # Define which is the order of application of tamper scripts against
  146. # the payload
  147. __priority__ = PRIORITY.NORMAL

  148. def tamper(payload):
  149.     '''
  150.     Description of your tamper script
  151.     '''

  152.     retVal = payload

  153.     # your code to tamper the original payload

  154.     # return the tampered payload
  155.     return retVal
  156. 您可以在tamper/目录中检查有效且可用的篡改脚本。

  157. 假设禁止>字符,空格和大写SELECT字符串的MySQL目标示例:

  158. $ python sqlmap.py -u "http://192.168.136.131/sqlmap/mysql/get_int.php?id=1" --\
  159. tamper tamper/between.py,tamper/randomcase.py,tamper/space2comment.py -v 3

  160. [hh:mm:03] [DEBUG] cleaning up configuration parameters
  161. [hh:mm:03] [INFO] loading tamper script 'between'
  162. [hh:mm:03] [INFO] loading tamper script 'randomcase'
  163. [hh:mm:03] [INFO] loading tamper script 'space2comment'
  164. [...]
  165. [hh:mm:04] [INFO] testing 'AND boolean-based blind - WHERE or HAVING clause'
  166. [hh:mm:04] [PAYLOAD] 1)/**/And/**/1369=7706/**/And/**/(4092=4092
  167. [hh:mm:04] [PAYLOAD] 1)/**/AND/**/9267=9267/**/AND/**/(4057=4057
  168. [hh:mm:04] [PAYLOAD] 1/**/AnD/**/950=7041
  169. [...]
  170. [hh:mm:04] [INFO] testing 'MySQL >= 5.0 AND error-based - WHERE or HAVING clause
  171. '
  172. [hh:mm:04] [PAYLOAD] 1/**/anD/**/(SELeCt/**/9921/**/fROm(SELeCt/**/counT(*),CONC
  173. AT(cHar(58,117,113,107,58),(SELeCt/**/(case/**/whEN/**/(9921=9921)/**/THeN/**/1/
  174. **/elsE/**/0/**/ENd)),cHar(58,106,104,104,58),FLOOR(RanD(0)*2))x/**/fROm/**/info
  175. rmation_schema.tables/**/group/**/bY/**/x)a)
  176. [hh:mm:04] [INFO] GET parameter 'id' is 'MySQL >= 5.0 AND error-based - WHERE or
  177. HAVING clause' injectable
  178. [...]
  179. 侦测
  180. 这些选项可用于自定义检测阶段。

  181. 水平
  182. 选项: --level

  183. 此选项需要一个参数,该参数指定要执行的测试级别。有五个级别。默认值是1,其中执行有限数量的测试(请求)。反之亦然,级别5将详细测试大量有效负载和边界(如在SQL有效负载前缀和后缀对中)。sqlmap使用的有效负载在文本文件中指定xml/payloads.xml。按照文件顶部的说明进行操作,如果sqlmap错过了一次注入,您也应该可以添加自己的有效负载进行测试!

  184. 此选项不仅会影响尝试使用哪些有效负载sqlmap,还会影响检查中采用的注入点:始终测试GET和POST参数,从2级测试HTTP cookie头值,并从2级测试HTTP User-Agent / Referer头的值3级。

  185. 总而言之,检测SQL注入越难,则--level必须设置的越高。

  186. 强烈建议在向邮件列表报告sqlmap无法检测到某个注入点之前提高此值。

  187. 风险
  188. 选项: --risk

  189. 此选项需要一个参数,该参数指定执行测试的风险。存在三个风险值。默认值为1,对于大多数SQL注入点而言,该值是无害的。风险值2将基于重查询时间的SQL注入的测试添加到默认级别,值3也添加OR基于SQL注入的测试。

  190. 在某些情况下,例如在UPDATE语句中进行SQL注入,注入OR基于有效负载的数据可能导致表中所有条目的更新,这肯定不是攻击者想要的。由于这个原因和其他原因,引入了该选项:用户可以控制要测试哪些有效负载,用户可以任意选择使用也可能具有危险的负载。按照前面的选项,sqlmap使用的有效负载在文本文件中指定xml/payloads.xml,您可以自由编辑和添加自己的有效负载。

  191. 页面比较
  192. 选项:--string,--not-string,--regexp和--code

  193. 默认情况下,通过将注入的请求页面内容与原始未注入的页面内容进行比较,将True查询与一个查询区False分开(基于布尔的盲SQL注入漏洞的粗略概念)。这个概念并非总是可行,因为有时页面内容在每次刷新时都会更改,甚至不注入任何内容,例如,当页面具有计数器,动态广告横幅或动态呈现的HTML的任何其他部分时,不仅可能随时间变化结果是用户的输入。为了绕过此限制,sqlmap会努力识别响应正文的这些摘要并进行相应处理。有时可能会失败,这就是为什么用户可以提供一个字符串(--string选项),该字符串应可以出现在原始页面上(尽管不是必需的),也可以出现在所有True注入的查询页面上,但不能出现在False页面上。用户可以提供正则表达式(--regexp选项)来代替静态字符串。或者,用户可以提供一个字符串(--not-string选项),该字符串不出现在原始页面上,也不在所有True注入查询页面上,而是始终出现在False页面上。

  194. 这样的数据对于用户来说很容易检索,只需尝试将无效值注入到受影响的参数中,然后手动将原始(未注入)页面内容与注入的错误页面内容进行比较。这样,区分将基于字符串存在或正则表达式匹配。

  195. 在情况下,当用户知道一个的区别True查询从False一个可以使用HTTP代码(例如要做200的True和401为False),他可以提供这些信息的SqlMap(例如--code=200)。

  196. 开关:--text-only和--titles

  197. 如果用户知道可以使用HTML标题(例如for和for )来区分True查询与查询,False则可以使用switch启用基于标题的比较。WelcomeTrueForbiddenFalse--titles

  198. 如果HTTP响应的正文中包含大量活动内容(例如脚本,嵌入等),则可以--text-only仅针对其文本内容过滤页面(switch )。这样,在很多情况下,您可以自动调整检测引擎。
复制代码


回复

使用道具 举报

0

主题

1

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2021-2-10 10:59:44 | 显示全部楼层
转发了!!
回复

使用道具 举报

0

主题

1

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2021-2-10 11:00:04 | 显示全部楼层
非常好!!
回复

使用道具 举报

0

主题

6

帖子

32

积分

新手上路

Rank: 1

积分
32
发表于 2021-2-10 11:00:20 | 显示全部楼层
你历害!!
回复

使用道具 举报

0

主题

2

帖子

40

积分

新手上路

Rank: 1

积分
40
发表于 2021-2-10 11:00:34 | 显示全部楼层
不错!!
回复

使用道具 举报

0

主题

2

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2021-2-10 11:00:51 | 显示全部楼层
支持!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|落羽黑客论坛

GMT+8, 2021-6-16 22:58 , Processed in 0.046493 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表