
4.1.3 漏洞实战
4.1.3.1 JS前端绕过
Web应用系统对用户上传的文件进行了校验,该校验是通过前端JavaScript代码完成的。恶意用户对前端JavaScript进行修改或者是通过抓包软件篡改上传的文件,就能轻松绕过基于JS的前端校验。
如何判断是不是前端校验呢?首先抓包监听,如果上传文件的时候还没有抓取到数据包,可浏览器就已经提示文件类型不正确,那么这个多半就是前端校验。JS前端校验样例如图4-1所示。

图4-1 JS前端校验样例
可以看到,点击上传之后,Burp Suite抓包并未抓取到任何数据,但是浏览器弹出了警告框,由此可以判定这是一个JS前端校验。
绕过这种校验的方式也很简单,由于该校验本身只是纯粹地对后缀名进行判断,我们先将写有一句话木马的php文件修改为jpg后缀格式的文件,打开Burp Suite抓包后选择写有一句话木马的jpg后缀文件进行上传。Burp Suite抓包如图4-2所示。

图4-2 Burp Suite抓包
将抓取到的shell.jpg的后缀jpg改为php,然后点击提交。
后缀修改如图4-3所示。

图4-3 后缀修改
可以看到,成功上传后,页面并没有回显上传后的路径,只是显示了上传后的图片,可以按“F12”键打开浏览器控制台定位到目标的html代码,查看上传之后的路径./upload/shell.php。
WebShell路径如图4-4所示。

图4-4 WebShell路径
访问目标,传入参数1=phpinfo(),输出phpinfo如图4-5所示。

图4-5 输出phpinfo
成功访问,使用蚁剑、中国菜刀等shell连接工具连接。如图4-6所示为蚁剑连接。

图4-6 蚁剑连接
4.1.3.2 文件头绕过
文件上传时,服务器除了JS前端检验,有的检验还会对上传的文件进行文件头检测。文件头信息通常在一个文件的开头,我们用查看十六进制的方式可以查看一个文件的文件头信息。这也是最方便、最快捷的用来辨别一个文件真实内容的方法。如图4-7为gif文件头内容。

图4-7 gif文件头
常见的文件头标志如下:
JPEG (jpg),文件头:FFD8FF;
PNG (png),文件头:89504E47;
GIF (gif),文件头:47494638;
HTML (html),文件头:68746D6C3E;
ZIP Archive (zip),文件头:504B0304;
RAR Archive (rar),文件头:52617221;
Adobe Acrobat (pdf),文件头:255044462D312E;
MS Word/Excel (xls.or.doc),文件头:D0CF11E0。
校验图片的文件头也就是校验图片内容,这个时候使用一个标准的图片木马是可以成功绕过的,这类代码大部分只校验了前面几个字节,所以直接写 GIF89a 即可成功绕过。直接上传php文件,开启Burp Suite抓包截断传输,添加并修改数据。
添加文件头如图4-8所示。

图4-8 添加文件头
首先将Content-Type的参数修改为image/jpeg,该参数代表上传的文件为图片文件,然后添加GIF动图的文件头GIF89a,点击上传。
按“F12”键,再定位可以获取上传的文件路径。
获取的文件路径如图4-9所示。

图4-9 获取的文件路径
使用浏览器访问,可以看到多了一个GIF89a,这是通过Burp Suite添加的文件头。浏览器访问结果(一)如图4-10所示。

图4-10 浏览器访问结果(一)
图4-11为使用蚁剑连接。

图4-11 使用蚁剑连接
另一种方式就是使用前文提到的图片木马,那如何制作图片木马呢?
准备写有一句话木马的shell.php文件和一张普通的demo.jpg图片文件,将二者放在同一个目录下,通过cmd使用copy命令制作图片木马:

执行成功后,查看目标文件,可以看到“一句话木马”已经添加到图片后面了。图片木马如图4-12所示。

图4-12 图片木马
图片木马的利用和之前其他木马程序的利用方式不太相同,由于最终上传的文件格式为jpg的图片格式,嵌套在其中的代码并不会被当成php代码执行,所以在获取上传路径之后,需要结合后文所说的文件包含漏洞进行利用。
4.1.3.3 黑名单缺陷
限制文件上传的方式千奇百怪,白名单与黑名单就是常见的限制方式。白名单是设置可以让用户上传的文件格式,白名单以外的文件格式都不能通过。黑名单是设置用户不能上传的文件格式,黑名单以外的文件格式都能通过。所以在一般情况下,白名单比黑名单限制的用户要更多一些。
如何判断是白名单限制还是黑名单限制呢?可以看一下上传的特征。如图4-13便为黑名单限制的例子。

图4-13 黑名单限制的例子
在选择文件上传后,显示的是不允许上传的文件格式,并且列出了一些不允许上传的文件后缀,根据php解析的特征,默认情况下 Apache 把 phtml、pht、php、php3、php4、php5 解析为 PHP,所以在这里为上传特殊后缀的php文件格式。特殊后缀文件如图4-14所示。

图4-14 特殊后缀文件
获取上传之后的文件路径,通过浏览器访问。浏览器访问结果(二)如图4-15所示。

图4-15 浏览器访问结果(二)
使用蚁剑工具连接,显示成功连接,如图4-16所示。

图4-16 成功连接
4.1.3.4 古老的00截断
在实战环境中,为了防止用户上传恶意文件,服务端会通过一些函数来获取用户上传的文件后缀再进行黑名单与白名单的对比,从而判断用户上传的文件是否符合要求。函数组合方式示例如下:

获取上传文件后缀是从右向左,碰到指定字符时停止。在某些特殊环境下,一些特殊的字符也会使服务器在获取文件后缀时提前终止,%00便是一个特殊字符。其意义是连接字符串时,0字节(\x00)将作为字符串结束符。所以在这个地方,攻击者只要在最后加入一个0字节,就能截断file变量之后的字符串。
选择一句话木马文件,并将其后缀改为jpg或其他图片类型,开启Burp Suite抓包,点击上传,如图4-17所示,为文件上传路径。

图4-17 文件上传路径
可以发现在POST传送的参数中,显示了保存的路径,我们可以手动写入保存的文件名,并加上0字节截断特征,加上字符后对其进行一次url解码。使用00截断如图4-18所示。

图4-18 使用00截断
提交上传,直接访问我们更改之后的路径地址 url/upload/shell.php,传入参数。浏览器访问结果(三)如图4-19所示。

图4-19 浏览器访问结果(三)
接下来可以通过工具连接shell,进行访问和利用。图4-20为蚁剑连接效果。

图4-20 蚁剑连接效果
4.1.3.5 htaccess绕过
htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现网页301重定向、自定义“404 错误页面”、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。在文件上传中htaccess是一个特殊的文件,在这些文件中写入指定的内容也能将文件解析为php,htaccess后缀的文件便是这类特殊的文件,当发现上传的功能点没有做这个文件的限制时,便可直接利用。
首先,确保本地文件在日常查看时能够编辑文件的后缀名;其次,新建一个文档,将该文档命名为.htaccess,并编辑写入以下指定内容。.htaccess文件如图4-21所示。

图4-21.htaccess文件
然后,将写有一句话木马的php文件的后缀改为jpg等允许上传的文件格式。
先上传特殊文件,再上传包含一句话木马的文件,获取路径之后,加上参数访问。浏览器访问如图4-22所示。

图4-22 浏览器访问
使用蚁剑工具连接如图4-23所示。

图4-23 蚁剑工具连接