1.简介
远程代码执行(remote code execution)简称RCE,由于应用程序在调用一些能够将字符串转换为代码的函数(如PHP中的eval)时,没有考虑用户是否控制这个字符串,则会导致代码执行漏洞的发生Webshell能够执行代码,本质上就是利用了代码执行的函数
代码执行相关函数:
PHP: eval、assert、preg_replace()、+/e模式(PHP版本<5.5.0)
Javascript: eval
Vbscript:Execute、Eval
Python: exec
Java: Java中没有php中eval函数这种直接可以将字符串转化为代码执行的函数,但是有反射机制,并且有各种基于反射机制的表达式引擎,如:OGNL、SpEL、MVEL等,这些都能造成代码执行漏洞。
2.Php
(1)Eval
格式:eval (string ¥code)
作用:字符串按照PHP代码来计算。该字符串必须是合法的 PHP代码,且必须以分号结尾
<?php
eval($_POST['a']);
?>
(2)Assert
语法: assert(mixed assertion,stringdescription]
作用:检查一个断言是否为FALSE。如果assertion 是字符串,它将会被assert当做PHP代码来执行。不需要以分号结尾。
<?php
assert($_POST['a']);
?>
(3)preg_replace
语法: preg_replace( mixed pattern, miedreplacement ,mixed subject ,intlimit = -1Lint&Scount]l)
作用:执行一个正则表达式的搜索和替换,搜索 subject 中匹配 pattern 的部分,以replacement 进行替换。
<?php
echo(preg_replace("/test/",$_POST["a"],"just test"));
?>
如果使用了/e修饰符,则会将替换后的字符串作为php代码执行(eval函数方式)
<?php
echo(preg_replace("/test/e",$_POST["a"],"just test"));
?>
(4)call_user_func
语法: call_user_func(callable callbacklmiedparameterl mixed S...)
作用:把第一个参数作为回调函数调用,第一个参数 calback 是被调用的回调函数,其余参数是回调函数的参数。 (我们调用php系统提供的函数叫直接调用,也叫: 直调,而php系统调用用户自定义的函数,必须要通过一个代理函数来调用,叫间接调用,也叫回调。在PHP中有两种常见的回调函数:calluser_func0和calluser func array0,它们可以代替系统来调用我们自己定义的函数)
<?php
call_user_func("assert",$_POST['cmd']);
?>