hello大家好,本周小黑尝试通关并分析了upload-labs靶场的1-5关。
文章省略了文件上传漏洞原理、webshell的原理和利用方法,感兴趣的小伙伴可以自行寻找资料学习。
简单的说,该靶场需要你想办法上传一个能解析的php文件上去就算通关。
看到关键字var、document、alert等等,可知这是js的源码,程序使用的是前端验证后缀名白名单。所以上传temp.jpg然后抓包改后缀即可绕过。
本关使用白名单检查$_FILES['upload_file']['type']
,这个值对应的是请求包中的Content-Type(内容类型),是http协议中用于定义网络文件的类型和网页的编码,决定文件接收方将以什么形式、什么编码读取这个文件的字段。
Content-Type的值是上传文件时浏览器根据文件后缀自动加到请求包中的。而请求包里的内容我们是可以随便改的。
当然像上一关一样,上传temp.jpg然后抓包改后缀也可绕过。
trim:此函数返回字符串去除首尾空白字符后的结果。
strrchr:此函数返回字符串中指定字符最后一次出现的位置到字符串结尾的部分的所有字符。
本关取文件名中从最后一个点到结尾的部分作为后缀名,然后进行黑名单判断。同时用日期+随机数来代替文件名中其余的部分。
在ctf比赛中,上传黑名单有个很常见的绕过手法是这是利用其他可解析的后缀,例如php、php3、php4、php5、phtml、pht等,有时候需要挨个进行尝试。本关使用phtml即可进行绕过。
这些后缀能解析的原因是写在apache的配置文件里的,非默认配置。虽然ctf中的案例多来自实战,但实话说,我确实没在实战中见过这些后缀能解析的情况。
当然可能是我见识少吧,因为搜了一下发现确实有一些教程教人如何配置apache使能解析php3、phtml这些后缀的。不知道意义何在,希望能有开发大佬在评论区留言指导一下,谢谢!
代码和上一关基本相同,唯一的区别是黑名单变长了。。。
仔细观察黑名单,发现其中的php1前面少了一个点,那这个应该是可以绕过的点。
不过同时也发现文件并没有被重命名,第15行代码没有生效,可代码是不会骗人的,这是怎么回事呢?
直接用sublime打开源代码查看,发现实际的代码是这样的,$img_path中直接使用了$file_name,并没有进行重命名:
既然没有了重命名,那就可以触发apache的多后缀解析漏洞,上传test.php.abc即可解析。
apache多后缀解析漏洞的原理是:apache会从右向左读取文件的后缀来判断文件类型,但是当apache遇到不认识的后缀名时不会停止,而是会自动跳过继续向左读取直到遇见认识的后缀为止。
源码中使用自定义函数deldot删除文件名末尾的点,该函数从后向前判断并舍弃遇到的点,直到遇到一个非点的字符为止。
所以在两个点之间插一个空格,该函数就只能删除最后面的点。
我们上传test.php点空格点,处理后变成了test.php点空格,这时程序用当前的最后一个点取后缀,取到的是点空格,该后缀不在黑名单里,成功绕过黑名单。
同时因为和第三关不同,真正上传时使用的是$file_name而非$file_ext,所以最后传上去的是test.php点空格。
这时由于windows的特性:文件名自动删除最后的点和空格,所以实际传上去的就是test.php。
文件没有被重命名,那我们可以直接上传.htaccess文件。
该文件是apache服务器的分布式配置,和总配置文件的区别是,它只作用于它所在的目录及子目录,但优先级比总配置高,类似于地头蛇的意思。
AddType application/x-httpd-php .jpg
此段配置的作用是让apache将.jpg后缀的文件当作php文件来解析。
之后再上传一个webshell内容的test.jpg即可。
结合第五关的变化来考虑,我认为.htaccess是作者预期这关的解法。
第四关遇到了网页上的提示源码和实际源码不相同的问题,于是我去github看了看,发现已经有人提过了:
作者回复说因为release并没有更新到最新的源码,看了一下我们下载的release是2019.1.29日放出的。
下载后解压,将所有文件直接覆盖到原来的集成环境的WWW目录里就好了。
覆盖后可以看到,第四关的一些bug已经修复了,同时左侧多了一关。
看源码和第四关基本没有区别,仔细看了一下发现后缀黑名单里多了.htaccess
但是第四关我们使用了三种方法,除去.htaccess,另外两种方法还是可以用的(多后缀解析漏洞、点空格点绕过)。
不过第六感告诉我,那不是作者的本意。看一下提示吧,这关应该和这个readme.php有关系。
已知目录下有一个php文件,那自然想到的利用方法是.user.ini。该文件是php.ini的分布式配置,在apache、nginx下都能生效,但前提是使用了fastcgi的运行模式。其中有两项配置比较危险:
auto_prepend_file = <filename> //包含在文件头
auto_append_file = <filename> //包含在文件尾
这两项配置的作用是,和.user.ini在同一目录的所有php文件在运行时都会自动寻找并包含配置中所指定的文件。
那我们首先传一个.user.ini上去,内容是auto_prepend_file=shell.jpg
,让目录里的所有php文件在运行前先在文件头包含目录下的shell.jpg。
最后访问目录下已有的php文件即可,不过我这里是利用失败了。
还是去github看了下原因,应该是默认的环境有问题,可能是php版本过低或者没有使用fastcgi模式。无所谓了,只要理解了知识点就行。
最近有读者反馈文章字体偏小的问题,我把文章字体调小主要是出于信息密度的考虑——同样大小的屏幕中更小的字体能展现更多的内容。
但既然有读者反馈了,那我这里还是把字体稍稍调大一点,大家可以观察一下哪个字体比较好一点,如果还有什么需求也可以在留言区反馈给我~
之后小黑会继续通关并分析upload-labs的其他关卡,欢迎大家关注。
喵,点个赞再走吧~
原文始发于微信公众号(小黑的安全笔记):upload-labs靶场1-5关
评论