如何实现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塞入了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秒)。
感性告诉我该选方法一,理性告诉我该选方法二。我还是选择方法二,测了一下这个注入点(详情)。很稳定的扫描出了注入漏洞。
以上是如何实现sqlmap time-based inject的分析的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

使用sqlmap对dvwa进行自动化注入设置dvwa级别为low打开dvwa的SQLInjection(SQLInjection(Blind)),打开浏览器调试,输入userid并submit,查看拦截到的请求。可以看到是一条GET请求,url“http://192.168.1.222:8089/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#”我们直接放到salmap测试一下,使用-u命令-u"http://192.168.1.22

0x00概述近日在利用sqlmap注入测试时遇到一个奇怪的现象,高版本sqlmap无法检测出注入,但是低版本的可以测出注入,并且能跑出数据不是误报,经过对比测试和查看sqlmap源码,发现两个小坑。0x01情景重现注入点形式:json……”whereparams”:[{“name”:”keyWord”,”value”:”test”}]}可注入参数:valuesqlmap命令:pythonsqlmap.py-rsqlpk.txt–flush-session-vvsqlmapv1.2.11无法注入s

第一部分:Sqlmap使用1.1sqlmap介绍1.前边说了一些sql注入的基础语句,但是手工注入很麻烦,我们可以借助sqlmap这个强大的sql注入工具,进行数据的获取.2.sqlmap介绍(1)#sqlmap是一种开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库的服务器。它拥有非常强大的检测引擎、具有多种特性的渗透测试器、通过数据库指纹提取访问底层文件系统并通过外带连接执行命令。官方网站:sqlmap.org(2)#支持的数据库:MySQL,Oracle,PostgreS

由于要对外网的网站进行渗透测试,但是大部分网站都有访问频率控制,一旦超过这个频率就直接禁IP。尤其是SQLMAP跑的时候,更是一片“姨妈红”,还没跑完SQLMAP就直接报错退出。于是就开始研究SQLMAP的代理模式,SQLMAP有两种代理模式,一种是普通代理(HTTP代理),一种是洋葱代理。我原本想写一下普通代理的应用,但是百度看到这篇文章已经够详细了,就不再说废话。Sqlmap扩展—外部IP代理池实现还是重点谈谈洋葱代理,一开始直接使用洋葱去做注入时候,没有报“姨妈红”,后来随着渗透的网站的增

1.前言sql注入如何检测的?我的回答是:在甲方做安全,sql注入检测还是比较好做的。1)报错注入检测。2)别做bool的报错注入,误报比较高。3)做基于time-based的时间注入,联系运维做上慢日志db记录,监控sleep,benchmark的关键字监控,可以在sleep的时间小数点上加上扫描任务的id号,方便定位。(p.s.这种方法能找到99%的sql注入了)因此,在做基于time-based的时间注入时,我把时间误差限制的非常苛刻。但是,@chengable在乙方做安全相关工作,基于t

网上针对sqlmap进行dns注入的相关文章太少,只是简单介绍了下--dns-domain参数,相关的实战文章要么就写的模糊或者一笔带过,搞的云里雾里(主要是菜,关键还没大佬带)。然后自己参考网上的方法自己重新搞了一遍。需要准备的东西,sqlmap、windows盲注一个、两个域名、一台外网服务器。某次搞事情的时候碰到一个时间盲注,碰巧是台windows的,想起dns注入的方法。在开始前我准备先用sqlmap的--sql-shell命令进行dns注入payload的测试先到burpsuite中的

我对公司的APP进行测试的时候发现,我们是将所有的参数内容加上一个32位字符最后在进行MD5加密。由于APP处理的流程首先是验证sign是不是正确,如果验签失败,根本就进不去数据库,为了要使用SQLMAP对其进行测试,于是就写了一个代理数据的脚本,在拦截到数据包之后,对其参数内容和32字符进行加密替换。注:该脚本适用于公司内部系统,因为能够知道加密的流程;或者能够拿到前端JS的加密方式。首先我使用Django写了一个程序来模拟公司的系统,流程是获取POST的id和token,并加上自定义加密的字

sqlmap读取与写入文件–file-read:从后端的数据库管理系统文件系统读取文件–file-write:编辑后端的数据库管理系统文件系统上的本地文件(从本地写入)–file-dest:后端的数据库管理系统写入文件的绝对路径(写入目标路径)可以用以上几个命令对SQL注入后的系统文件进行读写,但是前提条件是需要有可读可写的权限并且为dba权限,否则无法成功进行读写操作。以DVWA为例,在kali下搭建DVWA进行读取与写入文件操作。读取文件:查看了PHPinfo里的相关信息,使用-file-r
