文件上传常见验证:
后缀名:黑名单、白名单
文件类型:MIME信息
文件头:内容头信息
一句话图片马制作
copy 1.jpg /b + 2.php /a 3.jpg
如下图的后端
本关考的内容是本地文件检测,我们只要按F12将验证删除就ok了
我们将return checkFile()函数删除,再上传php文件上传成功。
本关考的内容是服务器检测
我们继续上传php文件,进行抓包
我们看到其中有对上传文件类型的描述Content-Type
我们在网上查询到jpg的类型为image/jpeg
发包,显示上传成功了,后台查看,文件存在。
本关考的是后缀名
我们查看源码,发现它禁止了‘.asp’,‘.aspx’,‘.php’,'.jsp’文件的上传,但是我们可以上传.php3 .php4等后缀的文件,这些后缀依然可以被当作php执行
上传成功,查看后台文件存在,并且文件被改名了。
我们再看一下源码为什么改名,下面这行代码的意思是将文件重命名为时间+随机数.文件后缀的文件
本关考的是对低版本php<5.3的.htaccess
.htaccess主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。
我们看到源码没有对.htaccess后缀的文件进行黑名单限制
因此我们直接上传一个.htaccess文件,内容如下
<FilesMatch "3">
# 3为文件名
SetHandler application/x-httpd-php
</FilesMatch>
.htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为4.htaccess或者其他的什么名字是不可以的,无法解析。如果以上操作都弄好了,还是出不来,还是去改phpstudy配置文件,其他选项菜单–打开配置文件—httpd.conf
本关是考察双写小数点(.空格.)
所以我们上传6.php. .
查看后台,上传成功
本关是考察大小写
看第六关的代码我们知道,这一关没有强制将大写转换为小写,所以我们可以上传纯大写或者大小写结合的后缀名
我们直接上传5.PHP,发现上传成功
本关是考察空格
所以我们上传6.php空格
我们抓包,在文件名后加空格
查看后台,上传成功
本关是考察小数点(小数点没有被取消)
所以我们上传6.php.
本关是考察::$DATA
我们上传php文件加后缀
查看后台,上传成功
第十关和第五关一样,随便玩
本关考察的是双写后缀
查看源码,存在标识后缀就删除
我们上传6.pphphp
本关是白名单考察,只容许上传什么类型的文件,但是上传路径是可以控制的
这次我们要将php版本改为5.3以下哎,并且关闭如下功能
然后上传图片马进行抓包,进行%00截断
然后访问图片,上传成功。(我这里上传了两次,第二次用的是4.php)
本关和上一关差不多,只是将get请求换成了post请求
但是post请求需要编码(get会自行解码,post不会自行解码)(我们需要将%00进行编码)
如下编码
文件包含漏洞
我们上传一个图片马
一句话图片马制作
copy 1.jpg /b + 2.php /a 3.jpg
我们上传后通过文件包含漏洞进行执行
首先正常上传图片马
我们打开后台查看后台保存的图片信息,复制文件名
然后我们点开文件包含漏洞,查看函数
通过函数我们得知,我们需要指定文件地址进行执行,所以我们输入图片位置
?file=upload/后台图片名.jpg
查看源码,getimagesize()获取图像信息,如果不是图片信息,那么就不会执行成功
跟十四、十五、十六、十七关都差不多,都是通过不同的函数
上传正常的图片马
exif_imagetype()函数
十四、十五、十六、十七关都差不多,都是通过不同的函数
上传正常的图片马
十四、十五、十六、十七关都差不多,都是通过不同的函数
上传正常的图片马
if((KaTeX parse error: Expected 'EOF', got '&' at position 19: …eext == "jpg") &̲& (filetype==“image/jpeg”)){
if(move_uploaded_file( t m p n a m e , tmpname, tmpname,target_path)){
逻辑问题:二次渲染(一般存在于可以保存、删除操作的位置)
imagecreatefromjpeg()函数
目前很多网站都会对用户上传的图片再次压缩、裁剪等渲染操作(如PHP中的imagecreatefromjpeg()等函数),所以普通的图片马都难逃被渲染的悲剧。
正常上传应该先将文件进行修改(重命名),再进行上传渲染,但是本关是先进行上传到服务器,当作临时文件,这个时候渲染文件,重命名、修改保存位置,然后删除,然后在修改的过程就可以访问成功。(正常的话,不断发包,让他某一次没有重命名成功就算成功了)(渲染文件后,一般我们的php代码就会被除去)
所以我们上传一个php脚本进行抓包
我们将他发给测试器,让他重复发包,线程10,开始攻击
这时我们访问图片马upload-labs-master/shell.php,是有概率访问到的
我没有访问到,但是在后台文件里面,它存在的那一瞬间我进行了截图,证明注入成功了
跟上一关应该一样,没有测试
发现move_uploaded_file()函数中的img_path是由post参数save_name控制的,因此可以在save_name利用00截断绕过,我们上传文件进行抓包
我们通过%00进行截断绕过
我们将%00进行编码,上传文件
查看后台,上传成功
第二种方法
move_uploaded_file()有这么一个特性,会忽略掉文件末尾的 /.
所以我们抓包修改后缀(上传图片马)
查看后台,上传成功
算了,直接上方法,我今天没懂,听懂了再解释
我解释一下它的代码意思
当你点击后
文件的名字加后缀会被获取,然后文件的名字会通过小数点进行分割成数组
正常情况下filename[0]=upload-20 filename[1]=jpg
我们实际上传的情况下filename[0]=upload-20.php/ filename[1]=jpg
因此我们就完美绕过黑白名单检查
接下来不管怎么结合后缀,只要名字不变,后加的后缀都会被/符号除去
所以就保证了文件被执行为php