代码执行漏洞

代码执行漏洞

  • 原理
  • 相关函数
  • 形成原理
  • 漏洞防御

原理

代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。

相关函数

  • eval()
  • assert()
  • preg_replace()
  • call_user_func()
  • call_user_func_arrary()
  • arrary_map()
  • 动态函数($a($b))
  • 可变变量

形成原理

  • eval()和assert(), 用于动态执行代码
 
assert($_GET['test']);
?>

代码执行漏洞_第1张图片

  • preg_replace()函数, 对字符串进行正则处理
    • preg_replace(pattern, replacement, subject)
    • pattern: 要搜索的模式,可以是字符串或一个字符串数组。
    • replacement: 用于替换的字符串或字符串数组。
    • subject: 要搜索替换的目标字符串或字符串数组。

测试:搜索subject中匹配pattren的部分,用replacement替换。当pattren参数存在修饰符e时,replacement会被当成php代码执行。


preg_replace("/\[(.*)\]/e", '\\1', $_GET['test']);
?>

代码执行漏洞_第2张图片

  • call_user_func()和array_map() 等函数,可调用其他函数。若其中参数作为调用的函数名,这个参数可控则可以执行代码。
    测试:call_user_func() 把第一个参数作为回调函数调用

call_user_func($_GET['test'],'phpinfo()');
?>

代码执行漏洞_第3张图片
array_map(),将自定义函数作用于每个数组成员中。


array_map($_GET['var'], array('phpinfo()'));
?>

在这里插入图片描述
同类函数
代码执行漏洞_第4张图片
在这里插入图片描述

  • 动态函数 执行,php函数可以由字符串拼接

    测试:接受GET请求的a参数作为函数,b参数作为函数的参数。


$_GET['a']($_GET['b']);
?>

在这里插入图片描述

  • 可变变量 一个变量名可以动态的设置使用
    测试:双引号会解析中间的变量

$a="${@phpinfo()}";
?>

在这里插入图片描述
其中@不可省略,但可使用其他字符代替

  • 空格: a = " a=" a="{ phpinfo()}";
  • 注释符: a = " a=" a="{/**/phpinfo()}";
  • tab: a = " a=" a="{ phpinfo()}";
  • 回车换行符: a = " a=" a="{
    phpinfo()}";
  • 加号: a = " a=" a="{+phpinfo()}";
  • 减号: a = " a=" a="{-phpinfo()}";
  • 感叹哈: a = " a=" a="{!phpinfo()}";
  • ~,\等

漏洞防御

  1. 尽量减少命令执行函数的使用,并在disable_functions 中禁用
  2. 在进入命令执行的函数或方法之前,对参数进行过滤
  3. 参数的值尽量使用引号包裹,并在拼接前调用addslashes 进行转义
  4. 关键字白名单

你可能感兴趣的:(web漏洞,安全漏洞,漏洞,代码执行漏洞,php)