news 2026/6/10 14:39:23

攻防世界: ics-05

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
攻防世界: ics-05

攻防世界: ics-05

本文知识点

preg_replace可执行代码漏洞的使用

preg_replace有三个参数,第一个参数是正则的模式字符串,第二个是替换的数据,第三个是正则模式字符串要去匹配的字符串。

当正则的模式字符串与要匹配的字符串匹配时(即第一个参数与第三个参数匹配),就会使用替换数据(第二个参数)进行替换。

当正则的第一个参数包含/e的时候就能触发代码执行的逻辑,具体可看后文。

题目总览

点击下图中的红框位置,跳转到设备维护中心的页面

然后再次点击云平台设备维护中心,可以看到浏览器中出现了page参数,因此怀疑其是一个文件包含的漏洞。

原始文件获取

使用前面提到过的php伪协议,将index.php转换为base64的编码输出。(为什么转换为base64, 因为文件包含漏洞的后端代码可能是include $page,如果这是一个php的代码,php代码的执行引擎会直接执行,而不会将原始文件返回给我们)

我们希望得到原始的文件,方便我们分析怎么绕过,得到flag。

将上述的base64解码,得到下面的php内容:

<?phperror_reporting(0);@session_start();posix_setuid(1000);?><!DOCTYPEHTML><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><ulclass="layui-nav"><liclass="layui-nav-item layui-this"><a href="?page=index">云平台设备维护中心</a></li></ul><fieldsetclass="layui-elem-field layui-field-title"style="margin-top: 30px;"><legend>设备列表</legend></fieldset><tableclass="layui-hide"id="test"></table><script type="text/html"id="switchTpl"><!--这里的 checked 的状态只是演示--><input type="checkbox"name="sex"value="{{d.id}}"lay-skin="switch"lay-text="开|关"lay-filter="checkDemo"{{d.id==10003?'checked':''}}></script><script src="layui/layui.js"charset="utf-8"></script><script>layui.use('table',function(){vartable=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(){varelement=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 style="text-align:center"><pclass="lead"><?phpecho$page;die();?></p><br/><br/><br/><br/><?php}else{?><br/><br/><br/><br/><div style="text-align:center"><pclass="lead"><?phpif(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>

代码分析

重点关注下面的代码,前面提到的知识点,我们可以利用preg_replace函数的可执行漏洞,执行我们想执行的任何代码。

HTTP_X_FORWARDED_FOR这个请求头就是客户端的ip地址,我们知道这个地址是能通过x-forwarded-for的请求头进行伪造的。

`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();}}

破解思路

通过前面的分析,我能想到的一条路径就是发送一个x-forwarded-for的请求头,到达preg_replace函数的处理逻辑,然后利用这个函数的漏洞,执行任意代码,从而拿到flag。

  1. 尝试执行ls系统命令,得到对应的文件名或则文件夹名称。(如果你不知道谁是文件还是文件夹,可以执行ls -l命令)

  2. 使用cat命令查看flag。

注意:

这里我有几个踩坑的地方

  1. pat参数不能够匹配sub参数,导致代码没有得到执行。(最简单的情况就是pat是sub 的子字符串)
  2. 由于我直接在burp suite中进行改包,忘记将参数进行uri的编码了,导致执行失败

uri编码小知识

  1. 对Url进行编码后可以将一些特殊字符和汉字变为Encode编码格式
  2. encodeURI方法不会对下列字符编码 ASCII字母、数字、~!@#$&*()=:/,;?+’
  3. encodeURIComponent方法不会对下列字符编码 ASCII字母、数字、~!*()’
  4. encodeURIComponent编码的范围更广,会将http://XXX中的//也编码,会导致URL不可用。

错误的编码方式

正确的编码方式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 10:57:08

PinWin:简单实用的Windows窗口置顶工具完整指南

PinWin&#xff1a;简单实用的Windows窗口置顶工具完整指南 【免费下载链接】PinWin Pin any window to be always on top of the screen 项目地址: https://gitcode.com/gh_mirrors/pin/PinWin PinWin是一款专门为Windows用户设计的免费开源窗口管理工具&#xff0c;能…

作者头像 李华
网站建设 2026/6/10 11:11:38

实时流式识别体验:Fun-ASR模拟流式效果实测

实时流式识别体验&#xff1a;Fun-ASR模拟流式效果实测 你有没有这样的需求&#xff1a;在开会时&#xff0c;希望语音能一边说、文字一边出&#xff1f;或者做直播访谈&#xff0c;想实时生成字幕&#xff1f;传统语音识别往往是“录完再转”&#xff0c;等全部音频上传完才开…

作者头像 李华
网站建设 2026/6/10 11:12:13

MGeo模型部署卡顿?3步搞定GPU算力适配问题实战案例

MGeo模型部署卡顿&#xff1f;3步搞定GPU算力适配问题实战案例 你是不是也遇到过这种情况&#xff1a;兴冲冲地部署了阿里开源的MGeo地址相似度识别模型&#xff0c;准备在项目中大展身手&#xff0c;结果一运行就卡得不行&#xff0c;推理速度慢得像蜗牛爬&#xff1f;别急&a…

作者头像 李华
网站建设 2026/6/9 22:51:07

超实用Chrome扩展:右键一键保存图片为PNG/JPG/WebP格式

超实用Chrome扩展&#xff1a;右键一键保存图片为PNG/JPG/WebP格式 【免费下载链接】Save-Image-as-Type Save Image as Type is an chrome extension which add Save as PNG / JPG / WebP to the context menu of image. 项目地址: https://gitcode.com/gh_mirrors/sa/Save-…

作者头像 李华
网站建设 2026/5/2 17:02:43

qmc-decoder:解锁QQ音乐加密文件的终极解决方案

qmc-decoder&#xff1a;解锁QQ音乐加密文件的终极解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 还在为QQ音乐下载的歌曲只能在特定播放器里播放而烦恼吗&#x…

作者头像 李华
网站建设 2026/6/9 21:27:14

通达信数据接口实战指南:mootdx框架深度解析与量化应用

通达信数据接口实战指南&#xff1a;mootdx框架深度解析与量化应用 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在金融数据获取领域&#xff0c;传统方案往往面临协议复杂、数据格式不统一、网…

作者头像 李华