自动化寻找网站的注入漏洞,需要先将目标网站的所有带参数的 URL 提取出来,然后针对每个参数进行测试,对于批量化检测的目标,首先要提取大量网站带参数的 URL,针对 GET 请求的链接是可以通过自动化获取的,而 POST 型参数提交的方式,则需要手工点击,然后代理抓取数据包再进行提交测试。
本文的重点是如何自动化获取网页中的 URL,然后进行处理后,保留每个路径下的一条记录,从而减少测试的目标,提升测试的效率,这个过程主要分三步,分别是:提取 URL、匹配带参数的 URL、URL 去重。
0x01 获取页面中的 URL
其实实现这个目标很简单,写一个脚本,获取页面内容,然后使用正则将 URL 匹配出来即可,有的人就会说,我不会写脚本,我不懂正则,该怎么办?
也好办,可以用别人写好的工具,会用就行,这里推荐一个工具叫 gau,项目地址:
https://github.com/lc/gau
该项目使用 go 语言编写,安装方式也很简单,命令如下:
go get -u -v github.com/lc/gau
使用起来就更简单了,比如:
echo "https://www.xazlsec.com" | gau
从图中可以看到有很多图片之类的文件,可以使用 -b 参数排除,比如:
echo "https://www.xazlsec.com" | gau -b png,jpg
如果我想获取的不只是目标域名下的链接,还想获取其他子域名的链接,那么可以使用 -subs 参数:
echo "https://www.xazlsec.com" | gau -b png,jpg -subs xazlsec.com
到这里,基本可以满足我们的需求了,当然还可以设置线程数来提升抓取效率,还可以将结果保存到文件中,具体的参数,大家可以自行测试。
0x02 提取 URL 中带参数的 URL
如果 URL 不带参数,那么我们就无法对其进行检测,任何输入点都有可能存在安全风险,没有输入点,当然也没办法测试了,所以如何从 URL 列表中提取带参数的 URL 呢?如果你会正则,会脚本,这个目标也没什么难度。
在不会写脚本,也不懂正则的情况下,可以使用工具 gf,项目地址:
https://github.com/tomnomnom/gf
安装也比较简单,使用的话需要依赖别人写好的配置文件,这里推荐一个项目,有很多写好的配置:
https://github.com/1ndianl33t/Gf-Patterns
首先安装 gf:
go get -u github.com/tomnomnom/gf
然后把 Gf-Patterns 克隆回来:
git clone https://github.com/1ndianl33t/Gf-Patterns
把 Gf-Patterns 中的文件移动到 .gf/ 中:
mv Gf-Patterns/* .gf/
接下来就可以提取可能存在 SQL 注入的链接了,结合之前介绍的工具,命令如下:
echo "https://example.com" | gau -b png,jpg -subs example.com | gf sqli
0x03 将提取出来的 URL 去重
通过以上方法获取的 URL 列表,有很多同一个路径,但是参数内容不同的情况,如果都去做测试的话,会有很多重复的劳动,没有必要的测试,所以需要将 URL 进行去重,将 URL 的参数替换为固定值,然后进行去重,这样就可以把相同路径和相同参数的 URL 去除,保留一条记录,可以大大的节省测试的时间和目标数量,即减少了与目标交互的次数,也能提升测试的效率。
这里推荐一个工具叫 qsreplace,下载地址:
https://github.com/tomnomnom/qsreplace
安装方式:
go get -u github.com/tomnomnom/qsreplace
结合之前的工具使用,命令如下:
echo "https://example.com" | gau -b png,jpg -subs example.com > sqli.txt cat sqli.txt | qsreplace fuzz > duplicateremove.txt
到这里,就可以使用注入漏洞检测工具对目标 URL 列表进行检测了,比如 sqlmap 等注入检测工具。
总结
本文主要介绍了三款 go 语言编写的小工具,用来针对目标收集可能存在某些漏洞的 URL 列表,然后在结合漏洞检测工具,有针对性的进行检测,提升工作效率。大家如果有更好的玩法,欢迎讨论。