【文件上传漏洞07】文件截断绕过攻击实验(基于upload-labs-11、12靶场)-爱代码爱编程
1 知识储备
- 概述:在ASCII码中,00代表的是空字符,在文件截断攻击中,就是采用空字符来误导服务器截断字符串,以达到绕过攻击的目的。
- 原理:服务器后台采用的是move_uploaded_file()函数将上传的文件移动到新位置,该函数属于文件系统函数,是采用C语言实现的,在C语言中,判断字符串是否结束是以空字符为标志的。因此,当上传的文件名中含有
%00
符号时,服务器会认为字符串到此结束,从而达到绕过的目的。 - 截断条件: PHP版本小于5.3.4, PHP的magic_quotes _gpc为OFF状态。
- move_uploaded_file()函数原型与介绍:
- 函数原型:move_uploaded_file(file,newloc);
- file参数:必需参数,规定要移动的文件。
newloc参数:必需参数,规定文件的新位置。 - 工作过程:本函数检查并确保由 file 指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 newloc 指定的文件。
- 注意:如果 file 不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回 false。
- 注意:如果 file 是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file() 将返回 false,此外还会发出一条警告。
- 注意:本函数仅用于通过 HTTP POST 上传的文件。
- 注意:如果目标文件已经存在,将会被覆盖。
2 实验简介
2.1 实验目的
掌握绕过MIME检测的方法,验证文件上传漏洞的存在。
2.2 实验环境
- 靶场:基于WAMP环境的upload-labs靶场,搭建过程可参考文章《从0搭建文件上传漏洞靶场upload-labs》,请务必将PHP版本设置为小于5.3.4版本。
- 攻击机:安装BurpSuite软件。
2.3 实验前准备
按上一节的方法,制作一个图片马info.gif。具体制作过程请参考《服务端文件内容检测与绕过实验+图片马制作方法》
3 实验过程
3.1 实验一:upload-labs-11
- 测试过程:可以先测试前端JS绕过→MIME绕过→服务端后缀名绕过→文件内容绕过等。
- 打开BurpSuite,在代理模块打开其自带浏览器。
- 浏览器访问靶机,并打开第11关。点击选择文件,选择准备好的info.gif。可以看到文件成功上传,但是由于文件后缀的关系无法运行文件里面的代码。
- 开启BurpSuite请求拦截功能,再次刷新文件上传页面,让BurpSuite拦截到请求,将请求转发到repeater模块并点击send,可以看到响应中上传完info.gif的位置,同时在请求和响应,中我们发现存储路径可控,这是可以采用00截断的一个有利条件。
- 在本实验中,在请求的路径参数中添加
test.php%00
来演示%00
截断,由于C语言会将空字符认为是字符串终止符号,函数move_uploaded_file()在保存文件时会将%00后面的字符“截断”,导致服务器将文件以攻击者想要的后缀名存储在攻击者想要的位置。 - 回到代理模块,添加
test.php%00
,并点击forward。 - 回到浏览器,可以看到文件成功上传。
- 右键所上传的文件,在新标签打开,看到文件还是以控制输入的路径访问,可以删除后面的字符串再次访问。
- 删除阶段符号后的字段,可以看到文件的代码被成功执行。
3.2 实验二:upload-labs-12
- 与实验一类似地,在代理模块拦截该关卡的请求,找到可以修改路径参数的位置,如下,添加希望该文件存储时的后缀,其中加号主要是为了定位,在后续步骤中将其修改为空字符,起到截断的作用。
- 点击HEX,将请求界面转化为十六进制显示,同时可以找到刚刚修改的语句如下。
- 我们可以查到加号的ASCII对应十六进制为2b,因此,此处我们将2b修改为00,表示空字符,修改后可以看到右侧的加号也消失了。
- 点击forward,可以看到页面显示文件成功上传。
- 右键该文件,同时修改截断后的字符串,可以看到文件成功执行代码。
4 总结
- 思路:先寻找一切可以突围绕过的机会让文件上传,再寻找机会让文件能够被执行。
- 掌握00阶段上传文件的方法,同方法同样有可能适用于文件下载的情况。