博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一道ISCC题引申的PHP正则复习
阅读量:6340 次
发布时间:2019-06-22

本文共 3453 字,大约阅读时间需要 11 分钟。

iscc中的一道web题“试试看”,描述为随意开火

image.png

起初看url,以为是一道常规的文件包含题,后面试了很多方法都出不来

最后受到其他师傅的启发才得到payload
这里有两种payload都可以

http://118.190.152.202:8006/show.php?img=php://filter/resource=1.jpg/resource=show.php
http://118.190.152.202:8006/show.php?img=php://filter/resource=show.php|jpg
image.png
image.png

对这道题目的匹配规则很感兴趣,在本地搭建进行仔细分析,也是对正则以及php函数的复习

在审计代码之前,先复习一下php的preg_match、strpos和file_get_contents等函数

1、preg_match函数用于正则匹配,第一个参数是要匹配的正则规则,第二个参数是被匹配的字符串。后面的可选参数中,$matches是一个数组,用于返回匹配的字符串结果

# preg_match(PHP 4, PHP 5, PHP 7)preg_match — 执行匹配正则表达式### 说明int **preg_match** ( string `$pattern` , string `$subject` [, array `&$matches` [, int `$flags` = 0 [, int`$offset` = 0 ]]] )搜索`subject`与`pattern`给定的正则表达式的一个匹配.

2、strpos函数用于字符串查找,如果找到则返回位置,位置从0开始计算。如果没有找到则返回false

# strpos(PHP 4, PHP 5, PHP 7)strpos — 查找字符串首次出现的位置### 说明int **strpos** ( string `$haystack` , [mixed]`$needle` [, int `$offset` = 0 ] )返回 `needle` 在 `haystack` 中首次出现的数字位置。如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。

3、file_get_contents函数用于文本读取,可以获得文件内容,它更强大的地方在于可以通过http协议抓取内容

# file_get_contents(PHP 4 >= 4.3.0, PHP 5, PHP 7)file_get_contents — 将整个文件读入一个字符串### 说明string **file_get_contents** ( string `$filename` [, bool `$use_include_path` = false [, resource`$context` [, int `$offset` = -1 [, int `$maxlen` ]]]] )和 file()一样,只除了 **file_get_contents()** 把文件读入一个字符串。将在参数 `offset` 所指定的位置开始读取长度为`maxlen` 的内容。如果失败,**file_get_contents()** 将返回 **`FALSE`**。**file_get_contents()** 函数是用来将文件的内容读入到一个字符串中的首选方法。如果操作系统支持还会使用内存映射技术来增强性能。> **Note**:> > 如果要打开有特殊字符的 URL (比如说有空格),就需要使用 [urlencode()]进行 URL 编码。

本题中,经过注释和改造后的主要代码如下

show.php
"; echo $img; header('Content-Type: image/jpeg'); // 关键函数get_contents,去获得文件内容 $data = get_contents($img); echo $data; } else { die('File not found.'); }}else{ ?>
config.php

这里通过实际payload在执行中的流程,对关键地方进行输出,方便分析和查看结果

0x01

首先分析show.php?img=php://filter/resource=config.php|jpg

逻辑中的第一个涉及preg_match的if语句中,只有在传入的$img中匹配到"resource="的同时,preg_match中$img匹配规则"/resource=.*jpg/i"匹配不到的情况下成立

在这里不会对payload形成影响
关键点在接下来的正则匹配

// 再次进行正则匹配,如果以php://filter开头,并且字符串中存在resource=加上任意不包含|的字符串        // 对$img进行左右两边空白或者预定符号的删除,最后匹配结果存到$matches数组        preg_match('/^php:\/\/filter.*resource=([^|]*)/i',trim($img),$matches);        // $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推。        var_dump($matches);        if(isset($matches[1]))        {            $img = $matches[1];        }        echo "
"; echo $img; // header('Content-Type: image/jpeg'); // 关键函数get_contents,去获得文件内容 $data = get_contents($img); echo $data;

可以看到,匹配规则是要求以开头,并且字符串中存在resource=加上任意不包含|的字符串

([^|]*)代表的意思就是排除|以外的字符,允许重复零次或多次,圆括号包裹则表示这是一个匹配的文本子组
匹配的结果保存在$matches数组中,并且$img会被覆盖为$matches的第2个元素
这里的关键在于$matches的第二个元素内容,第二个元素内容是圆括号包裹的([^|]*)子组的内容

image.png
经过正则后,$img已经被覆盖,内容为config.php
在config.php中,将通过函数
file_get_contents($img)去获取指定文件内容并且返回

// 如果$img中存在'jpg',返回$img文件内容    if(strpos($img,'jpg') !== false)    {        return file_get_contents($img);    }    // 否则返回$img的同时,设置返回头为hmtl    else    {        header('Content-Type: text/html');        return file_get_contents($img);    }
0x02

接下来分析show.php?img=php://filter/resource=1.jpg/resource=config.php

其他流程和上面的一样,只要字符串中包含jpg就可以,关键在于

preg_match('/^php:\/\/filter.*resource=([^|]*)/i',trim($img),$matches);

payload进去之后的匹配结果将是后面一个resource=config.php,而不是resource=1.jpg,因此拿到的$matches的第二个元素也是config.php!

image.png

转载地址:http://bqeoa.baihongyu.com/

你可能感兴趣的文章
结对项目 —— 图书管理系统实验报告
查看>>
c# .net获取各国时间
查看>>
java 各种命令
查看>>
python基础——散列类型
查看>>
网络连接中的三次握手
查看>>
python 进程复习
查看>>
数据结构与算法题目集(中文)——5-13 统计工龄 (20分)——桶排序
查看>>
jqPlot,一个 jQuery这个 JavaScript 框架的绘图插件
查看>>
[Exception Android 19] - android.widget.HeaderViewListAdapter.isEnabled
查看>>
2015 Multi-University Training Contest 2 1006 Friends
查看>>
第三方插件——地图
查看>>
python+Django创建购物网站
查看>>
病名为爱
查看>>
软件工程师分类
查看>>
[Codeforces1137F]Matches Are Not a Child's Play——LCT+树状数组
查看>>
HDU 5172 GTY's gay friends (线段树)
查看>>
phpcms常用字段
查看>>
Delphi7_Lite_Fullv7.3优化精简全功能版
查看>>
阅读博文心得
查看>>
chrome下不支持select里面的option单击事件!
查看>>