如何多次读取urllib2的urlopen响应?SQLmap改造遇阻
解决SQLmap中处理WAF拦截时响应内容重复读取的问题
嘿,我明白你遇到的麻烦了——urllib2的响应对象确实有点“傲娇”,read()一次之后就把数据流耗尽了,再读就只能拿到空内容,而且直接深拷贝这类和底层网络连接绑定的对象根本行不通。咱们来一步步解决这个问题:
问题根源
urllib2.urlopen()返回的是一个类文件对象,它的read()方法会移动内部的文件指针到末尾,后续调用就只能获取空字符串。而copy.deepcopy()没法复制这种和网络套接字关联的对象,所以你的第二种尝试也失效了。
正确的实现思路
我们需要把响应内容先读取出来保存到内存里,直到确认内容不包含WAF拦截信息,再把这个内容包装成一个类文件对象,让SQLmap后续的代码能正常调用read()方法。具体步骤如下:
- 发起请求并读取完整响应内容
- 检查内容是否包含“CAUGHT BY WAF”,如果包含就重新请求,重复这个过程
- 当拿到符合要求的内容后,用
StringIO(Python2)或io.StringIO(Python3)把内容包装成类文件对象,替换原来的conn
修改后的代码示例
在你说的第471行之后,替换成这段代码:
from StringIO import StringIO # 如果是Python3环境,改成from io import StringIO # 第一次请求并读取完整响应内容 conn = urllib2.urlopen(req) response_content = conn.read() # 循环重试直到WAF拦截内容消失 while 'CAUGHT BY WAF' in response_content: conn.close() # 关闭旧连接避免资源泄漏 conn = urllib2.urlopen(req) response_content = conn.read() # 将内容包装成类文件对象,确保后续SQLmap代码能正常调用read() conn = StringIO(response_content)
为什么这样可行?
- 我们把响应内容一次性读取到
response_content变量中,既可以反复检查拦截信息,又不会耗尽数据流 StringIO包装后的对象和原urllib2响应对象一样支持read()方法,SQLmap后续逻辑可以无缝兼容- 每次循环都会关闭旧连接,避免不必要的资源占用
这样修改后,就能实现自动重试直到绕过WAF拦截的需求了~
内容的提问来源于stack exchange,提问作者user00239123
相关产品推荐
相关产品推荐

