首页 > 其他分享 >绕过preg_match函数并使用本地命令RCE

绕过preg_match函数并使用本地命令RCE

时间:2023-10-15 18:35:52浏览次数:46  
标签:preg cmd echo RCE 绕过 cat match

来自[FBCTF2019]RCEService

题目本身不难,但这个知识点值得一提。

首先打开是一个输入JSON格式的cmd执行,随便输了输看看回显:

我输了个{"cmd" : "ls"}

嗯?直接出目录了?按道理来说应该有过滤吧。

果然输入ls /就:

显然把斜杠过滤了,试了试其他的语句,发现cat啥的常规的全给ban了,就只有ls能看。

贴一个题目源码:

<?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/>';
    }
}
 
?>

虽然我也不知道咋找到的,好像是那个题给的,但是复现的buu没给。

这个preg_match绕过其实有套路的:

1、%0A绕过

类似于preg_match("/^.*flag.*$/",$cmd)这种的正则匹配,默认只匹配第一行
?cmd=%0acat flag即可绕过

2、PCRE回溯次数限制绕过

当正则匹配回溯次数超过上限时将返回false

3、其他题常规方法: 数组绕过

preg_match只能处理字符串,当传入的是数组时将会返回false。

 

这里我选择的是第一个0a绕过,但是直接写在框中会被二次编码,我就直接url上传参了:

然后一个个查目录直接查到flag了:

但有个:putenv('PATH=/home/rceservice/jail');  设置了环境变量,只能使用当前环境的命令

然后对于linux来说,cat命令就在bin下面:

直接用/bin/cat就是cat的意思,获得flag:

 

PCRE的思路也能做:

用preg_match的回溯限制,长度为一百万,来绕过preg_match,因为当preg_match匹配的字符串太长的时候就会返回false,也就是数据溢出(不知道理解对不对)。

脚本如下:

标签:preg,cmd,echo,RCE,绕过,cat,match
From: https://www.cnblogs.com/EddieMurphy-blogs/p/17765952.html

相关文章

  • Codeforces Round 903 (Div. 3)
    [比赛链接]A.Don'tTrytoCount直接用string的可加性,每次s+=s相当于翻倍了,因为\(nm<=25\)所以最多翻倍5次。判断什么的直接模拟就行。#include<iostream>#include<algorithm>#include<cmath>#include<cstdio>#include<cstring>#include<cstdlib>#inclu......
  • Error: Vue packages version mismatch: - [email protected] (D:\前端\vue01\node_module
    Error:Vuepackagesversionmismatch:[email protected](D:\\前端\vue01\node_modules\vue\dist\vue.runtime.common.js)[email protected](D:\前端\vue01\node_modules\vue-template-compiler\package.json)根据提示信息,是版本不匹配的问题,可以直接找到vu......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance(图论)
    CodeforcesRound903(Div.3)F.MinimumMaximumDistance思路对标记点更新fg,从0开始进行bfs,更新d1为所有点到0的距离获得到0最远的标记点L,从L开始bfs,更新d2为所有点到L的距离获得距离L最远的标记点R,从R开始bfs,更新d3为所有点到R的距离遍历所有点,这个点与标记点的最大距......
  • CodeForces 1886E I Wanna be the Team Leader
    洛谷传送门CF传送门把题意抽象成,给你长为\(n\)的序列\(a\)和长为\(m\)的序列\(b\),初始有\(m\)个空集合(可重集),\(a\)中的每个元素至多被分到\(m\)个集合中的一个。要求最后第\(i\)个集合\(T_i\)不为空,且\(\forallx\inT_i,x\ge\frac{b_i}{|T|}\)。要求构造......
  • Codeforces Round 671 (Div. 2) A. Digit Game
    \(R\)和\(B\)在玩一个数字游戏,给一个含有\(n\)位的正整数\(x\)。俩人轮流操作,\(R\)先行动。在每一步中,\(R\)可以选择\(x\)中一个未被标记的奇数位置并标记,\(B\)可以选择\(x\)中一个未被标记的偶数位置并标记。当最后只剩下一个未被标记的位置时,让这个数为\(m\)......
  • Codeforces Round 748 (Div. 3) B. Make it Divisible by 25
    给一个正整数\(n\),在一步操作中可以移除\(n\)中的一个。当\(n\)只剩下一位时将不能再操作,如果过程中产生了前导\(0\),则会被自动移除且不耗费操作次数。询问最少需要多少次操作可以使得\(n\)被\(25\)整除。显然一个正整数\(x\)若可以被\(25\)整除,只需要考虑最后......
  • Educational Codeforces Round 116 (Rated for Div. 2) A. AB Balance
    给一个长为\(n\)的字符串\(s\),只包含\(0\)\(1\)两种字符。定义\(AB(s)\)是\(s\)中出现的\(01\)子串个数,\(BA(s)\)是\(s\)中出现的\(10\)子串个数。在一步操作中,可以选择一个字符进行异或。询问最小的操作次数使得\(AB(s)=BA(s)\)。显然连续的\(11\)或连......
  • Codeforces Round 903 (Div. 3) E. Block Sequence(DP)
    CodeforcesRound903(Div.3)E.BlockSequence思路:设dp[i]为当i~n为完美的最少删除次数dp[n]=1,dp[n+1]=0;从后至前对于dp[i]更新若直接删除当前点,则为dp[i+1]+1若不删除则为min(dp[i+a[i]+1],dp[i]);i+a[i]+1为a[i]不能覆盖的位置#defineintlonglong#define......
  • Codeforces Round 903 (Div. 3)
    D题被hack了哭了第一题简单的只用把字符串重复的同时尝试匹配,然后判断就好了,只是需要一点代码能力第二题,也很简单最多剪断3次,就先从小到大排序,然后用最小的,看看大的是他的几倍,如果不是几倍的关系就不可能完成,如果是就算要几次就好了第三题,也很简单,很明显,对于一个格子,在它旋转9......
  • Codeforces Round 674 (Div. 3) B. Symmetric Matrix
    有\(n\)块\(2\times2\)的瓷砖,瓷砖上的每个方格包含一个数字,每种瓷砖都有无数种。现在需要用所给瓷砖构造一个\(m\timesm\)的方形矩阵\(a\)满足:每块瓷砖都在方形矩阵内瓷砖之间不能存在覆盖\(a_{i,j}=a_{j,i}\)。输出是否存在这种构造。一:显然合法的\(m\)......