1、RCE观点:remote command/code execute,远程命令/代码实行。

2、PHP代码实行:在WEB中,PHP代码实行是指运用程序过滤不严,用户可用通过要求将代码注入到运用中实行。

3、PHP代码注入与SQL注入比较:

phpifaPHP说话常见可注入函数evalcalluserfuncab SQL

1、 其注入思想是类似的,均是布局语句绕过做事器的过滤去实行。

2、差异在于SQL注入是将语句注入到数据库中实行,而PHP代码实行则是可以将代码注入到运用中,终极由做事器运行它。

4、条件:

1、 程序中含有可以实行PHP代码的函数或措辞构造;

2、传入该函数或措辞构造的参数是客户端可以掌握的(可以直接修正或造成影响)。

5、危害 :这样的漏洞如果没有分外的过滤,相称于直接有一个WEB后门的存在。
攻击者可以通过代码实行漏洞继续WEB用户权限、实行任意代码;如果做事器没有精确配置或者WEB哟用户权限比较高的话,还可以读写靶机做事器任意文件内容,乃至掌握全体网站或者做事器。

2 干系函数与措辞构造

凡是涌现以下代码,都须要谨慎处理其传入的参数,随意马虎涌现PHP注入漏洞。

2.1 eval()函数浸染:该函数的浸染是将字符串作为PHP代码实行。
危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
测试代码如下,个中的全局变量$_GET还可以是$_REQUEST等其他预定义超全局变量。

<?phpif (isset($_GET['code'])){$code=$_GET['code'];eval($code);}else{echo "Please submit code!<br >?code=phpinfo();";}

4、通过浏览器访问上述函数所在网页时,可以通过通报参数该code来实行PHP探针。
紧张办法有以下几种:普通办法提交变量:?code=phpinfo();以语句块办法提交变量:?code={phpinfo();}以多语句办法提交参数:?code=1;phpinfo();

2.2assert()函数

1、浸染:如果它的条件返回缺点,则终止程序实行。

2、危害:该函数也会将传入的字符串参数作为PHP代码实行。
如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。

3、测试代码如下,个中的全局变量$_GET还可以是$_REQUEST等其他预定义超全局变量。

<?phpif (isset($_GET['code'])){$code=$_GET['code'];assert($code);}else{echo "Please submit code!<br >?code=phpinfo();";

4、通过浏览器访问上述函数所在网页时,可以通过通报参数该code来实行PHP探针。
紧张办法有以下几种:

普通办法提交变量:?code=phpinfo()

与eval()函数有别的是,该函数不能实行传入语句块或多语句作为参数。

2.3 preg_replace()函数

1 、浸染:该函数用于对字符串进行正则处理。

2 、函数原型及解析如下:搜索$subject中匹配$pattern的部分,以$replacement进行更换。

mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int limit = -1 [, int &$count]])

3 、特殊地,当$pattern处第一个参数存在e润色时,$replacement的值会被当成PHP代码来实行,代码如下。
代码中第一个参数 "/\[(.)\]/e"解析如下,第二个参数\\1表示的是正则表达式第一次匹配的内容。

1 在两个/间是要匹配的正则表达式;

2 用两个\表示对中括号的转义,也便是说要匹配的内容是中括号内的。

3 匹配的内容便是(.)。
个中点表示任意字符,表示任意多个。

<?phpif (isset($_GET['code'])){ //个中的全局变量\$_GET还可以是\$_REQUEST等其他预定义超全局变量。
$code=$_GET['code'];preg_replace("/\[(.)\]/e",'\\1',$code);}else{echo"?code=[phpinfo()]";}?>

4、 通过浏览器访问上述函数所在网页时,可以通过通报参数该code来实行PHP探针。
紧张办法有以下几种:

1 普通办法提交变量:?code=[phpinfo();]

2 以语句块办法提交变量:?code={[phpinfo();]}

3 以多语句办法提交参数:方法考试测验失落败,不知是否有解?

2.4 call_user_func()函数

1、call_user_func()这一类函数具有调用其他函数的功能,个中的一个参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用开拓者猜想之外的函数来实行我们想要的代码,也便是存在任意代码实行漏洞。

2、call_user_func()函数第一个参数作为回调函数,后面的参数为回调函数的参数,测试代码如下:

<?phpif(isset($_GET['fun'])){$fun=$_GET['fun'];$para=$_GET['para'];call_user_func($fun,$para);}else{echo"?fun=assert¶=phpinfo()";}?>

3、通过浏览器访问上述函数所在网页时,可以通过通报参数该code来实行PHP探针,?fun=assert¶=phpinfo()。
值得把稳的是,传入的第一个参数可以是assert函数而不是eval。

2.5 动态函数$a($b)

1、背景:由于PHP的特性缘故原由,PHP函数支持直接有拼接的办法调用,这就直接导致了PHP在安全上的掌握又加大了难度。
不少有名程序中也用到了动态函数的写法,这种写法跟利用call_user_func()函数的初衷一样,都是为了更加方便地调用函数,但是一旦过滤不严格就会造成代码实行漏洞。

2、测试代码如下:

<?phpif(isset($_GET['a'])){$a=$_GET['a'];$b=$_GET['b'];$a($b);}else{echo"?a=assert&b=phpinfo()";}?>

3、通过浏览器访问上述函数所在网页时,可以通过通报参数该code来实行PHP探针,?a=assert&b=phpinfo()。

3 总结节制PHP措辞种几种可能存在注入的函数;结合SQL注入与XSS漏洞思考PHP注入绕过手腕。