注意:仅用于技术讨论,切勿用于其他用途,一切后果与本人无关!!!
个人博客地址:HJW个人博客
理论基础:
建议提前学习nginx的原理:Nginx服务漏洞详解 - 知乎
漏洞原理:
影响版本:Nginx 0.8.41 到 1.4.3 / 1.5.0 到 1.5.7。
出现这样的漏洞主要是nginx与cgi解析产生了冲突而产生的。
这个漏洞其实和代码执行没有太大的关系,主要原因是错误地解析了请求的URL,错误地获取到用户请求的文件名,导致出现权限绕过、代码执行的连带影响。非法字符空格和截止符(\0)会导致Nginx解析URI时的有限状态机混乱,此漏洞可导致目录跨越及代码执行。
1、查看配置文件
这里的security.limit_extensions为空说明可以解析所有后缀的文件,这里就说明 .php 是可以当成php代码执行的。
2、众所周知正则匹配遇到\0
是不会停止匹配的,但是nginx遇到\0
就会停止。从而只会解析到前面的文件,以1.jpg\0.php为例,只会解析到1.jpg,假如这时里面存在木马,则可以直接代码执行。
3、在仔细调试代码发现但如果nginx发现URI中存在空格会接着处理URL中剩余的部分
漏洞复现之CVE-2013-4547_Blood_Pupil的博客-CSDN博客
结合1、2、3点很容易构造出,空格加零零截断可以成功绕过。
http://127.0.0.1/uploadfiles/shell.jpg[20][00].php
nginx对上面的URI处理后将shell.jpg[20][00].php交给fastcgi处理,由于零截断fastcgi实际处理的文件为abc.jpg[20],这个文件需要存在fastcgi才能正常处理。在Windows环境下由于命名文件时不允许文件后缀末尾存在空格所以自动将其修复为abc.jpg,这种情况下我们只需要上传一张包含代码的名字为abc.jpg的文件就可以利用漏洞了。但是在Linux情况下情况就不一样了。在Linux环境中由于允许文件后缀名最后存在空格所以我们需要确保我们传过去的文件名为abc.jpg[20],我们可以在文件上传时使用Burpsuit在后缀名后加一个空格从而实现利用
漏洞复现:
1、上传木马文件,文件后缀记得空格 => shell.jpg[20]
2、访问路径:http://192.168.131.130:8080/uploadfiles/shell.jpgaa.php?8=phpinfo();,使用十六进制将aa修改为[20][00]
3、从而得到出现phpinfo();
修复建议:
将nginx进行升级。
参考文章: