第一步,打开网络拓扑,启动实验虚拟机。
第二步,打开桌面上的Chrome浏览器,在地址栏中输入http://127.0.0.1,进入upload-labs页面中,然后点击左侧的导航栏Pass-13进入关卡13
在任务提示中要求上传格式为.jpg\.png\.gif且包含一句话或webshell的图片马,点击查看源代码按钮
在代码的第四行$bin = fread($file, 2);读取文件的前两个字节,接着往下看出现了一个unpack函数,将字节字符串解包成变量,并将变量存放在两个数组分别为chars1和chars2中,并由intval转换为十进制,经过了这一段代码的处理后,文件头中的前面两个字节将以十进制的信息表示,接下来是一个switch的判断,判断文件的格式为jpg、png、gif文件则允许上传跳到上传的程序中,否则判断为unknown则提示上传失败。该程序主要是取上传文件的头两个字节判断文件类型,因此此处可直接上传图片马,操作如下:打开桌面上的pentestbox输入命令cd C:\Users\Administrator\Desktop\隐写术Images\gif,
在该文件中创建一个内容为的shell.php文件,然后使用命令copy cat_tldzFZS.jpg /b + shell.php /a webshell.jpg拼接图片和木马,
将图片移动到桌面上,然后回到上传页面,上传该图片马同时打开代理使用burpsuite进行抓包,
为了方便观察上传后的路径,右键鼠标选择Send to Repeater将数据包发送到Repeater重放器中,然后直接点Go发送数据包
上传成功,关闭代理功能。
第三步,目前该漏洞无法单独进行利用,需要与文件包含漏洞搭配起来进行利用,由于网站为本地环境,我们直接在本地的网站中模拟这一过程,进入路径C:\Program Files (x86)\upload-labs\WWW中,写一个简单的存在文件包含的页面
此文件已写入到网站中,在自己进行实验时可以不用创建,我们直接访问http://127.0.0.1/include.php即可,
接下来构造利用页面结尾添加?file=upload/8620200104160811.jpg,再次访问
利用成功。
第四步,回到网站首页,点击左侧的导航栏Pass-14进入关卡14,依旧是上传图片马,点击显示源码按钮查看源代码
这里用getimagesize获取文件类型,依旧可以使用图片马进行绕过,在这里简单补充一下getimagesize的知识点
用上一步中的图片木马进行上传,并查看/upload/文件夹中的上传的名称
访问/include.php并构造/include.php?file=upload/9120200104164552.jpeg
第五步,再次回到网站首页,点击左侧的导航栏Pass-15进入关卡15,依旧是上传图片马,点击显示源码按钮查看源代码发现更换了函数
使用了exif_imagetype()函数,读取一个图像的第一个字节并检查其签名,其绕过方法同Pass-13一样,省略复现过程,以上实验完成后。
第六步,进入网站首页,点击左侧的导航栏Pass-16进入关卡16,依旧是上传图片马,点击显示源码按钮查看源代码
通过审阅整个文件的代码,判断了后缀名、centent-type以及利用imagecreatefromgif/jepg/png判断是否为gif、jepg、png图片,最后又做了一次二次渲染。单独看一下文件中关于检测gif的代码
第61行通过两个函数$fileext和$filetype检测文件是否为gif格式,第62行使用了move_uploaded_file函数来做条件判断,如果成功将文件移动到$target_path,就会进入二次渲染的代码,反之则上传失败
这一关破解的思路大致为:首先上传一个gif图片,然后将上传的gif和本地的gif图片进行对比,找出仍然相同的数据块部分,然后将phpinfo()函数的代码插入进去。
第七步,首先上传一张普通的gif图片,进入C:\test路径,将图片test.gif复制到桌面上,改名为1.gif然后再网页中上传1.gif
访问/upload/
点击4575.gif打开图片将文件另存为到本地保存为2.gif
然后使用桌面上的Hex Editor Neo打开2.gif图片与1.gif进行对比发现在a0行的地方两个图片的内容一致,
直接将2.gif的a0位置的字符修改为
最后将文件保存为3.gif,进行上传。访问upload目录获得文件上传后的名称
使用include.php包含该文件