一、漏洞描述
在upload-labs第十七关使用了了二次渲染的方法对图片作了处理,将上传的png,jpg,gif图片进行尺寸等操作做成新图片。可以通过不同文件格式的特性对图片做处理,让服务端不改变插入语句的位置,然后再用文件包含的漏洞利用。这里详细对gif格式做处理。
二、漏洞发现
先在本地写php脚本若上传成功,且知道上传后文件在网站保存的路径,可通过网页访问获得服务器配置信息,命名为z.php。但是在这里不能用php文件直接上传,需要制作图片马来绕过服务器检测文件二进制头信息。
有两种方法,但都是一个意思,将写入图片里面
方法一:准备z.php和一个真jgif图片用cmd命令行输入:copy 1.gif/b+z.php/a 2.gif
参数/b指定以二进制格式复制合并文件
参数/a指定以ascll格式复制合并文件
方法二:直接用010edior打开zzz.gif,在末尾加上执行语句。
直接看源码,先定义了文件上传路径,然后取文件后缀。
$_FILES['myFile']['name']文件上传时候本身的名字,用户定义的名字
$_FILES['myFile']['type']文件的类型,需要浏览器提供该信息的支持,如“image/gif”
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认
basename()函数:返回路径中的文件名部分
strchr()函数:查找字符在另一个字符串中首次出现的位置
substr()函数:从第几个位置开始截取后面所有字符串
在这里我非常迷惑,这个靶场这一关是要用二次渲染绕过上传文件,但是它先执行move_uploaded_file()函数返回结果false也会上传文件。这也算个漏洞。先判断后缀和文件类型是否为gif,再判断文件是否上传成功,未成功删除图片。成功则创建画布将gif图片载入,用随机数定义图片新名字,定义新路径,再将载入图片输出到新路径,返回ture
move_uploaded_file(file,newloc)函数:file是要传入的文件,newloc是规定文件的新位置
imagecreatefromgif():创建一块画布,并从gif文件或url地址载入一幅画像
unlink()函数:删除一个文件,成功返回0,否则返回-1,加@屏蔽错误信息输出
time()函数:返回当前时间的时间戳
srand()函数:为随机数生成器rand()设置种子
strval()函数:用于获取变量的字符串值
imagegif()函数:以gif格式将图像输出到浏览器或文件
当然只上传图片访问后是不能当作php执行的,这里要配合文件包含漏洞利用。靶场也很贴心的直接给了一个包含漏洞页面。用get方式接受file变量,include直接包含运行文件,所以1.jpg也能当php执行。
文件包含漏洞的环境要求:
allow_url_fopen=On(默认为On)规定是否允许从远程服务器或者网站检索数据
allow_url_include=On(php5.2之后默认为off)规定是否允许include/require远程文件
因为靶场返回上传图片给客户端,所以直接获得上传后的图片和上传前的图片,可以通过010editor软件将图片二进制打开,对比没有发生变化的地方,在这些地方插入语句就不会被渲染,配合文件包含漏洞直接利用。
三、漏洞利用
改图片后缀为gif并且上传,保存上传返回的图片
打开010editor对比两个图片相同的地方,在这里面随便插
插入语句
再次上传,得到上传之后的图片地址。
利用文件包含漏洞,直接执行获取服务器配置信息,也可上传一句话木马,通过蚁剑,菜刀等后门工具链接获取webshell。