目录

【juice-shop】★★★ Database Schema:通过 SQL 注入获取数据库结构

【juice-shop】★★★ Database Schema:通过 SQL 注入获取数据库结构

0x01 任务简报

通过 SQL 注入获取整个数据库结构。


0x02 实战:复现漏洞

🔍 第一步:发现 SQL 注入点

这个实际上没有一点思路,一开始我认为可能是搜索框那里有注入点,但是回显正常……

看了一下攻略,原来在进行搜索的时候,调用了一个请/rest/products/search?q=,这里有SQL回显……

个人认为,SQL注入,只要有回显(或者盲注反应),那就不是很麻烦

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408144957.png

💉 第二步:测试注释和闭合

尝试基础的 SQL 注入语法,闭合原有查询并注释后续语句:

1'))--

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408144957.png

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145458.png

📊 第三步:确定列数

使用 ORDER BY 逐步增加列数,找出查询的确切列数:

1'))order+by+9--

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145621.png

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145458.png

确认查询包含 9 列

🎯 第四步:UNION SELECT 回显位置

构造 UNION SELECT 语句,确定各列在响应中的回显位置:

1'))union+select+1,2,3,4,5,6,7,8,9--

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145221.png

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145537.png

🗄️ 第五步:识别数据库类型并查询结构

根据回显,确认使用的是 SQLite 数据库。SQLite 将所有表定义存储在 sqlite_master 系统表中。

构造查询语句,从 sqlite_master 表中提取所有 SQL 定义:

1'))union+select+1,2,3,4,5,6,7,8,sql+from+sqlite_master--

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145405.png

../../../../../../public/p/juice-shop-database-schema通过-sql-注入获取数据库结构/assets/Pastedimage20260408145705.png

✅ 第六步:完成挑战

成功获取整个数据库的 schema 定义,挑战完成。


🔧 修复建议

找到它

第 5 行,关于 SQL 注入的直接找是不是 SQL 拼接了语句,审计一下就行

修复它

Fix1

Fix2和Fix3修了个寂寞……


参考