0%

sqlmap源码-参数动态性检测

参数动态性检测:

直接抄一下别人的流程图:

其实很简单,简而言之

  • 将请求参数值替换成一个随机的四位数,发包获取结果

  • 结果与原始页面做相似度的对比

  • 如果不相似,那么这个参数具有动态性(这个参数的变化导致了页面的变化)


代码:

实际的代码也是很少。(如果在理解了页面相似度这个概念的前提下)

在开始检测的sql注入的start()函数有调用到checkDynParam函数

经过这个检测参数动态性的函数之后,就可以看到熟悉的提示了。

1
[23:16:00] [INFO] testing if GET parameter 'id' is dynamic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def checkDynParam(place, parameter, value):
"""
This function checks if the URL parameter is dynamic. If it is
dynamic, the content of the page differs, otherwise the
dynamicity might depend on another parameter.
"""

if kb.redirectChoice:
return None

kb.matchRatio = None
dynResult = None
randInt = randomInt() # 生成一个四位随机数

paramType = conf.method if conf.method not in (None, HTTPMETHOD.GET, HTTPMETHOD.POST) else place # paramType:'GET'

infoMsg = "testing if %s parameter '%s' is dynamic" % (paramType, parameter)
logger.info(infoMsg) # 输出提示信息

try:
payload = agent.payload(place, parameter, value, getUnicode(randInt)) # payload: u'id=__PAYLOAD_DELIMITER__1412__PAYLOAD_DELIMITER__'
dynResult = Request.queryPage(payload, place, raise404=False) # 这里面会发包,并且判断相似度
except SqlmapConnectionException:
pass

result = None if dynResult is None else not dynResult
kb.dynamicParameter = result

return result

函数功能注释也解释了。

这个函数用于测试参数是否是动态的。如果它是动态的话,(替换成一个新的值之后)那么页面的内容会发生变化。

如果这个参数不是动态的,那么动态性可能要取决于别的参数。


inspire:

在实际的渗透测试时,用brupsuite抓包的时候,会有这种感觉。

不知道对哪个参数下手,不知道对哪个参数的值替换成payload进行测试。

如果随机测了某个,又不知道其他的参数会不会漏。

但是如果了解了 参数动态性 这个概念之后,实际上这个问题可以转化为

这个数据包里面的哪些参数是动态的,也就是我修改了这个参数之后,服务端会拿对这个变化的参数进行处理,以致于页面(返回包)会发送变化。

那么很大可能性是 我这个参数影响到了某个sql语句的查询或者执行了。

那么这个参数就很有可能存在注入。

总结一下,一个参数存在注入的前提是 这个参数具有动态性。

那么是不是可以编写一个brupsuite插件或者一个小工具,对数据包的参数批量的先检测它是否具有动态性,毕竟这个是注入的前提之一。


refs:

根据这篇文章提出的关键概念点,可以比较好的作为了解sqlmap的路径。