文件上传漏洞基础知识
文件上传过程中的解析漏洞
前言:我们在上一期关于文件上传漏洞的博客中将ctfshow 中有关文件上传漏洞的题都过了一遍,本篇中我们
来进一步学习文件上传漏洞 本篇将分为两个部分来进行,第一部份是中间件解析,第二部分是编辑器相关
1.0 iis的文件解析
有关iis的相关漏洞我们在之前的博客讲解过,今天把他结合到文件上传去一起看,比如IIS 6
版本的文件名,目录名解析,即x.asp;.jpg
和x.asp/x.jpg
这两种类型,这两种类型的
文件在上传时虽然被识别为Jpg文件,但实际上是可以被iis中间件当作asp文件进行解析的,
这就给我们文件上传创建了条件
至于iis7.0的漏洞则和ngnix相同
1.1 apache httpd换行解析漏洞
Apache HTTPD在2.4.0~2.4.29版本中存在一个解析漏洞。 编号为CVE-2017-15715
该漏洞应用于黑名单限制 php文件上传的情况下
漏洞产生原理为:在 Apache httpd 2.4.0 到 2.4.29 中,
以将“$”匹配到恶意文件名中的换行符(\x0A),而不是仅匹配文件名的末尾。这可以在某些
文件的上传被外部阻止的环境中被利用,但只能通过匹配文件名的尾部部分。例如,
1.php\0xA将被按照PHP后缀进行解析,导致绕过一些服务器的安全策略。
以vulhub中的例题为例子
本体的代码将php
php3
php4
php5
phtml
pht
为后缀的文件加入黑名单,进制上传,在
该版本的中间件配置文件中,有
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
意思就是将符合上面正则表达式的文件解析为php文件运行,但我们注意到匹配的最后有个
$
意思是进行行尾匹配,但是正是因为存在它,导致如果我们在行尾加上\n
\r
也会被正常
的匹配上从而解析成php文件进行执行,即绕过了代码的过滤,又可以将上传的文件作为
php文件解析,但由于换行和回车属于特殊字符,无法直接输入,所以我们利用时要抓包进
行更改
漏洞利用:抓到上传的请求,在header中的from-data:name="name"xxx.php
的后面加一个
空格,我们已知空格的ascii编码是%20
,点击添加的空格找到对应的20,将其改为0a,便可
成功上传后门代码,注意,文件名现在是xxx.php%0a
所以访问时也需要加换行符
1.2 apache多后缀解析漏洞
漏洞原理:apache支持同一个文件拥有多个后缀,且不同的后缀执行不同的命令
比如
AddType text/html .html
AddLanguage zh-CN .cn
为.html的后缀文件增加meiad-type 设置为text/html 为.cn后缀设置语言为 zh-CN
因此如果有一个文件的文件名为xxx.cn.html
用户在请求该文件时则会获得一个语言为zh-
CN,media-type,值为text/html
的html文件,同理,如果我们这样设置
AddHandler application/x-httpd-php .php
则文件名中如果包含.php,即使不是php文件也会当作php文件执行。
我们可以利用此方式通过构造多后缀进行恶意后门的上传
我们在实际使用时需要去进行测试
1.3 apache位置后缀解析漏洞
此漏洞产生的原因和前者很像,利用方式有两种 ,第一种
AddHandler application/x-httpd-php . # 这里使用了一个点“.”作为后缀名,意味着任何后缀都会被当作PHP脚本处理
在apache配置文件中进行配置,就如上面这种
第二种:由于apache在遇到无法识别的文件类型时会像左读取,直到可以解析,所以我们
可以这样构造文件名:xxx.php.jepg
服务器默认的配置文件如果识别不了jepg文件,就会
向左继续解析,从而将其作为php文件进行解析,从而上传后门代码
1.4 ngnix文件逻辑名漏洞
漏洞编号:cve-2013-4547
适用版本: 0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
该漏洞存在于Nginx对于php的配置上,如果配置不当,就会导致nginx对%00
等特殊字符出现
解析问题,结果是nainx将特定构造的url交给php处理,而nginx英文特殊字符原因,无法接受
有特殊字符的的url,从而再%00处阶段,造成客户上传的文件被当作php进行解析
利用过程:将图片码上传,请求上传的图片时抓包,然后起始行中在图片文件地址后加上一个
空格和.php,比如GET /upload/1.png .php
在十六进制界面将第二个空格改为00
然后发送
请求,或者直接改起始行,改为GET /upload/1.png%00.php
此处这个漏洞属于00截断漏洞,文件系统在处理寻找文件的时候会有偏差,PHP语言的底层是
通过C语言来实现的,C语言字符串结束是00。PHP解释引擎在访问这个文件的时候,遇到了
00,认为该文件在%00处就结束了,所以读取的是png文件,但是是以php方式执行的。
1.5 编辑器漏洞
网站引入的编辑器也会产生漏洞,即使网站本身的代码并没有漏洞,但是编辑器造成的漏洞
也会使整个网站产生漏洞