出自于ctfhub的一道文件上传题,话不多说,打开靶场
如图,出现一下界面,在下方由网页的源码,那么我们重点把源码分析一边 前端html的部分我就略过了,主要看后端php的信息
通过审计php代码发现,只允许出现zip、jpg、gif、png四种类型的代码,由于没有文件包含,所以上传图片码的方法行不通,既然是白名单,那就使用00截断吧
通过上传1.php%00.jpg文件发现,文件上传是上传进去了,但是由发现不论是返回包还是发送包,都没有最终上传的路径,再看看源码 其中$dir = ‘upload/’ 最终我们上传的文件与upload之间加了一个随机数,导致我们不知道我们上传的路径,由于请求包中也没有路径,所以就不能用截断截掉路径,只有继续审计代码了
我们可以看到,我们上传还能上传zip文件,这个情况以前我还真从来没有遇见过,以前听过,但是没做过类似的题,今天长知识了
做这个题有两个问题需要解决,
-
解决文件路径未知的问题 前面也说了,我们最终路径是 xxxx.com/uoload/(数字乱码)/xxx.zip ,如果我们上传的的文件名是…/…/zzz.php 那么最终上传的路径不就是xxxx.com/zzz.php -
解决后缀名的问题 从代码中可以看见,他这里有一个漏洞,就是它使用的正则匹配是.php$,在正则匹配中$的意思是匹配末尾,所以他是从末尾开始匹配.php,那么漏洞就出现了 这里想要绕过主要由两种思路,一个是使用00截断,1.php%00.jpg ,另一个就是通过apache解析漏洞1.php.zzz绕过,思路出来了,来看看实际操作吧
首先假设我们想要上传的文件名为…/…/1.php.zzz,我们不能直接对文件这样命名,会出现报错,所以我们可以把文件先压缩,再通过16进制编辑器对压缩包内的文件命名。
由于我们想要命名…/…/1.php.zzz有15个字符,所以我们先将一个1.php的木马文件重命名为“123456789012345”,必须也是15位,具体原因后面讲述 然后就可以把文件压缩拖进我们16进制编辑器了,通过编辑器,定位到我们文件名称的地方,不论什么文件都可以被16进制,而他们16进制后产生的数据都有他们自己的含义,比如下图第二个框中,就是代表着我们压缩包内文件的的名字。
从图中我们可以看到,文件名是一个数组形式char deFileName[15],这也就是为什么我们需要按照…/…/1.php.zzz的字符数量命名的原因,在这里就解释了。
在这里我们命名为…/…/1.php.zzz就不会受限制了,接着就可以把这个文件上传上去,最终访问xxx/1.php就能访问到我们的木马文件了,flag也就出来了。
|