一、漏洞描述
在uplaods-labs的第十三关中,服务器采用了白名单验证,意思为只能上传规定范围内的文件后缀。又将上传后的文件名改为了随机数。但是因为服务器上传路径用post方式传入变量拼接,且php版本小于5.3.4还得magic_quotes_gpc需要off状态。可以利用%00截断服务器后面拼接路径达到绕过。
二、漏洞发现
先在本地写php脚本若上传成功,且知道上传后文件在网站保存的路径,可通过网页访问获得服务器配置信息,命名为z.jpg
直接看靶场的代码。
strrpos()函数:查找字符串在另一个字符串中的位置。这里又加一,比如上传的是z.php则返回3
substr()函数:从一个字符串中提取从指定字符串开始到最后的位置。当然这个长度可指定,这里没做指定,则取到结尾。如上传z.php,先找到了点加一的位置再取到结尾,返回php。
通过这两个函数既不能通过双写绕过也不能通过点绕过。
但是再往下看,post方式传入了save_path变量后面拼接随机数+合法后缀名
可以通过抓包,将post中的save_path变量后面改写为z.php并加%00,且在burp中先对%00进行url解码,因为post不会像get一样对%00进行自动解码。ascii中0作为特殊字符保留,表示字符串结束,所以当服务端存储文件时处理文件名的函数认为0x00是终止符号。自然会截断后面的服务器自己定义的随机数文件名
需要两个条件是:
服务器php版本小于5.3.4,因为在5.3.4开始已经修复0字符。
magic_quotes_gpc为off状态,作用是判断解析用户提示的数据,如:post,get,cookie过来的数据加转义字符’\‘,输入数据中要包含(’)双引号(“),反斜线(\)与NULL时候都会被加上反斜线。和addslanshes()函数一个意思。在php.ini配置文件中设置。
注意:魔术引号在php的5.3.0之前默认开启,在5.3.0到5.4.0默认关闭,且在5.4.0起被废除。
当做完上面的白名单验证和定义上传路径之后,上传文件去指定位置。
$_FILES['myFile']['name']文件上传时候本身的名字,用户定义的名字
$_FILES['myFile']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认
三、漏洞利用
上传文件并且用burp抓包,将文件名改为z.jpg在白名单的范围内,将post中的save_path=../upload加%00截断后面服务器定义的随机数文件名
然后将对应的%00进行url解码。上传成功,因为路径和文件名自定义,所以知道文件上传的位置。
直接访问,利用成功,获得服务器配置信息。也可上传一句话木马,通过蚁剑,菜刀等后门工具链接获取webshell。