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

发布时间 - 2023-05-12 00:00:00    点击率:

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塞入了sleep的注入payload:

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

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


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

3. 深入分析一下源码

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

sqlmap/lib/controller/checks.py:


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

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

sqlmap/xml/payloads/time_blind.xml:


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

4. 闭合

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

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

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:

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

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

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


# 可以看到  # 时间为  # 两次  # 我该  # 报错  # 值为  # 大佬  # 的是  # 标准差  # 在这里 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Windows虚拟主机上快速搭建网站?  PHP正则匹配日期和时间(时间戳转换)的实例代码  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  七夕网站制作视频,七夕大促活动怎么报名?  Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Android okhttputils现在进度显示实例代码  Laravel storage目录权限问题_Laravel文件写入权限设置  如何在万网利用已有域名快速建站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Thinkphp 中 distinct 的用法解析  企业网站制作这些问题要关注  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何在Windows服务器上快速搭建网站?  *服务器网站为何频现安全漏洞?  Laravel如何配置任务调度?(Cron Job示例)  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  在Oracle关闭情况下如何修改spfile的参数  Android实现代码画虚线边框背景效果  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Python文件流缓冲机制_IO性能解析【教程】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何快速搭建高效香港服务器网站?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  Laravel如何实现API资源集合?(Resource Collection教程)  中国移动官方网站首页入口 中国移动官网网页登录  详解jQuery停止动画——stop()方法的使用  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  网站制作壁纸教程视频,电脑壁纸网站?  详解Android——蓝牙技术 带你实现终端间数据传输  Laravel如何使用查询构建器?(Query Builder高级用法)  如何快速启动建站代理加盟业务?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  清除minerd进程的简单方法  如何快速搭建虚拟主机网站?新手必看指南  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel如何自定义分页视图?(Pagination示例)  如何快速配置高效服务器建站软件?  js代码实现下拉菜单【推荐】  Python文件操作最佳实践_稳定性说明【指导】  利用 Google AI 进行 YouTube 视频 SEO 描述优化