代码执行漏洞

代码执行漏洞是指应用程序本身过滤不严,用户可以通过请求将代码注入到应用中执行。当应用在调用一些能将字符串转化成代码的函数(如php中的eval)时,没有考虑到用户是否能控制这个字符串,将造成代码注入漏洞。狭义的代码注入通常指将可执行代码注入到当前页面中,如php的eval函数,可以将字符串代表的代码作为php代码执行,当前用户能够控制这段字符串时,将产生代码注入漏洞

挖掘思路

  • 用户能够控制函数输入
  • 存在可执行代码的危险函数

    常见危险函数

    eval()和assert()、回调函数、动态函数执行、preg_replace函数

    eval()和assert()

    eval() 、assert()将输入的字符串参数作为PHP程序代码来执行

实例

eval()

image.png
image.png

assert()

image.png
image.png

回调函数

原型:mixed call_user_func ( callable $callback [, mixed $parameter [, mixed $… ]] )
$callback 是要调用的自定义函数名称
$parameter 是自定义函数的参数
常见的回调函数:
call_user_func()、call_user_func_array()、array_map()等

实例

image.png
image.png

image.png
image.png

动态函数执行

  1. 定义一个函数
    2. 将函数名(字符串)赋值给一个变量
    3. 使用变量名代替函数名动态调用函数

实例

GET:
image.png
image.png
POST:
image.png
image.png

正则表达式

正则表达式语法规则 普通字符作为原子
限定符 特殊符号作为原子
边界限制符 通用字符类型作为原子
后向引用 自定义原子表作为原子

1 $pattern = ‘/\d/‘; //匹配任何一个数字
2 $pattern = ‘/\D/‘; //匹配任何一个非数字
3 $pattern = ‘/\w/‘; //匹配任何一个 数字、字母(大小写)、下划线
4 $pattern = ‘/\W/‘; //匹配任何一个 非 数字、字母(大小写)、下划线
5 $pattern = ‘/\s/‘; //匹配任何一个空白字符 空格 \n \r 回车 换行
6 $pattern = ‘/\S/‘; //匹配任何一个非空白字符

实例

image.png

image.png
image.png

preg_replace函数

原型:
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
$pattern 正则匹配的内容$replacement 用于替换的字符串或字符串数组
$subject 要进行搜索和替换的字符串或字符串数组
$pattern 存在/e模式修正符修饰 允许代码执行

实例

第一个参数

image.png
image.png
image.png

第二个参数

image.png
image.png

第三个参数

image.png
image.png

修复方案

  • 尽量不要执行外部的应用程序或命令• 使用自定义函数或函数库来替代外部应用程序或命令的功能
  • 使用escappeshellarg函数来处理命令的参数
  • 使用safe_mode_exec_dir来指定可执行的文件路径
  • 将执行函数的参数做白名单限制,在代码或配置文件中限制某些参数