文件上传(一)

About File Upload


0x00 前言

文件上传什么的,都属于WEB漏洞的基础,虽说是基础,但是也是能get到很多知识点的,再加上各种变化,也就可以实现任意文件的上传。

关于文件上传,在github中也有一个文件上传的靶场,upload-labs,里面都是关于文件上传的练习。

0x01 原理

文件上传漏洞是指网络攻击者上传了一个可执行的文件到服务器并执行。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,部分文件上传漏洞的利用技术门槛非常的低,对于攻击者来说很容易实施。

一般来说,日站的标准就是能不能get到shell,getshell以后就可以emmmmmm……

webshell在之前的博客的内容里面都有所提及,webshell后门的隐蔽性一般都是极高的,也不会在系统中留下日志,只会在网站的web日志中留下一些数据提交记录,之后的溯源以及应急响应,我会在之后的博客写。

文件上传的类型:

  1. 客户端javascript检测
  2. 服务器端MIME类型检测
  3. 服务器端目录路径检测
  4. 服务器端文件扩展名检测
  5. 服务器端文件内容检测

0x02 文件上传靶场WP

演示所用的小马:

<?php @eval($_POST['aa']);?>
  1. 其实就是个前端检测,禁用js或者抓包修改文件名就可以了,没有什么要说的。
    以抓包举例:
    上传1.png->burp抓包->修改1.png为1.php/asp/jsp->上传成功->getshell
    其实1.png本质就是一个php文件,只不过强制修改了后缀,修改为了png。
  2. 这个上传的时候,没有前端检测了,但是上传php文件还是会提示非法,这时可以尝试下,看看服务器是对哪些部位进行了验证,上传一个正常的图片,在上传一个php文件,看看上传两个文件发起的请求包的区别:
    PNG:

image

PHP:

image

由图可知,两个请求包不同点在于文件的后缀名以及文件的类型,如果说只是对php文件进行修改文件后缀名,发现无法绕过后台检测,于是修改png问及的后缀名为php,发现可以绕过,由此,可以判断出来,服务器是对文件MIME类型进行的判断,所以,通过伪造上传php文件请求的Content-Type为image/png,即可绕过检测。

  1. 第三关呢,又尝试上传php文件,发现其提示不能上传PHP、asp、jsp、aspx等文件,设置了黑名单,那么现在就清楚了,绕过其黑名单。php支持的文件后缀名有php3,php5,php7,phtml,尝试使用这几个进行绕过(PS:由于apache版本的限制,这个漏洞是在一些特定的条件下才可以利用成功的,因为apache的配置文件httpd.conf有可能没有添加解析上述后缀名的语句,导致文件不被解析),上传大马,成功被解析,这道题目的考察点就过了。
  2. 第四关的这个,过滤了基本上所有的敏感文件后缀,这关考察的是一个.htaccess文件的使用。

.htaccess文件提供了一种目录级别的修改配置的方式。一个文件,包含一条或多条配置指令,放置于目录下,这些配置指令对当前目录和其所有子目录生效。.htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体 地怎样接待它,就是此文件的作用。所有的访问都是通过URL实现,所以.htaccess的作用非同小可。正因为此,所以一般地网站通过设 置.htaccess,通过一个十分友好的url吸引用户进来,然后用.htaccess把用户带到需要访问的位置。

那么,在这里我们发现.htaccess文件可以上传,通过.htaccess文件重写文件解析规则。简单来说,就是把jpg文件按照php文件的格式进行解析,也就是说,以.jpg结尾的文件,可以看作是php文件。

.htaccess

<FilesMatch "1.jpg">
SetHandler application/x-httpd-php
</FilesMatch>

这样,上传一个.htaccess文件,之后再上传1.jpg,依然会以php文件格式去解析这个jpg文件。

image

image

image

  1. 通过查看源代码可以看到,.htaccess文件也被禁止上传了。虽然黑名单里写了好多php的别名,包括大写的pHp,但是,PHP这个是没有在名单里面的,所以可以通过上传PHP文件来实现getshell。

image

image

  1. 上源码截图,一张图基本都可以看懂了这道题目应该怎么做。

image

没有了去空函数,所以我们可以利用windows保存文件的特性来进行文件上传,也就是说,1.php 跟1.php(前面的1.php后面跟的有空格)达到的效果是一样的,最终都会保存成为1.php,这样就可以绕过服务器的检测。

image

image

  1. 跟6类似,看源码:

image

这里标明了少了一个去除文件末尾点的函数,这样就还是利用windows文件的特性,1.php.跟1.php达到的效果都是一样的,最终都会保存成为1.php,这样就绕过了它的黑名单限制。

image

image

  1. 先上源码:

image

这次少了一个$file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);去除字符串::$DATA的函数,所以上传文件时,保存文件为1.php::$DATA,其实真正保存的时候,保存的是1.php,同样达到了效果。这里利用的是windows文件流特性绕过(PS:不大懂,还在研究)。

image

image

地址是../upload//1.php::$DATA,实际上在访问的时候,不需要加后面的::$DATA,就可以成功的getshell,如果加上,就会显示Forbidden。

  1. 上源码:

image

由图可知,类似于第6关以及第7关,只不过进行两次去空,一次去点,这样我们可以构造文件名为1.php. .(两个点之间有个空格,来应对函数的检测),如下图:

image

然后就可以访问了,成功getshell。

  1. 上源码:

image

由图可知,限制条件变少,其实做法有很多,首先str_ireplace($deny_ext,””, $file_name);这个函数只对文件名进行了一次过滤,所以可以嵌套文件名进行绕过,比如pphphp。

image

不过嵌套的的时候要注意,phphpp这个文件名是不可以的,因为这个函数检测是顺序的,也就是到最后会过滤掉phphpp前面的php,文件名会变成hpp:

image

其次,还可使用1.php.来进行绕过,也就是第七关的做法。

0x03 未完待续

题目有点小多,先写十道题目,总结的话,放在下一篇,包括知识点以及技巧。


Reprint please specify: wh1te 文件上传(一)

Previous
linux应急响应及安全巡检 linux应急响应及安全巡检
About Linux Emergency response Linux1.日志跟记录ssh ssh 后门 strings /usr/bin/.sshd | egrep '[1-9]{1,3}\.[1-9]{1,3}\.&#
2018-10-18
Next
SQL注入之宽字节注入 SQL注入之宽字节注入
About SQL Injection 宽字节注入0x01 前言对于SQL注入,我估计搞安全的都玩的滚瓜烂熟了,搞站什么的都是分分钟来的,但是之前做了一道宽字节注入的题目,又打开了我一扇通往新世界的大门(PS:早都碰到过,只不过一直没有
2018-07-24
TOC