开发辅助工具安全漏洞简述-Apache
表述
Apache是世界选用名列第三的WebLogicalDOC。它可以运转在基本上大部份广为选用的计算机系统网络平台上,由于其虚拟化和可信性被广为选用,是最盛行的Web服务端应用软件众所周知。它加速、可信因此可透过单纯的API扩充,将Perl/Python等正则表达式校对到伺服器中。
单纯而言就是两个称心的,因此能全力支持此基础的HTML、PHP、Perl、Python等词汇。两个字:贼强!Apache的产品目录内部结构
bin——-放置常见的指示辅助工具,比如httpdcgi-bin—放置Linux下常见的指示,比如xxx.shconf——Linux的实用性有关文档,比如httpd.conferror—–严重错误历史记录htdocs—-放中文网站源代码icons—–中文网站辅助工具栏logs——笔记manual—-指南modules—扩充组件Apache基本原理如是说
上面要讲到的Apahce的安全漏洞要要认知Apache的运转基本原理。
许多好友在构筑PHP自然环境时,时常选用PHPStudy、LAMP、XAMPP等应用软件系统自然环境构筑,很难忽视里头的一些基本原理。为的是更快的认知此栏课中讲到的安全漏洞,要没错呵呵Apache与PHP的小秘密。
透过图而言下完备的WEB允诺业务流程,如下表所示图:以内相片源自肉体JunielMargin(矫饰)
图中固定式叙述了Apahce与PHP相互配合顺利完成了一场WEB允诺,Apahce在前,PHP在后,那二者之间怎样进行通讯的呢?先介绍下PHP的构架。如下表所示图
上图源自鸟哥的该文,深入认知Zend SAPIs透过上图可以看出PHP的整体分为5层(类似Android的构架图),分别解释下:
Zend Engine是PHP的底层实现,包含校对和执行,底层由C词汇实现。Zend API、Zend Extension API是基于Zend底层对外封装提供服务。Extendions选用Extension API实现了扩充库、标准库,比如各种内置函数、MySQL连接库等SAPI是重点,全称是Server Application Programming Interface,也就是服务端应用编程接口。PHP就是透过它来和Apache、Nginx、FastCGI交互Application是最上层,也就是我们写的PHP代码了OK,上面的PHP的构架明白了,那么现在关于Apache和PHP通讯的过程还是不明白。众所周知,Apache本身是不全力支持PHP解析的,透过构架图可以知道是透过SAPI进行通讯,那Apache怎样和SAPI通讯呢?Apache怎么知道什么类型的文档要解析为PHP?如果你手动构筑过Apache解析PHP的自然环境,就肯定介绍这两个步骤:
Apache透过LoadModule来加载php5_module组件(php5apache2_2.dll),这样做的目的是让Apache加载php5_module组件来解析PHP文档。意思其实就是用LoadModule来加载php5_module。也就是把php作为Apache的两个子组件来运转。当透过Web访问php文档时,Apache就会调用php5_module来解析php代码。
调用过程可以概括为
HTTP->Apahce->php5_module->sapi->php
讲到这里各位应该明白了Apache是怎么调用php的了。Apache换行解析安全漏洞
影响版本:Apache 2.4.0~2.4.29
影响说明:绕过伺服器策略,上传webshell
自然环境说明:PHP5.5 、 Apache2.4.10
自然环境构筑:
此次自然环境选用docker自然环境构筑,自然环境选用地址Vulhub,自然环境文档有3个Dockerfile(apache自然环境)docker-compose.yml(compose文档,在此自然环境中意义不大)index.php(源文档缺少前台源代码,已补全)执行构建自然环境指示如下表所示(启动后在浏览器中访问http://127.0.0.1:8080)
安全漏洞基本原理
为什么叫换行解析安全漏洞?是因为在上传时在文档名后缀后面加了0x0a(换行),需要注意的是3.PHP是我抓完包后手动加上的,因为后台php代码用的是$_POST[name
为什么加上0x0a就能绕过了呢?先看下index.php的代码
后台是透过黑名单方式过滤了php后缀的文档,根据最开始的知识,什么样的文档算是php文档呢?在
恰好,我们在文档末尾加了0x0a(\n),所以被匹配成功了。
讲到这里有两个概念需要讲清楚:0x0a与0x0d、正则表达式的m修饰符0x0d、\r、CR这三者代表是回车,是同两个东西,回车的作用只是移动光标至该行的起始位置;0x0a、\n、CL这三者代表换行,是同两个东西,换行至下一行行首起始位置;
由上述可知,0x0a才是到下一行,所以在绕过时0x0d不起作用,你也可以在burp抓包时替换十六进制进行观察。m修饰符规定正则表达式可以执行多行匹配,m修饰符也就是RegExp对象的Multiline属性。上面举个例子:由于未选用多行匹配,以内是匹配不出来的,尽管他第三行以an结尾,如果正则改为/an$/m即可匹配。以内是apache的换行解析安全漏洞的基本原理,但也不能称之为安全漏洞,因为这只是Apache的特性,只是开发或者运维人员没有选用到位。
安全漏洞复现
接下来透过实验的方式复现整个利用过程,首先先确认自然环境中的实用性文档是否是
按照正常的安全漏洞利用步骤将其复现
0x01 抓包/改包
准备工作:将浏览器的代理打开、将burpsuit打开开启抓包。
访问安全漏洞页面http://IP:8080/index.php可以看到点击submit进行上传,burp可以抓到
为以下内容:
改完后将数据包给伺服器,此时在浏览器中访问http://IP:8080/phpinfo.php%0a便可以看到phpinfo的界面,说明利用成功。
在Windows下的表现
将安全漏洞代码复制到windows的自然环境中,进行访问、抓包(和该文中在Linux的方法一样),最终会出现以下问题:根据上图可以发现,move_uploaded_file函数已经被执行了,说明我们绕过了黑名单的检测,只不过在windows创建文档的时候由于结尾是换行符,windows不允许,所以创建失败了。
index.php源代码
Apache多后缀解析安全漏洞
影响版本:选用module模式与php结合的大部份版本 apache存在未知扩充名解析安全漏洞,选用fastcig模式与php结合的大部份版本apache不存在此安全漏洞。
影响说明:绕过伺服器策略,上传webshell
自然环境说明:PHP7 、 任意版本的选用module模式与php结合的apache
安全漏洞基本原理:
什么是多后缀解析?我们来看个例子,假设访问index.php.abc,这个就是多后缀解析,Apache在特定的实用性下,会将其解析为php文档。这样可以绕过后台的后缀检测,达到上传webshell的目的。那为什么会产生多后缀解析?哪个实用性引起的?
答案是:上面两个实用性都可以实现解析文档名中包含.php后缀的文档,apache对文档后缀名的识别是从后向前进行匹配的,以单个.作为分隔符。当遇到不认识的后缀时继续往前,直到识别,若都不识别就不做处理。在/etc/mime.types中有表述哪些后缀是apache识别的。关于Apache多后缀的解释,可以看官方文档
。
apache全力支持php有多种模式,常见的有module、cgi、fastcgi等,此安全漏洞存在于module模式。安全漏洞复现
复现过程非常单纯,将webshell后缀名改为http://xxx.php.xxx上传即可,如果程序验证要要相片文档,可以修改为xxx.php.png。效果截图:
windows下效果相同,不再赘述。
Apache SSI远程指示执行安全漏洞
影响版本:Apache全版本(全力支持SSI与CGI)
影响说明:绕过伺服器策略,上传webshell
自然环境说明:PHP7.1 、 Apache2.4.25
自然环境构筑:
此次自然环境选用docker自然环境构筑,自然环境选用地址Vulhub,自然环境文档有2个docker-compose.ymlupload.php执行构建自然环境指示如下表所示(启动后在浏览器中访问http://127.0.0.1:8080)
安全漏洞基本原理
SSI(server-side includes):是放置在HTML页面中的指令,它可以将动态生成的内容添加到现有的HTML页面,而不必透过CGI程序或其他动态技术来提供整个页面。以内是表述选用在Apache官网对SSI的表述,说白了就是可以在HTML中加入特定的指令,也可以引入其他的页面。开启SSI需要单独实用性Apache,可以参考SSI实用性。
SSI可以顺利完成查看时间、文档修改时间、CGI程序执行结果、执行系统指示、连接数据库等操作,功能非常强大。
我们要利用的就是SSI执行系统指示的功能,正常的两个包含SSI指令的文档,可以如下表所示内容:文档名保存为test.shtml,这个后缀取决于Apache的实用性,默认是此后缀。
当后台对扩充名校验不严格时,可以内传此类上传webshell:
反弹shell: