201-A13-文件上传漏洞(上)

一、漏洞产生原理:

  • 一般对于上传漏洞的概念定义如下:由于程序员在对用户文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。打个比方来说,如果你使用 windows 服务器并且以 php 作为服务器端的动态网站环境,那么在你的网站的上传功能处,就一定不能让用户上传 php 类型的文件,否则他上传一个 webshell,你服务器上的文件就可以被他任意更改了。利用方法
  • 如果程序里面存在这种漏洞,那么恶意攻击者可以直接向你的服务器上传一个 webshell( 又称 ASP 木马、PHP 木马、JAVA 木马等即利用服务器端的文件操作语句写成的动态网页,可以用来编辑你服务器上的文件 ),从而控制你的网站。

二、利用上传页面来上传可执行脚本

  • 首先我们输入 dvwa 目标网站,用户名 admin,密码 password,将 DVWA 漏洞演示环境的安全级别设置为 Low 级别。
  • 注意 : 我们直接上传 php 脚本文件以达到拿 webshell, 获得目标网站控制权限。
  • 我们先制作 php 格式的一句话木马内容为:
201-A13-文件上传漏洞(上)
  • 这里 eval() 函数可以把字符串按照 PHP 代码来计算。pass 可以改成任意值。
201-A13-文件上传漏洞(上)

接下来直接上传我们的 php 一句话木马。

201-A13-文件上传漏洞(上)
201-A13-文件上传漏洞(上)
  • 然后进行进一步的操作,打开菜刀,右键添加新的 shell,地址是
  • http://[IP]/hackable/uploads/test.php ,密码为 pass。
201-A13-文件上传漏洞(上)

这时我们利用中国菜刀可以对服务器上文件进行任意操作。

201-A13-文件上传漏洞(上)

从而成功获取该网站的管理权限。

201-A13-文件上传漏洞(上)

2.1 源代码分析:

201-A13-文件上传漏洞(上)

三、Dvwa 漏洞环境 Medium 级别的 File Upload 漏洞

  • 步骤 1:利用上传页面来上传可执行脚本
  • 我们需要将 DVWA 环境设置为 Medium 级别
  • 按照 Part 1 思路来尝试,我们直接上传 php 脚本木马。
  • 发现上传失败,提示我们只能接受 JPEG 或 PNG 图像。
201-A13-文件上传漏洞(上)
  • 代码分析:
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; 获取上传文件的名称
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];  获取上传文件的类型
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; 获取上传文件的大小
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&   ( $uploaded_size < 100000 ) ) 

PHP复制

  • 发现对上传文件的类型和大小进行了判断。只允许上传 JPEG 或 PNG 图像,并且文件不能大于 100000 字节。
  • 由于 HTTP 中的 Content-Type 可以被伪造,我们可以通过修改 Content-Type 的值来绕过判断。
    打开 Burpsuite,抓包绕过上传判断
201-A13-文件上传漏洞(上)

将 php 对应的 filetype 类型修改为 image/jpeg 即可绕过判断。

201-A13-文件上传漏洞(上)

然后点击 Forward 发现回显上传成功.

201-A13-文件上传漏洞(上)

四、dvwa 漏洞环境 High 级别的 File Upload 漏洞

  • 分别上传 jpg php 格式的脚本木马,发现同样都是上传失败
  • 将 DVWA 环境设置为 Medium 级别 , 然后分别上传 jpg php 格式的脚本木马
  • 代码中加了一个比较强力的判断:
if( ( strtolower( $uploaded_ext ) =="jpg"|| strtolower( $uploaded_ext ) =="jpeg"|| strtolower( $uploaded_ext ) =="png") && ( $uploaded_size <100000) && getimagesize( $uploaded_tmp ) )

