当许多小伙伴发现或判断注射时,他们大多数选择直接去sqlmap,结果往往不令人满意。因此,他们有想法写从执行到注射sqlmap的判断发生了什么。
本文将从我们所能看到的角度进行分析,看看sqlmap发送了什么有效载荷,以及这些有效载荷是如何产生的,而无需深入代码层。
测试环境:
sqlmap(1。3 .6 .58 # dev)BurPsuite http://ATtact。com?1.php?id=1@
测试方式
使用sqlmap的代理参数,我们将代理设置为8080端口,并使用burpsuite来抓取数据包。
sqlmap。py-u ‘ http://攻击。com?1.php?id=1′ -代理=’ http://127。0 .0 .1:8080 ‘
(经过长时间的测试,本地构建的环境似乎无法捕获包,因此我们找到了一个带有注入点的网站,该漏洞已报告给漏洞平台)
抓取到的包如下 :
sqlmap 的准备工作
我们还观察到sqlmap发送的默认用户代理是这样的。
因此,为了避免被记录在晶片或日志中,我们可以在后面添加一个随机代理参数。
首先,我们的sqlmap会不断发送大量数据包来检查目标网站是否稳定:
defcheckDynParam(地点、参数、值)3360 ‘ ‘ ‘此函数检查用户参数动态“如果是动态的,那么内容过滤器,或者是dynamics tymightdependennanotherparameter ‘ ”
我不明白这是什么。让我们看看源代码中说了什么。
根据输出语句的关键字搜索,我跟踪了这个checkDynParam函数。它的一般功能是修改我们现在已经获得的参数值,以查看页面在修改前后是否返回相同(有时会注入多个参数,然后一些不相关的参数在修改后保持不变)。如果有变化(或者这个参数是真实有效的),sqlmap将进入下一步。
下一个数据包和函数如下:
passwordsinbandquery=’ select USer,authentication _ StringFromMySQl。USer ‘ condition=’ USer ‘/盲查询=’ select DISTINCT(authentication _ string))来自从MySQl . USerwhere USer=’ % s ‘ LIMIT % d,1 ‘ COUNT=’选择COUNT(DISTINT(身份验证_字符串))来自mysql.user
解码:
这里有一个非常有趣的地方。我的sqlmap是1.3.6版。我不知道他以前是否从mysql.user获得过身份验证字符串值,但有趣的是,这个值仅高于mysql版。密码只会变成authentication_string,我们也可以从queries.xml中找到该语句,
发现默认值是authentication_string,所以我们直接在queries.xml中修改该语句,将查询列表更改为Password,然后再次测试。
后来的测试发现,sqlmap会在不修改的情况下用完密码,检查有效负载后,sqlmap首先检查authentication_string,然后检查密码:
检查源代码。然后我发现(SQL map/Plugins/GENERIC/USERS . py):
在这里,我用replace替换了两个列出的语句,其中有一个ifel语句。如果我* * *次都没找到,我会换掉它,这样我们的问题就解决了。SQLMAP仍然认为很好。
总结
sqlmap包含太多内容。找出里面有什么需要花很多时间。当然,收获是成比例的。清楚地理解sqlmap的过程原理将极大地改进我们的sql注入技术。
极牛网精选文章《聊一聊SQLMAP在进行SQL注入时的整个流程》文中所述为作者独立观点,不代表极牛网立场。如若转载请注明出处:https://geeknb.com/5078.html