代码审计——代码执行漏洞

代码执行漏洞含义

是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。说得好理解一点,类似于 SQL注入漏洞,可以把SQL 语句注入到SQL服务执行。

而PHP 代码执行漏洞则是可以把代码注入应用中最终到 WebServer 去执行。这样的漏洞如果没有特的过滤,相当于直接有一个 Web 后门存在,该漏洞主要由 eval()、assert()、preg_replace()、call_user_func()、call_user_func_array()、array_map()等 函数的参数过滤不严格导致,另外还有 PHP 的动态函数($a($b))也是目前出现比较多的。

挖掘经验

eval()和 assert()函数导致的代码执行漏洞大多是因为载入缓存或者模板以及对变 量的处理不严格导致,比如直接把一个外部可控的参数拼接到模板里面,然后调用这 两个函数去当成 PHP代码执行。 prcg_replace()函数的代码执行需要存在/e 参数,这个函数原本是用来处理字符串 的,因此漏洞出现最多的是在对字符串的处理,比如 URL、HTML 标签以及文章内容 等过滤功能。

call_user_func() 和 call_user_func_array()函数的功能是调用函数,多用在框架里 面动态调用函数,所以一般比较小的程序出现这种方式的代码执行会比较少。array_ map() 函数的作用是调用函数并且除第一个参数外其他参数为数组,通常会写死第一个 参数,即调用的函数,类似这三个函数功能的函数还有很多。 除了上面这些函数导致的代码执行漏洞,还有一类非常常见的是动态函数的代码执行。

比如下面这样的写法: §GET($POST ["××"]) 基于这种写法变形出来的各种异形,经常被用来当作Web 后门使用,可以看到这 里的 PHP 函数是从$GET 变量当做字符串传入进来的,这是PHP 的一个特性。

代码执行函数

PHP 代码执行有多种利用方式,但目前见得最多的还是由于函数的使用不当导致 的,这类函数还不少,有 eval()、assert()、preg_replace()、call_user_func()、call_ user_func_array()以及 array_map()等,下面我们来详细看看各自产生漏洞的原理和利 用方式吧。

1.eval 和 assert 函数 这两个函数原本的作用就是用来动态执行代码,所以它们的参数直接就是PHP 代 码。

2.preg_replace 函数 preg_replace 函数的作用是对字符串进行正则处理。

3.调用函数过滤不严 call_user_func() 和 array_map()等数十个函数有调用其他函数的功能,其中的一个 参数作为要调用的函数名,那如果这个传入的函数名可控,那就可以调用意外的函数来执行我们想知道的代码,也就是存在代码执行漏洞。

同类的函数还有如下这些
call_user_func() call_user_func_array (), array_map ()
usort (), uasort () , uksort () , array_filter ()
array_reduce (), array_diff_uassoc(), array_diff_ukey ()
array_udiff() , array_udiff_assoc(), array_udiff_uassoc()
array_intersect_assoc() array_intersect_uassoc ()
array_uintersect (), array_uintersect_assoc ()
array_uintersect_uassoc(), array_walk(), array_walk_recursive () xml_set_ character_data handler () , xmi_set _default_handler ()
xml_set_element_handler (), xmI_set_end_namespace_decl handler ()
xml_ set_external_entity_ref_handler(), xml_set _notation decl_handler()
xml_set_processing_instruction_handler ()

动态函数执行

由于PHP的特性原因,PHP的函数可以直接由字符串拼接,这导致了PIP在安 全上的控制又加大了难度,比如增加了漏洞数量和提高了 PHP 后门的查杀难度。

要找漏洞就要先理解为什么程序代码要这么写,不少知名程序中也用到了动态函数的写法, 这种写法跟使用call_user_func 的初衷是一样的,大多用在框架里,用来更简单更方便 地调用函数,但是一旦过滤不严格就会造成代码执行漏洞。

漏洞防范

采用参数白名单过滤,在可预测满足正常业务的参数情况下,这是非常实用的方式,这里的白名单并不是说完全固定为参数,因在 eval()、assert()和 preg_replace()函数的参数中大部分是不可预测一字不差的,我们可以结合正则表达式来进行白名单限制。如果我们事先已经知道这个 URL 里面的第二个参数 值由数字构成即可满足业务需求,则可以在正则里用\d+来限制第二个参数内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值