如何实现sqlmap time-based inject的分析

1. 前言

sql注入如何检测的?

我的回答是:在甲方做安全,sql注入检测还是比较好做的。

1) 报错注入检测。

2) 别做bool的报错注入,误报比较高。

3) 做基于time-based的时间注入,联系运维做上慢日志db记录,监控sleep,benchmark的关键字监控,可以在sleep的时间小数点上加上扫描任务的id号,方便定位。(p.s. 这种方法能找到99%的sql注入了)

因此,在做基于time-based的时间注入时,我把时间误差限制的非常苛刻。但是,@chengable在乙方做安全相关工作,基于time-based的时间注入一般是做不了的。据了解,他主要是先过滤存在注入点的情况,再加上sqlmapapi.py检测。早之前我也用sqlmap做过检测,遇到的问题就是误报多、扫描时间久,然后尝试了sqlmapapi.py,问题还是扫描时间过久,而且它不支持json格式的注入(详情)。但是,sqlmap的时间注入还是比较准的,如果不想用sqlmapapi.py怎么办?这里就把sqlmap的time-based注入的逻辑搬出来。

2. 简单分析sqlmap的time-based注入

吐槽一下:sqlmap的代码不规范、难看、量又大。之前有大佬推荐我阅读sqlmap源码,学习一波,现在想想还好我放弃的早。

所以,偷懒不想看源码加上–technique=T -v 3 就先看看sqlmap检测payload。

如何实现sqlmap time-based inject的分析

如何实现sqlmap time-based inject的分析

如何实现sqlmap time-based inject的分析

貌似偷懒还找到了一些门道,从截图中可以看到:

首先,sqlmap塞入了sleep的注入payload:

先是塞入了 sleep(5),发现执行了之后;又塞入sleep(0),最后又塞入sleep(5)。

然后猜测一下,大概的检查思路就是先sleep(5),秒延时成功的话,再sleep(0)。如果没有发现延时现象,继续sleep(5),此时如果再次延时成功,就出现认为可能有注入的提醒:

如何实现sqlmap time-based inject的分析

最后,很巧妙的是,sqlmap为了防止出现误报使用了if 的判断条件来排除误报,从上图可以看到sqlmap分别让等式成立测试两次,又让等式不成立测试两次,根据秒延时情况来判断误报。

3. 深入分析一下源码

回归源码看看:根据前面的一些关键字,我们直接到代码里面去看看。比如搜索之前出现*appears to be* 看到名列前茅步的代码:

sqlmap/lib/controller/checks.py:

如何实现sqlmap time-based inject的分析

这里发现,和前面猜测的八九不离十。

再找一下payload在哪里,特别是if条件的payload,还是用关键字查询,发现在这里:

sqlmap/xml/payloads/time_blind.xml:

如何实现sqlmap time-based inject的分析

可以看到每个if条件的payload都在vector这个字段中。

4. 闭合

闭合注入点前面的字符是能否注入的关键。

观察到 tools/sqlmap/xml/boundaries.xml,所以,我们还需要参考这里面的多种闭合情况:

如何实现sqlmap time-based inject的分析

5. 判断是否延时

5.1 方法一

参考之前awvs的注入,我想到一个比较容易理解的检测方法。取6次无注入payload正常测试的消耗时间,计算平均值为原生请求时间(ori_time)。

当注入时间为sleep(5),将当前时间减去ori_time,作为sleep_time。如果sleep_time小于4,认为延时没有发生。(这里考虑到ori_time 受到网络影响导致变大,所以把阀值调到了四秒)

当注入时间为sleep(0),将当前时间减去ori_time,作为sleep_time。如果sleep_time大于2,说明延时有误报。

5.2 方法二

再看一下sqlmap的代码,人家用了一个我搞不懂的数学问题(详情)

跟进:Request.queryPage —>wasLastResponseDelayed 就可以看到逻辑为:取30次的无注入payload正常测试的消耗时间,将他们放到kb.responseTimes中。计算30次的标准差为deviation,根据deviation计算出一个最慢的响应时间为lowerStdLimit:

如何实现sqlmap time-based inject的分析

它的值为30次的平均值加上TIME_STDEV_COEFF*标准差(deviation),至于TIME_STDEV_COEFF,设置为7可以使得判断的准确度在99.9999999997440%。

最后判断当前这次请求的消耗时间是不是大于lowerStdLimit,大于说明延时发生,小于说明没有(另外,当lowerStdLimit小于0.5秒时候,lowerStdLimit取0.5秒)。

