【PHP注入01】PHP语言常见可注入函数(eval、assert、preg_replace、call_user_func、$a($b)等)

1 PHP注入概述

  1. RCE概念:remote command/code execute,远程命令/代码执行。
  2. PHP代码执行:在WEB中,PHP代码执行是指应用程序过滤不严,用户可用通过请求将代码注入到应用中执行。
  3. PHP代码注入与SQL注入比较:
    1. 其注入思想是类似的,均是构造语句绕过服务器的过滤去执行。
    2. 区别在于SQL注入是将语句注入到数据库中执行,而PHP代码执行则是可以将代码注入到应用中,最终由服务器运行它。
  4. 条件:
    1. 程序中含有可以执行PHP代码的函数或语言结构;
    2. 传入该函数或语言结构的参数是客户端可以控制的(可以直接修改或造成影响)。
  5. 危害 :这样的漏洞如果没有特殊的过滤,相当于直接有一个WEB后门的存在。攻击者可以通过代码执行漏洞继承WEB用户权限、执行任意代码;如果服务器没有正确配置或者WEB哟用户权限比较高的话,还可以读写靶机服务器任意文件内容,甚至控制整个网站或者服务器。

2 相关函数与语言结构

凡是出现以下代码,都需要谨慎处理其传入的参数,容易出现PHP注入漏洞。

2.1 eval()函数

  1. 作用:该函数的作用是将字符串作为PHP代码执行。
  2. 危害:如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
  3. 测试代码如下,其中的全局变量$_GET还可以是$_REQUEST等其他预定义超全局变量。
<?php
if (isset($_GET['code'])){
	$code=$_GET['code'];
	eval($code);
}else{
	echo "Please submit code!<br >?code=phpinfo();";
}
  1. 通过浏览器访问上述函数所在网页时,可以通过传递参数该code来执行PHP探针。主要方式有以下几种:
    1. 普通方式提交变量:?code=phpinfo();
    2. 以语句块方式提交变量:?code={phpinfo();}
    3. 以多语句方式提交参数:?code=1;phpinfo();

2.2 assert()函数

  1. 作用:是如果它的条件返回错误,则终止程序执行。
  2. 危害:该函数也会将传入的字符串参数作为PHP代码执行。如果没有对该函数的参数进行有效准确过滤,其参数将有可能被用户用于注入有害代码。
  3. 测试代码如下,其中的全局变量$_GET还可以是$_REQUEST等其他预定义超全局变量。
<?php
if (isset($_GET['code'])){
	$code=$_GET['code'];
	assert($code);
}else{
	echo "Please submit code!<br >?code=phpinfo();";
}
  1. 通过浏览器访问上述函数所在网页时,可以通过传递参数该code来执行PHP探针。主要方式有以下几种:
    1. 普通方式提交变量:?code=phpinfo()
    2. 与eval()函数有别的是,该函数不能执行传入语句块或多语句作为参数。

2.3 preg_replace()函数

  1. 作用:该函数用于对字符串进行正则处理。
  2. 函数原型及解析如下:搜索$subject中匹配$pattern的部分,以$replacement进行替换。
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int limit = -1 [, int &$count]])
  1. 特别地,当$pattern处第一个参数存在e修饰时,$replacement的值会被当成PHP代码来执行,代码如下。代码中第一个参数 "/\[(.*)\]/e"解析如下,第二个参数\\1表示的是正则表达式第一次匹配的内容。
    1. 在两个/间是要匹配的正则表达式;
    2. 用两个\表示对中括号的转义,也就是说要匹配的内容是中括号内的。
    3. 匹配的内容就是(.*)。其中点表示任意字符,*表示任意多个。
<?php
if (isset($_GET['code'])){		//其中的全局变量\$_GET还可以是\$_REQUEST等其他预定义超全局变量。
	$code=$_GET['code'];
	preg_replace("/\[(.*)\]/e",'\\1',$code);
}else{
	echo"?code=[phpinfo()]";
}
?>
  1. 通过浏览器访问上述函数所在网页时,可以通过传递参数该code来执行PHP探针。主要方式有以下几种:
    1. 普通方式提交变量:?code=[phpinfo();]
    2. 以语句块方式提交变量:?code={[phpinfo();]}
    3. 以多语句方式提交参数:方法尝试失败,不知是否有解?

2.4 call_user_func()函数

  1. call_user_func()这一类函数具有调用其他函数的功能,其中的一个参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用开发者意料之外的函数来执行我们想要的代码,也就是存在任意代码执行漏洞。
  2. call_user_func()函数第一个参数作为回调函数,后面的参数为回调函数的参数,测试代码如下:
<?php
if(isset($_GET['fun'])){
	$fun=$_GET['fun'];
	$para=$_GET['para'];
	call_user_func($fun,$para);
}else{
	echo"?fun=assert&amp;para=phpinfo()";
}
?>
  1. 通过浏览器访问上述函数所在网页时,可以通过传递参数该code来执行PHP探针,?fun=assert&para=phpinfo()。值得注意的是,传入的第一个参数可以是assert函数而不是eval。

2.5 动态函数$a($b)

  1. 背景:由于PHP的特性原因,PHP函数支持直接有拼接的方式调用,这就直接导致了PHP在安全上的控制又加大了难度。不少知名程序中也用到了动态函数的写法,这种写法跟使用call_user_func()函数的初衷一样,都是为了更加方便地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。
  2. 测试代码如下:
<?php
if(isset($_GET['a'])){
	$a=$_GET['a'];
	$b=$_GET['b'];
	$a($b);
}else{
	echo"?a=assert&amp;b=phpinfo()";
}
?>
  1. 通过浏览器访问上述函数所在网页时,可以通过传递参数该code来执行PHP探针,?a=assert&b=phpinfo()

3 总结

  1. 掌握PHP语言种几种可能存在注入的函数;
  2. 结合SQL注入与XSS漏洞思考PHP注入绕过手法。
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值