1.深入代码/命令注入
由于没有针对代码中可执行的特殊函数入口做过滤,导致用户可以提交恶意语句,并交由服务器端执行。
代码/命令注入攻击中Web服务器没有过滤类似 system(),eval(),exec()等函数的传入参数。
代码注入
eval(string code)
eval把字符串作为PHP代码执行 Code_str是PHP代码字符串,需要是一个完整的语句(结尾需要加分号)一句话木马就是使用这个函数
assert(eval("echo 123;"));
assert把整个字符串参数当php代码执行,eval把合法的php代码执行。call_user_func('assert','phpinfo()');
把第一个参数作为回调函数调用,可以使用var_dump(is_callable('eval'));
来判断是否能回调,eval就是不能回调的函数。call_user_func_array('system',array('whoami','pwd'));
调用一个回调函数,传入的参数需要是一个数值,但是只会返回第一个参数执行的结果create_function( string $args, string $code )
args是要创建的函数的参数,code是函数内的代码。preg_replace('abc/e',$replacement,'/abcd' )
执行一个正则表达式的搜索和替换 /e 修正符使 preg_replace将 replacement 参数当做 PHP 代码(php7弃用)array array_map( assert , ['phpinfo()'] )
array_map为数组的每个元素应用回调函数
案例
<?php
show_source('call_user_example.php');
$price=$_GET['price'];
$code = 'echo $name. '.'的价格是'.$price.';';
$b = create_function('$name',$code);
$b('iPhone');
?>
create_function()的使用等于构建用户自定义的一个方法
function b($code) {
'echo $name.'.'的价格是'.$price.';'
}
$price的两边没有引号闭合,可以直接传入123闭合语句或者直接闭合方法,再执行代码注入
call_u