php代码审计小技巧
1、file_put_contents()函数:众所周知此函数是将一个字符串写入至文件中。
看到此函数说明当传入数据为数组时,会被PHP强制转换为字符串,因此会绕过正则达到getshell的目的。
<?php $test = [1,2,3,4,5]; var_dump($test); $test1 = (string)$test; print_r("string is :" .$test1); var_dump($test1); ?>
以上代码可以看到被强制转换数据类型后字符串的值
可以清楚的看到被强制转换后字符串的值为:Array、故此可以绕过部分过滤正则
例如:
<?php $test = $_GET['test']; if(preg_match('/[<?]/',$test)){ die("error"); } file_put_contents('shell.php',$test); ?>
首先将test的值设置为字符串:
可以看到为错误,并未写入数据,此时再将test的值变为数组:
此时虽然出错,但恶意数据已近被写入至文件中: