目录
漏洞原理
影响版本
漏洞复现
漏洞原理
CGI:是一种协议,定义了web服务器传递的数据格式。
FastCGI:优化版的CGI程序
PHP-CGI:PHP解释器,能够对PHP文件进行解析并返回相应的解析结果
PHP-FPM:FastCGI进程管理程序
当Nginx得到一个用户请求时,首先对url进行解析,进行正则匹配,如果匹配到以.php后缀结尾的文件名,会将请求的PHP文件交给PHP-CGI去解析。其中处理模块如下:
location ~ \.php$ {root html;include fastcgi_params;fastcgi_pass IP:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;fastcgi_param DOCUMENT_ROOT /var/www/html;
}
以.php结尾的文件都会交给该模块处理,其中fastcgi_pass就是Nginx与PHP-FPM之间的媒介,通过ip+port的方式将请求转发给PHP解释器
CVE-2013-4547漏洞是由于非法字符空格和截止符导致Nginx在解析URL时的有限状态机混乱,导致攻击者可以通过一个非编码空格绕过后缀名限制。假设服务器中存在文件‘123.png ',则可以通过访问如下网址让服务器认为'123.png '的后缀为php
http://192.168.146.1/123.png \0.php
从代码层面来说,我们请求的url中123.png[0x20][0x00].php正好与location模块中的.php相匹配,但进入该模块后Nginx确认为请求的文件名是'123.png ',就设置其为script_name的值交给CGI进行解析,最终造成解析漏洞
想象一下,你有一个商店(Nginx服务器),这个商店里有很多商品(网页文件),其中一些是特殊的商品(PHP文件),需要特别的售货员(PHP-FPM)来处理。正常情况下,只有当顾客(用户)要求购买特殊商品时(请求.php文件),才会叫来特别的售货员。
但是,商店(Nginx)在检查顾客想要购买的商品名时,有个漏洞。如果有人(攻击者)在商品名里加了些奇怪的字符,比如一个看不见的空间(空格字符)和一个特殊的结束标记(空字符),商店就可能会搞混。
比如,攻击者想要买一件叫“123.png ”(注意,这里商品名末尾有个空格)的普通商品,但他却假装这是件特殊商品,于是在商品名后面加上了“.php”。就像这样:“123.png [空格][空字符].php”。由于商店的检查系统有漏洞,它可能会误以为这是一件特殊商品,于是就叫来了特别的售货员(PHP-FPM)来处理。
影响版本
Nginx 0.8.41 ~ 1.4.3
Nginx 1.5.0 ~ 1.5.7
漏洞复现
进入vulhub项目对应的目录:cd vulhub-master\nginx\CVE-2013-4547
编译容器:“docker-compose build”
启动Docker容器,输入命令:“docker-compose up -d”。
查看容器状态,输入命令:“docker ps”并查看对应容器ID。
进入容器,输入命令:“docker exec -it 容器id /bin/bash”。
利用攻击主机浏览器访问:http://靶机ip:8080
利用该图片上传页面,上传一个图片webshell,代码如下:
GIF98A
<?php phpinfo();?>
成功上传,(写一遍2021的burp抽风了,下面改为用1.7的老版本了)
访问上传的图片马,可以正常访问
使用0x00截断将图片马解析为PHP文件,访问该url并抓包修改192.168.2.110:8080/uploadfiles/1.png%20a.php
原始数据包如下
a作为占位符,将%20删除后,%20需要改成空格,不然hex把%20也转了,进入Hex中把表示a的61修改为00,最后发送请求
最终数据包如下:
按照上述修改后Nginx收到的请求就变为了:http://192.168.146.134/uploadfiles/phpinfo.png \0.php,使得png被解析为了PHP