sqlmap 的 XML 文件
sqlmap 的 sql 测试语句组成结果如下:
<prefix>+<payload>+<suffix>+<comment>
boundaries.xml
该 xml 文件记录的是 sqlmap 在尝试注入时会使用边界符即用来描述注入点位置和注入点之前语句部分的边界内容。boundaries.xml 通过控制 prefix 和 suffix 的位置和内容来完成边界符的填充。
标签格式
文件中单个 boundary 的基本格式如下:
<boundary>
<level></level>
<clause></clause>
<where></where>
<ptype></ptype>
<prefix></prefix>
<suffix></suffix>
</boundary>
主要由如下几个标签组成:
-
<levle> 表示测试需要发送的请求包数量,由 sqlmap 参数
--level控制:- 1: Always (<100 requests)
- 2: Try a bit harder (100-200 requests)
- 3: Good number of requests (200-500 requests)
- 4: Extensive test (500-1000 requests)
- 5: You have plenty of time (>1000 requests)
-
<clause> 表示可注入点所在的 sql 查询的子句位置:
- 0: Always
- 1: WHERE / HAVING
- 2: GROUP BY
- 3: ORDER BY
- 4: LIMIT
- 5: OFFSET
- 6: TOP
- 7: Table name
- 8: Column name
- 9: Pre-WHERE (non-query)
SELECT DISTINCT < select_list > FROM < left_table > < join_type > JOIN < right_table > ON < join_condition > WHERE < where_condition > GROUP BY < group_by_list > HAVING < having_condition > ORDER BY < order_by_condition > LIMIT < limit_number > -
<where> 于 payloads 目录下 xml 文件中的 where 标签,表示 payload 要放置的位置:
- 1:将注入 payload 添加到注入参数的原始数值前。
- 2:将注入参数的原始数值替换为一个负随机值并在这之后添加注入 payload。
- 3:用 payload 替换掉注入参数的原始数值。
-
<ptype>表示参数的注入边界类型:
- 1: Unescaped numeric
- 2: Single quoted string
- 3: LIKE single quoted string
- 4: Double quoted string
- 5: LIKE double quoted string
- 6: Identifier (e.g. column name)
-
<prefix>和<suffox>非常简单,即用于添加在 payload 前或者后的边界符。
- prefix: A string to prepend to the payload.
- suffix: A string to append to the payload.
boundary 分类
sqlmap 使用的 boundaries 位于 boundaries.xml 中。sqlmap 根据注入的点的不同位置位置分为了几大类:
Generic boundaries,通用的边界符:),'),",'WHERE/HAVING clause boundaries,注入点位于在 WHERE/HAVING 子句中时,使用的边界符。多为'/"+)* n 为主,比较奇怪的有%<boundary> <level>2</level> <clause>1</clause> <where>1,2</where> <ptype>3</ptype> <prefix>%'</prefix> <suffix> AND '[RANDSTR]%'='[RANDSTR]</suffix> </boundary>Pre-WHERE generic boundaries,注入点在 WHERE 子句前时,使用的边界符(手动补充 WHERE 并且对后面的 WHERE 进行注释),例如:# Pre-WHERE generic boundaries "UPDATE table SET '$_REQUEST["name"]' WHERE id=1" or "INSERT INTO table VALUES('$_REQUEST["value"]') WHERE id=1)"Pre-WHERE derived table boundaries,注入点在 WHERE 子句前,并且需要创建虚拟表的时,使用的边界符,例如:# Pre-WHERE derived table boundaries "SELECT * FROM (SELECT column FROM table WHERE column LIKE '%$_REQUEST["name"]%') AS t1"Escaped column name,注入点位于列名(colnum)处时的边界符。# Escaped column name "SELECT `...` FROM table"AGAINST boolean full-text search boundaries,mysql 的新特征Boolean Full-Text Searches"SELECT * FROM articles WHERE MATCH (title,body) -> AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);"
payloads.xml
sqlmap 使用的 payloads 位于 payloads\*.xml 中,根据不同类型的 sql 注入,分为了多个xml文件:
- 布尔注入 (boolean_blind.)
- 报错注入 (error_based)
- 内联查询 (inline_query)
- 堆查询 (stacked_queries)
- 延时注入 (time_blind)
- 联合查询(union)
标签格式
不同的 payload xml 文件中的标签格式是相同,基本格式如下:
<test>
<title></title>
<stype></stype>
<level></level>
<risk></risk>
<clause></clause>
<where></where>
<vector></vector>
<request>
<payload></payload>
<comment></comment>
<char></char>
<columns></columns>
</request>
<response>
<comparison></comparison>
<grep></grep>
<time></time>
<union></union>
</response>
<details>
<dbms></dbms>
<dbms_version></dbms_version>
<os></os>
</details>
</test>
![![Security/Web/SQL注入/Sqlmap/sqlmap_自问自答/#^Table1]]
- <title>: payload 类型描述
- <stype>: 表示不同的 sql 注入类型
Valid values: 1: Boolean-based blind SQL injection 2: Error-based queries SQL injection 3: Inline queries SQL injection 4: Stacked queries SQL injection 5: Time-based blind SQL injection 6: UNION query SQL injection - <level>: 同 boundaries的level等级,表示需要发送的请求包数量
- <risk>: 类似 level 标签类型,由 sqlmap 的
--risk控制,见 sqlmap 的 level 和 risk 等级定义#sqlmap 中 risk 等级定义 - <clause>: 同 boundaries的clause定义,表示注入点的位置。
- <vector>: 该处存放的是利用 payload 格式(包含
[INFERENCE]字段),例如:<vector>AND [RANDNUM]=(SELECT (CASE WHEN ([INFERENCE]) THEN [RANDNUM] ELSE (SELECT [RANDNUM1] UNION SELECT [RANDNUM2]) END))</vector> - <request>:该处存放的是测试时的 payload,同<vector>不同的时不包含
[INFERENCE]字段,如下。并且该字段还包含了一些子标签:<request> <payload>AND [RANDNUM]=(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN [RANDNUM] ELSE (SELECT [RANDNUM1] UNION SELECT [RANDNUM2]) END))</payload> <comment>[GENERIC_SQL_COMMENT]</comment> </request>- <payload>:测试 payload
- <comment>: 注释
- <char>: 只出现在 union 注入的 payload 中,表示尝试爆破列名的时的列类型(
[CHAR],][RANDNUM],NULL) - <columns>: 通用表示 union 注入时尝试的列数。
- <response>:该字段时用于检测 sql 注入是否成功的字段,主要由如下几种不同的判断方式:
- <comparison>: 两个请求的页面相似度判断,用于布尔盲注。该子标签中也记录的是 payload 信息,但是与<request>中的略有区别,例如会替换
[RANDNUM]为另外一个[RANDNUM1],通过两个请求来判断页面的相似度是否不同。<response> <comparison>AND [RANDNUM]=(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM1]) THEN [RANDNUM] ELSE (SELECT [RANDNUM1] UNION SELECT [RANDNUM2]) END))</comparison> </response> - <grep>: 该字段通过正则匹配响应包中的内容来判断是否注入成功,用于报错注入。
- <time>: 该字段记录的是等待时间,用于时间盲注。
- <union>:该字段标记时会调用 unionTest 函数进行判断,用于 union 注入。
- <comparison>: 两个请求的页面相似度判断,用于布尔盲注。该子标签中也记录的是 payload 信息,但是与<request>中的略有区别,例如会替换
- <details>:记录受该 payload 的适用性:
- <dbms>和<dbms_version>:该 payload 目标数据库和数据库版本
- <os>:目标操作系统
XML 文件中的特殊符号
[INFERENCE]:[RANDNUM],[RANDNUM1],[RANDNUM2]和[RANDSTR]:[CHAR][COLSTART][DELIMITER_START],[DELIMITER_STOP],[AT_REPLACE],[SPACE_REPLACE],[DOLLAR_REPLACE],[HASH_REPLACE]和[GENERIC_SQL_COMMENT][DELAYED],[SLEEPTIME]