php代码审计4审计代码执行漏洞

代码执行漏洞

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

挖掘思路:存在可执行代码的危险函数,用户能控制函数的输入。

常见危险函数

eval和assert函数:

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

代码1:

<?php

if(isset($_GET['cmd'])){

$cmd = $_GET['cmd'];

eval("\$cmd = $cmd");/assret()函数也是一样的,这里没对用户输入做过滤

echo "ok"

}else{

echo "not";

}

>

回调函数:

mixed call_user_func(callable $callback[,mixed $parameter[,mixed $....]])

$callback是要调用的自定义函数名称

$parameter是自定义函数的参数

代码2:

<?php

function callback(){

$x = $_GET['cmd'];

eval($x);//没做限制

}

call_user_func(function 'callback',$x);//回调了函数

>

常见回调函数:call_user_func() call_user_func_array() array_map()等

动态执行函数

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

代码3:

<?php

$_GET['a']($_GET['b']);//接受get请求a的参数作为一个函数,b是作为a函数里的参数

>

正则表达式(做代码审计时,会遇到正则表达式,了解正则会更容易)

<?php

//普通字符作为原子

$pattern = '/abc/';

$str = 'abcdefghijklmn';

preg_match_all($pattern,$str,$res);

var_dump($res);

//特殊符号的字符作为原子

$pattern = '/\[php\]/';

$str = '[php]12345';

preg_match_all($pattern,$str,$res);

var_dump($res);

//通用字符作为原子

$pattern1 = '/\d/'; //0-9

$pattern2 = '/\D/'; //a-zA-Z

$str = '123132asaaaaa222';

$preg_match_all($pattern2,$str,$res);

var_dump($res);

//自定义原子

$pattern1 = '/[aj]sp/'; //匹配[aj]中任意一个字符作为原子的asp jsp

$str = 'jjjjspspspsp';

preg_match_all($pattern1,$str,$res);

var_dump($res);

//限定符

$pattern1 = '/go*gle/'; // *匹配掐面出现原子次数0次 1次或多次

$pattern2 = '/go+gle/'; // +匹配前面出现的原子1次或多次

$pattern3 = '/go?gle/'; // ?匹配前面出现的原子0次或1次

$str = 'google';

preg_match_all($pattern3,$str,$res);

var_dump($res);

//边界限定

$pattern1 = '/^abc/'; // ^匹配输入字符开始的位置,必须是abc形式的开头

$pattern2 = '/abc^/'; // ^匹配输入字符结尾的位置,必须是abc形式的结尾

$pattern3 = '/^abc$/'; // ^$只匹配某字符

$str = 'abc2342dfads';

preg_match_all($pattern3,$str,$res);

var_dump($res);

//反向引用

$pattern = '/\d{4}(-)\d{2}\\1\d{2}/'; // \\1代表第一个()缓冲区

$str = '2019-01-28';

preg_match_all($pattern,$str,$res);

var_dump($res);

>

preg_replace函数:

mixed preg_replace(mixde $pattern,mixed $replacement,mixed $subject[,int $limit = -1[,int &$count]])

$pattern 正则匹配的内容 $pattern存在/e模式修正符修饰,允许代码执行

$replacement 用于替换的字符串或字符串数组

$subject 要进行搜索和替换的字符串或字符串数组

修复方案:

尽量不要执行外部的应用程序或命令

使用自定义函数或函数库来替代外部应用程序或命令的功能

使用escappeshellarg函数来处理命令的参数

使用sare_mode_exec_dir来指定可执行的文件路径

将执行的参数做白名单限制,在代码或配置文件中限制某些参数