提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
Nginx 文件名逻辑漏洞(CVE-2013-4547)复现。 新手向。小白也能听得懂的。面向小白详细讲解。配合BurpSuite新老版本抓包。
前言
Nginx 文件名逻辑漏洞(CVE-2013-4547) ,记录一下我的学习过程,总结一下经验,希望能给后面的人提供帮助,为了复现和成功解析PHP网页我搞了很久.我这里使用了新老版本的BurpSuite去抓包,详细过程请见下文.
使用的BurpSuite版本: BurpSuite Free Edition v1.5和BurpSuite Community Edition v2021.2.1
靶机:CentOS 7 IP:192.168.254.128
攻击机:Kali Linux 2021.2、Kali 1.0.5
使用的靶场:Vulhub
漏洞原理
这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。
举个例子,比如,Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的写法如下:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
正常情况下(关闭pathinfo的情况下),只有.php后缀的文件才会被发送给fastcgi解析。
而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。
fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。
所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。
再举个例子,比如很多网站限制了允许访问后台的IP:
location /admin/ {
allow 127.0.0.1;
deny all;
}
我们可以请求如下URI:/test[0x20]/…/admin/index.php,这个URI不会匹配上location后面的/admin/,也就绕过了其中的IP验证;但最后请求的是/test[0x20]/…/admin/index.php文件,也就是/admin/index.php,成功访问到后台。(这个前提是需要有一个目录叫“test ”:这是Linux系统的特点,如果有一个不存在的目录,则即使跳转到上一层,也会爆文件不存在的错误,Windows下没有这个限制)
漏洞复现
1.启动漏洞环境:
#在CentOS 7上进入Vulhub的漏洞目录
cd 桌面/vulhub/nginx/CVE-2013-4547/
#启动环境
sudo docker compose up -d
#查看漏洞运行的端口
sudo docker-compose ps
环境启动后,可以在Kali Linux上访问http://your-ip:8080/即可看到一个上传页面。
2.上传文件并抓包
新建一个txt文本并写:
<?php phpinfo(); ?>
保存为1.php文件。然后在网页上进行上传1.php文件,并提交。在BurpSuite上点击Forward进行转发,实现文件上传
可以发现文件上传失败,并且提示无法支持的文件类型上传。
这个环境是黑名单验证,我们无法上传php后缀的文件,需要利用CVE-2013-4547。我们上传一个“1.gif”
修改”1.php”文件为”1.gif”,并再次上传文件。
注意:在BurpSuite里面记得要给"1.gif "后面添加一个空格。
点击Forward,进行转发,回到浏览器上,会发现上传文件成功。在BurpSuite的HTTP history上也能同样看到 File uploaded successfully: /var/www/html/uploadfiles/1.gif .说明文件上传成功。
上传后,因为这个文件后缀名含有空格,在url中需要加入%20访问该文件,测试该文件是否上传成功(这部分可以忽略,不是必须项。只是为了查看是否上传了文件)。
3.修改Hex值并解析PHP网页
可以新开一个标签页。访问http://your-ip:8080/uploadfiles/1.gif.php
此时,BurpSuite再次抓包,这回修改抓包的URL地址。
这里新老版本的BurpSutie操作有些不一样,因为新版的BurpSuite里面的Hex功能被删除了。但是我们要利用Hex功能来对其进行修改。
1.先说说BurpSuite v1.5版本的方法。
在Intercept界面可以看到我们抓包的网页代码。点击Action,选择Send to Repeater,或者直接快捷键Ctrl + R。
点击Repeater界面,会看到我们刚刚发送的抓包页面。
选择Request项的Hex功能。在这里进行修改。对这里的2e进行插入一个字节操作。右键选择Insert byte进行一个字节的插入,如果插入错了。可以选择Delete byte进行一个字节的删除。添加2个字节分别为“20”“00”。
修改完会发现右边的URL变成了1.gif .php.
点击Go,就可以发送请求,在Responsed项的Render功能上就成功解析了PHP网页了。
复制粘贴一下这里Repeater>Request>Raw的uploadfiles/1.gif .php到Proxy>Intercept>Raw里面的GET请求。
点击Forward转发,可以发现浏览器上实现了对PHP网页的解析。
2.新版本的BurpSuite Community Edition v2021.2.1
先同老版本一样,抓包,然后发送到Repeater.
由于新版本的Hex功能改了。所以我们直接在gif.后面加个空格.并且你选中这个空格会发现在右边出现了Hex,并且值为20.如果你看不到Inspector,请点击它以展开选项。
在空格后面我们随便输入一个数字,我这里输入0,然后选择数字0。可以看到对应的Hex的值。
修改这个值为00,并点击Apply changes,你会发现数字0消失了。
点击Send(同Go一样)。发送修改后的请求,在Response上可以看到已经成功解析PHP网页了。
同理,复制我们修改的 uploadfiles/1.gif .php到Proxy>Intercept>Raw.点击转发。在浏览器成功了对PHP网页的解析。
总结
预防CVE-2013-4547漏洞需要从配置和安全实践上进行多方面的改进。以下是一些具体的预防措施:
1. 更新Nginx版本
最重要的措施是更新到修复了该漏洞的Nginx版本。开发团队已经在新版本中修复了此漏洞。
# For Debian/Ubuntu
sudo apt-get update
sudo apt-get upgrade nginx
# For Red Hat/CentOS
sudo yum update nginx
2. 配置文件路径安全性
确保Nginx配置文件中的文件路径和访问控制设置是正确的,避免使用容易被绕过的路径或符号链接。配置文件应该限制用户对敏感文件的访问。
3. 使用安全的文件名和路径
确保应用程序和服务器不会生成或接受含有潜在恶意字符的文件名和路径。对用户输入的文件名和路径进行严格的校验和过滤,防止包含“…/”等可能用于路径遍历的字符。
4. 限制符号链接
在Nginx配置中禁用符号链接的使用,或者限制符号链接的访问。
http {
disable_symlinks on;
...
}
5. 使用Web应用防火墙(WAF)
部署Web应用防火墙,可以检测和阻止常见的攻击模式,包括路径遍历等文件名逻辑漏洞利用尝试。常见的WAF解决方案包括ModSecurity等。
6. 定期安全审计和代码审查
定期对服务器配置和应用代码进行安全审计和代码审查,及时发现并修复潜在的安全漏洞。
7. 最小化权限原则
限制Nginx运行用户的权限,只给予其最低限度的权限,确保即使发生漏洞利用,攻击者也不能对系统造成更大破坏。
8. 设置严格的访问控制
在Nginx配置中使用严格的访问控制策略,限制对敏感文件和目录的访问。
location / {
allow 192.168.1.0/24;
deny all;
}
通过以上措施,可以显著降低Nginx服务器受到CVE-2013-4547漏洞攻击的风险,确保服务器和应用的安全性。