1.BUUCTF刷题-Upload-Labs-Linux 1
这道题有20关,来一关一关看吧。
首先对文件上传漏洞有个了解吧。
文件上传漏洞:
文件上传漏洞原理:大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。
一般来说文件上传过程中检测部分由客户端javascript检测、服务端Content-Type类型检测、服务端path参数检测、服务端文件扩展名检测、服务端内容检测组成。但这些检测并不完善,且都有绕过方法。
1.客户端检测绕过(js检测):
利用firebug禁用js或使用burp代理工具可轻易突破。
2.服务端MIME检测绕过(Content-Type检测):
使用burp代理,修改Content-Type的参数
3.服务端扩展名检测绕过:
文件名大小写绕过,例如Php,AsP等类似的文件名
后缀名字双写嵌套,例如pphphp,asaspp等
可以利用系统会对一些特殊文件名做默认修改的系统特性绕过
可以利用asp程序中的漏洞,使用截断字符绕过
可以利用不再黑名单列表中却能够成功执行的同义后缀名绕过黑名单的限制
可以利用解析/包含漏洞配合上传一个代码注入过的白名单文件绕过
4.服务端内容检测绕过:
通过在文件中添加正常文件的标识或其他关键字符绕过
更具体的内容查看上面的推荐博客,就不复制粘贴了-.-!!
第一关:本地js检测绕过
题目:
分析:
先看看源码吧:
根据提示:“本pass在客户端使用js对不合法图片进行检查!”可以知道上传文件的检测仅发生在本地,查看源码可以知道检测逻辑是用文件的后缀名来匹配“.jpg|.png|.gif”字符串来判断文件是否合法。
那就把两种绕过方式都尝试一下把。
方法一:burp拦截修改
需要用到:
1.BurpSuitePro
2.中国蚁剑
3.一个简单的WebShell
首先,使用burp开启拦截。
Intercept is on 拦截已开启。
然后上传Shell.jpg文件,此时数据包被拦截在burp中发不出去。在burp中将filename修改为"Shell.php"即可。
点击Forward把包发出去,这时候我们的shell便已经到了服务端。
接着,用开发者工具看一下shell的位置。
然后使用蚁剑来获取文件。第一关没有flag。
方法二:禁用js
在火狐地址栏中输入 about:config ,然后将 javascript.enable 的值改为 flase。重启浏览器。
然后就可以直接上传.php文件了。
完了后记得把js.enable的值修改回去。
第二关:服务端MIME检测绕过
观察源码中的判断函数
判断语句的目标是上传文件的"type"参数。
burp拦截,把content-type参数改为允许的类型,如:
上传成功。后续步骤同上。
第三关:禁止上传.asp|.aspx|.php|.jsp后缀文件
源码:
代码思路:先提取出文件的后缀名$file-ext,然后用in_array函数判断是否非法,若合法,将上传的文件移动到目录UPLOAD_PATH/date.rand.$file_ext,也就是会改变文件名。
代码中定义了后缀名黑名单所以我们尝试对后缀名做一些不影响shell运行的修改来绕过。
.php文件可尝试的后缀名有.php2/.php3/.php4/.php5这些,尝试了一下,使用.php3可以保持shell正常运行。
看一下站点的文件,文件名确实更改了
第四关:大量的黑名单
在第四关中,提示告诉我们,大量的文件后缀名都被拉入黑名单.
所以再更改后缀名就行不通了。
在网上找到了几种方法。
方法一:利用windows命名规则
上传不符合windows文件命名规则的文件名test.asp./test.asp(空格)/test.php:1.jpg/test.php::$DATA/
shell.php::$DATA…….会被windows系统自动去掉不符合规则符号后面的内容。
我的实验环境是win10,但此方法行不通,一个命名为shell.php:1.jpg的文件会被传入服务器。
大概是因为服务器的操作系统是Linux?所以windows的规则无效?
方法二:Apache解析漏洞
Apache在解析文件时有一个原则,当碰到不认识的扩展名时,会从后向前解析,直到碰到认识的扩展名为止。
所以我们把shell.php命名为shell.php.7z来进行上传。
然后老一套,蚁剑出动。
第五关:大量的黑名单+更改文件名
看一下源码。
敏锐地发现,少了文件名改为小写这一函数。尝试.Php。可行。
第六关:文件首尾去空
少了首尾去空的函数。从这下手吧。
按理来说直接上传shell,然后用burpsuite拦截,再给文件名最后加个空格就行了。但是实际操作的时候,一直报错。后来通过其他关进入服务器发现,服务器没有把文件名后的空格删除掉,所以那个shell不能用。
目前没有想到有什么解决办法。
第七关:点绕过 略
第八关:::$DATA绕过 略
第九关:点 空格 点绕过 实验环境为linux,没找到解决办法
第十关:服务器会将黑名单内的后缀名替换为空。可以使用.pphphp来解决。
原理:服务器将pphphp中的php替换为空,这是剩下的字符会组成php。
注意:.phpphp不可行,因为所有的"php"都会被替换,所以必须一开始只有一个"php"字符串。
第十一关:看题解要用截断字符绕过,但是只有在目标php版本小于5.3.4才可以使用,不符合条件,跳过。
第十二关:POST类型%00截断绕过上传:跪了,这BUUCTF的实验环境背大锅。
这么快就十点了-.-!!
今天就这吧,明天还是先看论文给导师交差----