Remote Code Execution和Remote Command Execution在无数字字母的条件下解法完全不同。代码执行还可以通过各种方法取字母数字构建函数;但是在系统命令下基本无法构建数字字母,需要我们使用强制上传的方法上传要执行的命令,再去读取上传的临时文件。
PHP强制文件上传
需要在
php.ini
中设置file_uploads
在PHP中,上传的信息一般会放在$_GET
$_POST
$_SERVR
$_COOKIE
$_SESSION
$_FILES
这6个超全局变量中,因为不知道在设计时是否需要上传文件,为了防止上传的文件丢失,PHP会默认初始化$_FILE
变量,用于临时文件的存储。基于以上的原因,在file_uploads
打开的情况下,所有的PHP文件都可以进行强制文件上传,只需要构建相应的上传页面即可。
PHP临时文件上传
在PHP临时文件的理解及应用中我详细介绍了PHP文件上传以及可以利用的方式。
我们都知道php文件上传时,一般是将文件上传到临时目录,然后再将临时目录移到其它地方这儿主要介绍php.ini中的两个参数
file_uploads 是否允许上传
upload_tmp_dir 是默认的临时文件的保存目录(linux默认为/tmp)
命名规则
而且需要说明一下,临时文件的命名规则,默认为 php+4或者6位随机数字和大小写字母
/tmp/php[0-9A-Za-z]{3,4,5,6}
比如 :phpXXXXXX.tmp 在windows下有tmp后缀,linux没有。
生命周期
临时文件是有生命周期的,一般情况下,生命周期为被上传的PHP文件的代码运行周期。
另外,如果在php运行过程中,php非正常结束,比如崩溃,那么这个临时文件就会被永久保留。注:如果不能RCE,这里可以利用文件包含进行危害扩大化。
linux 点命令
在linux下,.(点)+(空格)+可执行文件等同于source+(空格)+可执行文件,表示在当前shell环境执行后面的命令或脚本例如 . /home/test.sh 等同于 source /home/test.sh。
源码
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_GET['cmd'];
if(!preg_match("/[a-z]|[0-9]/i",$cmd)){
system($cmd);
}
分析
上述代码时考察的是无字母数字系统命令执行,需要我们将待执行的系统命令用其他方法传入。
过程
先用HTML构建当前php文件的上传页面(或者也可以直接用hackbar上传表单的形式上传文件)
将需要执行的命令写入txt文件上传。
linux
中命令可以以文件的形式存在,直接传入命令文件也可以。
cat /etc/passwd
用burp抓取上传的请求包,修改传入的cmd参数,并发送到重放器。这里的cmd=.+/???/????????[@-[]
是用点命令执行临时文件的意思,最后的[@-[]
是为了缩小查找临时文件的范围。
需要无字母数字执行系统命令,都可以采用上传文件+执行文件的方式来绕过正则。
原文始发于微信公众号(7coinSec):无数字字母Remote Command Execution
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论