写在前面
这篇文章算是我自己做完upload-labs和DoraBox上传文件靶场的一个总结,方法都是很常见的,也没有什么高难度,所以也算是小白文。如果我写的有错误欢迎指正 😃。
JS校验
这种是比较好理解也比较好操作的,只需要Burp抓包拦截,然后修改后缀名即可达到绕过的目的。
黑白名单
黑名单就是不允许的名单,白名单就是只允许的名单。
黑名单有以下几种方法绕过:
- 特殊后缀,例如要上传php一句话,已知网站不允许上传php文件类型,则可以上传php2、php3、php4、phtml等类型。
- 上传 htaccess文件。htaccess文件会把传入的指定的文件当作php文件执行。
AddType application/x-httpd-php .jpg
- 大小写。将原本的php后缀变成大小写混杂,变成PhP、pHP等,以达到绕过的目的。
- 点绕过。抓包拦截在php后面加上一个.,变成.php.。
- 空格绕过。抓包拦截,在php后面加上一个空格。
- :: $DATA绕过。基于Windows的特性,就是如果文件名后面加上:: $DATA,会把DATA之后的数据当成文件流处理,不会检测后缀名,整个文件的类型保持::$DATA之前的文件类型。
- 双写绕过。将原本的php改写成phphpp,达到上传目的。
白名单有以下几种方法:
- MIME绕过。这个方法是看Content-type的值,传入的是php文件,但是可以抓包修改Content-type的值为image/jpeg,让网站以为这是一个被允许的jpg文件。
- %00截断绕过。通常存在于构造上传文件路径的时候
函数绕过
两个函数,一个是getimagesize()函数,一个是exif_imagetype()函数。
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。
exif_imagetype()获取图片类型,预定义以下常量用于返回
IMAGETYPE_GIF、IMAGETYPE_JPEG、IMAGETYPE_PNG、IMAGETYPE_SWF、IMAGETYPE_PSD等。
绕过方法是上传图片马,配合解析漏洞拿到shell。
二次渲染
对于这个原理理解的并不是很透彻。记录一下从别处看到的解释,相当于是把原本属于图像数据的部分抓了出来,再用自己的API 或函数进行重新渲染在这个过程中非图像数据的部分直接就隔离开了。
对于gif格式来说,只需要找到渲染前后没有变化的位置,然后通过16进制编辑器把php代码写进去,就可以成功上传带有php代码的图片。
而对于png和jpg格式,在网上找了找,原谅我的小白,看不太懂 。
但是也记录下方法,是根据国外的大牛编写的脚本。
png:
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img