PHP复制

  • 最重要的是这句 getimagesize( $uploaded_tmp ),对图片的命名和类型进行了严格的限制.
  • 发现 High level 对图片做了验证,也就是不能上传其他文件。改后缀名和 Content-Type 也不行,必须要保证上传的是一个图片。所以必须要构造一个系统“认可”的图片上传上去才行.也就是用文件头欺骗的方式来解决这个问题。

4.1 制造图片马,插入脚本上传

  • 判断图片一般是判断文件头,我们伪造一个图片的文件头,然后插入脚本代码。
  • 首先使用记事本对正常图片文件编辑,将 php 一句话代码写到图片最下面,保存。这样就可以欺骗文件类型的检测。
  • 我们插入代码的内容为:
201-A13-文件上传漏洞(上)
201-A13-文件上传漏洞(上)
  • 这个时候文件上传的漏洞我们已经利用得不能再利用了,在 high 模式下,需要用到其他漏洞,比如命令行注入,在命令行注入漏洞中利用过滤不严。详情可参考(详情参考命令行注入 High 教程)
  • 用到的命令:
127.0.0.1 |&| mv /var/www/html/hackable/uploads/xxxx.png /var/www/html/hackable/uploads/xxxx.php 将文件 xxxx.jpg 改名为 xxxx.php

五、解析漏洞

5.1 IIS 5.x/6.0 解析漏洞

IIS 6.0 解析利用方法有两种

1. 目录解析

/xx.asp/xx.jpg

2. 文件解析

sp.asp;.jpg
  • 第一种,在网站下建立文件夹的名字为 .asp、.asa 的文件夹,其目录内的任何扩展名的文件都被 IIS 当作 asp 文件来解析并执行。
  • 例如创建目录 sp.asp,那么
/sp.asp/1.jpg
  • 将被当作 asp 文件来执行。假设黑阔可以控制上传文件夹路径 , 就可以不管你上传后你的图片改不改名都能拿 shell 了。
  • 第二种,在 IIS6.0 下,分号后面的不被解析,也就是说
sp.asp;.jpg
  • 会被服务器看成是 sp.asp
  • 还有 IIS6.0 默认的可执行文件除了 asp 还包含这三种
/sp.asa
/sp.cer
/sp.cdx

5.2 IIS 7.0/IIS 7.5/ Nginx <8.03 畸形解析漏洞

  • 在默认 Fast-CGI 开启状况下 , 上传一个名字为 sp.jpg 的文件,内容为:
201-A13-文件上传漏洞(上)
  • 然后访问 sp.jpg/.php, 在这个目录下就会生成一句话木马 shell.php

5.3 Nginx <8.03 空字节代码执行漏洞

  • 影响版 :0.5. ,0.6. , 0.7 <= 0.7.65, 0.8 <= 0.8.37
  • Nginx 在图片中嵌入 PHP 代码上传,访问 xxx.jpg%00.php 来执行其中的代码
xxx.jpg%00.php 

5.4 Apache 解析漏洞

  • Apache 是从右到左开始判断解析 , 如果为不可识别解析 , 就再往左判断.
  • 比如 sec.php.owf.rar “.owf”和”.rar” 这两种后缀是 apache 不可识别解析 ,apache 就会把 sec.php.owf.rar 解析成 php.
  • 如何判断是不是合法的后缀就是这个漏洞的利用关键 , 测试时可以尝试上传一个
  • sec.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀

5.5 其他

  • 在 windows 环境下,xx.jpg[空格] 或 xx.jpg. 这两类文件都是不允许存在的,若这样命名,windows 会默认除去空格或点 , 黑客可以通过抓包,在文件名后加一个空格或者点绕过黑名单。
  • 若上传成功,空格和点都会被 windows 自动消除 , 这样也可以 getshell。
  • 如果在 Apache 中 .htaccess 可被执行.且可被上传.那可以尝试在 .htaccess 中写入:
201-A13-文件上传漏洞(上)

然后再上传 shell.jpg 的木马, 这样 shell.jpg 就可解析为 php 文件。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容