本系列为文件上传漏洞练习
直接上靶场文件https://github.com/c0ny1/upload-labs
线上靶场:http://59.63.200.79:8016/
Pass-01(前端验证)
根据提示发现,该上传文件格式限制php,查看源码
可以看到前端做了文件格式限制
解决方法:
1、在网页中F12找到表单提交处,添加action:””(在此之前获取到目标上传的url)里面写入上传的url
2、使用burpsuite抓包
将filename的jpg改为php
成功上传
Pass-02(MIME验证)
查看源码发现判断标志为content-type,明显的MIME验证漏洞,老方法,用bp抓包,将content-type改成image/jpeg或者png、gif
成功上传
Pass-03(黑名单文件格式过滤)
这里可以利用apache能解析php3,php5和phtml的特性,将后缀改为以上三种格式来实施绕过,前提是对方apache需要开启该文件后缀的解析功能,一般来说是开启的。具体可看php3,php5和phtml的讲解
也是成功上传
Pass-04(.htaccess验证)
第四关在第三关基础上限制了更多的文件后缀,这关可以使用.htaccess的方式绕过。首先创建一个后缀为.htaccess文件(用notepad++)
具体的.htaccess文件博客请移步
里面代码如下
1 | <FilesMatch "abc"> |
意思是允许上传一个文件名有abc的不受限制的文件,执行里面的php语句。
使用一张正常的图片,在图片最后插入php代码,phpinfo()函数,打开上传文件的路径,观察是否执行了php代码(页面是否显示php的信息)
Pass-05(大小写验证)
查看源码,发现没有大小写限制,一般大小写限制有php函数
1 | $file_ext = strtolower($file_ext); |
本关可直接修改php后缀,可改为pHp,Php等大小写混合后缀。
上传成功
Pass-06(空格验证)
观察到本关没有首尾去空的函数
一般为
1 | $file_ext = trim($file_ext); |
去空的意思就是将文件名多余的空格去掉,可以利用此特点,在后缀名后面添加一个空格,使其被辨别为带空格的文件名
因为本地windows系统限制不能直接修改,使用bp抓包
加一个空格
上传成功
Pass-07(点验证)
观察代码,与正常的相比少了删除文件名末尾的点的函数
1 | $file_name = deldot($file_name); |
用bp抓包,在文件名后加一个点,无法识别正常的文件格式,上传后会默认恢复成正常文件
上传成功
Pass-08(::$DATA绕过)
NTFS文件系统存储数据流的一个属性DATA。当我们访问a.asp::DATA时,就是请求a.asp本身的数据,如果a.asp还包含了其他的数据流,比如a.asp:lake2.asp,请求a.asp:lake2.asp::$DATA,则是请求a.asp中的流数据lake2.asp的流数据内容。
php在Windows的时候如果文件名+”::$DATA”会把 :: $DATA之后的数据当作文件流处理,不会检测后缀名,且保持:: $DATA之前的文件名。
查看源码,发现文件名没有过滤::$DATA
bp抓包,在文件后面加入::$DATA
上传成功
Pass-09(构造文件后缀绕过)
查看源码
move_upload_file的文件名直接为用户上传的文件名,我们可控。且会删除文件名末尾的点.
这里构造文件名post.php. .(点+空格+点),经过处理后,即可绕过。
上传成功
Pass-10(双写后缀名绕过)
查看源码
这里是将敏感后缀替换为空,双写.pphphp绕过即可,因为没有循环检验,只要碰到php字符就为空,所以中间的php过滤了,剩下前后php
成功上传
Pass-11(%00截断一)
查看源码
发现本关上传路径是可控的,尝试bp抓包
尝试在上传路径后添加1.php,发送。返回包里回显路径+文件名还有一个1.php,这时候可以使用%00,将1.php后的所有东西截断,失去用处。
可以发现是成功上传,这个时候1.php就是该图片的php格式文件。
Pass-12(%00截断二)
本关与11关类似,同样是%00截断。查看源码
有所不同的是,11关使用的是GET方法,本关使用POST方法。
因为在GET方法中,%00被url解码后是空字符,而在POST方法中不会被url解码,所以需要手动在bp里进行解码。