感性告诉我该选方法一,理性告诉我该选方法二。我还是选择方法二,测了一下这个注入点(详情)。很稳定的扫描出了注入漏洞。

关于sqlmap time-based inject 分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

文章标题:如何实现sqlmap time-based inject的分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/28377

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月21日 下午10:58
下一篇 2022年9月21日 下午11:00

相关推荐

  • deepl如何翻译pdf

    deepl翻译pdf的方法 网页版: 1、首先我们进入deepl官网。 2、进来之后,点击“翻译文件” 然后把你要翻译的PDF文件直接拖拽或者上传进来。 3、选择好你的目标语言,等待翻译完成之后点击下载就可以了。 客户端版: 1、打开deepl软件。点击上方的翻译.docx和.pptx文档。 2、点…

    2022年9月26日
    42100
  • windows驱动精灵安装目录无效请重新指定如何解决

    解决方法: 方法一: 很多情况下是因为从U盘上复制来驱动之后,没有及时将U盘拔掉。 应该及时拔下U盘,再次尝试点击安装。 方法二: 如果安装的驱动与你的系统不匹配也会造成这种原因。 尝试重新下载对应的驱动,再次进行安装。 方法三: 1、进入驱动精灵点击右上角三横。 2、在下拉任务中点击“设置”。 3…

    2022年9月10日
    68300
  • java IP归属地功能如何实现

    名列前茅步:如何拿到用户的真实IP 大家都知道,我们一般想访问公网,一般必须具备上网环境,那么我们开通宽带之后,运营商会给我们分配一个IP地址。一般IP地址我们都是自动分配的。所以我们不知道本机地址是什么?想知道自己的ip公网地址,可以通过百度搜索IP查看自己的ip位置 那么问题来了。百度是怎么知道…

    2022年9月6日
    20400
  • Apache Solr velocity模板注入RCE漏洞的示例分析

    0x01简介 Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。 0x02漏洞介绍 Solr中存在Velo…

    2022年9月13日
    28100
  • Web漏洞利用姿势的示例分析

    1、HTTP PUT方法利用 PUT是用来进行文件管理的方法,若运维人员未修改Web服务器缺省配置,依然支持这些方法,则可以向服务器文件系统任意上传文件。 1.1、 Netcat利用PUT方法 Netcat是一款非常出名的网络工具,简称“NC”,有渗透测试中的“瑞士**”之称。它可以用作端口监听、端…

    2022年9月22日
    19800
  • windows中该内存不能为written如何解决

    该内存不能为written解决方法 一、如果能排除硬件上的原因(内存条不兼容,更换内存。显卡驱动是否正确按装或者是否被恶意覆盖否?)往下看: 二、系统或其它软件引起的,可用下述方法处理: 1.系统本身有问题,及时安装官方发行的补丁,必要时重装系统。 2.病毒问题:杀毒。 3.杀毒软件与其它软件冲突:…

    2022年9月2日
    26600
  • laravel是不是后端框架

    laravel是后端开发框架;laravel是一个用于构建web应用程序的跨平台PHP框架,尽管laravel确实提供了一些前端功能,但是Laravel的许多功能与前端无关,Laravel提供了一个功能强大的开发环境,以及直观和富有表现力的命令行界面。 本文操作环境:Windows10系统、Lara…

    2022年9月1日
    22200
  • win7如何清理微信和qq缓存

    win7清理微信和qq缓存的方法 微信清理: 1、打开微信,点击左侧下方三条横杠,打开后点击“设置” 2、 点击“通用设置” 3、点击右侧的“存储空间管理” 4、找到缓存这里,点击对应的管理和清理就可以了。 QQ缓存清理: 1、打开QQ主面板,点击左下方三条杠,点击“设置” 2、点击左边的“文件管理…

    2022年9月24日
    15100
  • Javascript怎样替换数组中的特定值

    替换数组中的特定值 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。该方法会改变原始数组。特别需要注意插入值的位置! // arrayObject.splice(index,howmany,item1,…..,itemX)var plants = [‘Saturn’, ‘…

    2022年8月31日
    37100
  • SQL语句知识点有哪些

    一、SQL简介 SQL (Structured Query Language:结构化查询语言) 是用于管理关系数据库管理系统(RDBMS)。 SQL 的范围包括数据插入、查询、更新和删除,数据库模式创建和修改,以及数据访问控制。 1.什么是数据库 数据库 (DB database) 概念:数据仓库 …

    2022年9月22日
    19700
联系我们
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部