outpath 参数:保存命令执行输出结果的文件路径(如 /tmp/xx),便于在页面上显示,另外该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点。
sopath 参数:指定劫持系统函数的共享对象的绝对路径(如 /var/www/bypass_disablefunc_x64.so),另外关于该参数,你应注意 web 是否可跨目录访问到它。
首先,想办法将 bypass_disablefunc.php 和 bypass_disablefunc_x64.so 传到目标有权限的目录中:
然后将bypass_disablefunc.php包含进来并使用GET方法提供所需的三个参数:
/?Ginkgo=aW5jbHVkZSgiL3Zhci90bXAvYnlwYXNzX2Rpc2FibGVmdW5jLnBocCIpOw==&cmd=id&outpath=/tmp/outfile123&sopath=/var/tmp/bypass_disablefunc_x64.so # include("/var/tmp/bypass_disablefunc.php");如下所示,成功执行命令:
成功执行/readflag并得到了flag:
在蚁剑中有该绕过disable_functions的插件:
我们选择LD_PRELOAD模式并点击开始按钮,成功后蚁剑会在/var/www/html目录里上传一个.antproxy.php文件。我们创建副本, 并将连接的 URL shell 脚本名字改为.antproxy.php获得一个新的shell,在这个新shell里面就可以成功执行命令了。
利用 ShellShock(CVE-2014-6271)使用条件:
Linux 操作系统
putenv()、mail()或error_log()函数可用
目标系统的/bin/bash存在CVE-2014-6271漏洞
/bin/sh -> /bin/bashsh 默认的 shell 是 bash
原理简述该方法利用的bash中的一个老漏洞,即Bash Shellshock 破壳漏洞(CVE-2014-6271)。
该漏洞的原因是Bash使用的环境变量是通过函数名称来调用的,导致该漏洞出现是以(){开头定义的环境变量在命令 ENV 中解析成函数后,Bash执行并未退出,而是继续解析并执行shell命令。而其核心的原因在于在输入的过滤中没有严格限制边界,也没有做出合法化的参数判断。
一般函数体内的代码不会被执行,但破壳漏洞会错误的将"{}"花括号外的命令进行执行。PHP里的某些函数(例如:mail()、imap_mail())能调用popen或其他能够派生bash子进程的函数,可以通过这些函数来触发破壳漏洞(CVE-2014-6271)执行命令。
利用方法我们利用 AntSword-Labs项目来搭建环境:
git clone https://github.com/AntSwordProject/AntSword-Labs.git cd AntSword-Labs/bypass_disable_functions/2 docker-compose up -d搭建完成后访问 :18080,尝试使用system函数执行命令失败:
查看phpinfo发现设置了disable_functions:
我们使用蚁剑拿下shell:
AntSword 虚拟终端中已经集成了对 ShellShock 的利用,直接在虚拟终端执行命令即可绕过disable_functions: