欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

代码执行漏洞

程序员文章站 2022-07-15 15:46:13
...

原理

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

相关函数

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

形成原理

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

代码执行漏洞

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

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

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

代码执行漏洞

  • call_user_func()和array_map() 等函数,可调用其他函数。若其中参数作为调用的函数名,这个参数可控则可以执行代码。
    测试:call_user_func() 把第一个参数作为回调函数调用
<?php
call_user_func($_GET['test'],'phpinfo()');
?>

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

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

代码执行漏洞
同类函数
代码执行漏洞
代码执行漏洞

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

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

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

代码执行漏洞

  • 可变变量 一个变量名可以动态的设置使用
    测试:双引号会解析中间的变量
<?php
$a="${@phpinfo()}";
?>

代码执行漏洞
其中@不可省略,但可使用其他字符代替

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

漏洞防御

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