首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一秒找出用时间和随机数生成的上传文件名

在做渗透测试或者ctf比赛的时,常遇到一种任意文件上传漏洞,上传后的文件名,是使用时间加随机数生成的。常见的如php的函数生成的文件名,或用时间戳或秒数+随机数字生成文件名。

通常遇到这种情况,我们可以使用一个url模糊测试的的脚本暴力猜解,如果数量为百万级,即使用HEAD方式发送http请求也需要1~2小时才能遍历完,在渗透测试和ctf比赛中都有动作过大和时间太长的缺点。但如果我们换一个思路,可以将效率提高上千倍。有一个靶子,命中一次就算成功,我们用多支枪去打可以提高命中可能;上传漏洞好比这靶子是我们自己架设的,我们可以放多个靶子再进一步提高命中可能。通过这个方式,就可以在一秒内找到上传后的文件名。

下面使用一段真实的代码为例,说明如何在一秒中内找到phpuniqid函数生的文件名。

一、有漏洞的上传代码,如何找到上传后的文件呢

可见文件名使用了uniqid函数生成,实际运行如下代码,可见uniqid的前半部分是根据固定的,后半部分似乎是随机的。

二、弄清uniqid函数的实现细节

查看php uniqid函数的源码

由以上代码可知,文件名 = 前缀 + 秒数的8位16进制数 + 微秒取模0×100000的5位16进制数。这里面前缀和秒数已知,只有微妙数不知。10^6微秒=1秒,数值非常小,我们可以认为它是一个随机数。这样生成的文件名可能为16^5=1048576,100多万个可能性。使用HEAD方法去验证100多万个结果,网络较好的情况下也需要数个小时。

三、同时上传多个文件,提高查找效率

实际上我们可以通过在一秒钟内上传多个文件来成千倍提高查找效率。编写过程中还需要注意一些细节。

使用go语言编写并发上传和测试的工具,在本地环境下测试,(16G内存+i7cpu的笔记本+nginx+php7.0-fpm)一秒内可上传5700余个文件,扫描时在发起956次请求就找到结果,用时0.1秒。在ping延时为300毫秒的vps上测试一秒钟内也可上传1500个文件。这样就相当于在 16^5/1500 = 699,在699个文件名中找一个正确值(考虑到不是均匀分布,这个值会大一些或小一些)。发起699次HTTP请求,一般不超过1-数秒内就可得出正确结果,即使网络非常差也能在几十秒内找到正确结果。测试情况见下图所示:

一些需要注意的细节:

服务器返回的response header中有服务器时间,可用来确认秒数.

服务器同时支持的tcp连接数有限,http客户端要设置http请求头的 Connection: close。

客户端同时能打开的文件数也是有限的,所以要将要要上传的php代码放到内存中,而不是从文件中读取。

设置/etc/hosts,节省dns查询时间

使用tcp socket直接发送上传的请求包,应该还会更快一点。

上传代码如下:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226B0YMHX00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券