1.这题的源码有点多,我遍历之后大概整理出关键的流程是这样的:
先是把上传的文件进行初始文件命名,命名规则是"upload"+上传的文件名,然后把后缀名截取出来,拿去跟白名单对比,如果在白名单里面,就对文件进行移动保存,最后更改文件名,文件名的格式是"upload"+叠加数+后缀;如果不在白名单里面那就报出错误信息说“上传失败,无法上传该类型文件”。
2.我上传了一个 fputs.php.jpg,由于他的后缀jpg是在白名单里的,所以可以正常上传,但是名字却被更改了。路径也不是upload文件夹而是直接的upload-labs网站根目录,我怀疑可能是作者写错了,少写了个斜杠所以上传目录不是upload
那么会不会出现一种情况,就是保存了没改名?
答案是有可能的,就是我们上传大量的符合条件的文件,然后所有的都需要改名,由于条件竞争,总会有的来不及rename改名。
没改名又该怎么利用?
那这可以配合web中间件的解析漏洞使用,关于各类中间件解析漏洞汇总
3.因为我这里使用phpstudy没法触发解析漏洞,所以我把实验服务器换成了centos6.5,里面也搭建好了upload-labs,用于证明实验
我在upload-labs的upload目录下,创建了个文件 fputs.php.jpg,内容如下:
<?php fputs(fopen('info.php','w') , '<?php phpinfo()?>');?>
可以看到跟我们之前利用的php写文件一样,执行成功就在本目录下创建个info.php文件
然后我去访问它,访问成功。
我们再去看下服务器的upload目录,可以看到info.php已经写了进去
那么也就是说我们刚才访问 fputs.php.jpg,相当于是把他当成php文件执行了一次,这便是解析漏洞,php后面跟一个apache不认识的拓展名都会被当场php文件执行。
4.那么基于这个原理,我们使用条件竞争来突破
截取上传包发送到Intruder自动化攻击模块
paylaod 位置不用设置,paylaod类型 null paylaod ,攻击方式 Continue indfinitely
然后到抓取访问 fputs.php.jpg的包,这里有点奇怪抓不到直接访问 fputs.php.jpg的包
那我们改动一点点再抓 (或者就是可以用gif,png,7z,rar等后缀,这些不会出现抓不到包的问题,apache也可以解析成php)
然后发送到 Intruder的时候再改好,文件名前面要加upload
paylaod 位置不用设置,paylaod类型 null paylaod ,攻击方式 Continue indfinitely
5.开始条件竞争,不一会访问文件的那端就出现了200的响应码,查看响应包发现访问uploadfputs.php.jpg成功,也就是说我们成功的在那个极短的时间,文件还没来的及改名前,成功让他执行了
可以看到 info.php已经写入了服务器。
然后我们去访问
嘿嘿,执行成功我真是个小天才
6.关于解析漏洞这个,如果大家想去完整的复现这次实验,那么可以自己想办法弄个有解析漏洞的web服务器容器,不仅限于apache。
或者可以这样,上传个文件 shell.jpg,内容同样是写入恶意代码。然后使用前面说过的文件包含漏洞去执行他,这个没问题吧?一边上传,然后另一边去不断文件包含访问,这个也是可以的,都能证明我们的条件竞争实验