文件上传漏洞

文件上传漏洞原理

在文件上传的功能处,若服务端未对上传的文件进行严格验证和过滤,导致攻击者上传恶意的脚本文件时,就有可能获取执行服务端命令的能力,这种漏洞称为文件上传漏洞

文件上传漏洞危害

上传恶意文件,getshell,控制服务器

成因

  • 服务器的错误配置

  • 开源编码器漏洞

  • 本地上传上限制不严格被绕过

  • 服务器端过滤不严格被绕过

防御方式

  • 白名单判断文件后缀是否合法

  • 文件上传的目录设置为不可执行

  • 判断文件类型

  • 使用随机数改写文件名和文件路径

  • 单独设置文件服务器的域名

  • 使用安全设备防御

常见上传功能点

  • 相册、头像上传

  • 视频、照片分享

  • 附件上传(论坛发帖、邮箱)

  • 文件管理器

文件上传校验方式

常见木马

一句话木马

  • 一句话木马,又称小马、网马、后门

  • 即利用简单少量代码实现命令执行、文件管理等目的

不同语言的一句话木马

木马植入的方式

  • 方式一:以文件的形式上传到服务器端,上传文件可以利用 MySQL 的 into outfile、表单文件上传等方式上传

  • 方式二:以字符串的形式上传到服务器端,通过MySQL的日志方式、shell 的 echo 方式、命令执行、反序列化等方式写入一句话代码,可写入新文件或者已存在的页面

  • 方式三:图片马+文件包含漏洞,通过上传图片马,结合文件包含漏洞上传 webshell

图片马制作

HxD编辑器插入

用 HxD 打开图片,最后的位置写入一句话保存,退出

cmd命令生成

其中b表示以二进制文件,a表示以ascii文件

图片版权属性中插入

Windows下右键图片,在属性->详细信息->版权内插入一句话即可

一句话木马绕过

函数替换

  • php 中除了 eval,还有其他函数也可以执行代码,比如 assert 函数

  • 命令执行函数 system、passthru、exec、shell_exec 等

双变量绕过

如:post:a=assert&b=phpinfo()

字符串变形绕过

其他字符串处理函数

定义函数绕过

回调函数绕过

  • 概念:指调用函数的时候,将另一个函数作为参数传递到调用的函数中

  • 功能:使用回调函数,是为了可以将一段自己定义的功能传到函数内部使用

其他回调函数

类的调用绕过

编码绕过

特殊字符干扰绕过

无字符特征码绕过

常见绕过方式

靶场练习

靶场下载地址:https://github.com/c0ny1/upload-labs

常见过滤函数

Pass-01

前端绕过,删除前端表单数据中的JavaScript代码

Pass-02

MIME类型检测绕过,BurpSuite抓包改包

Pass-03

黑名单绕过,BurpSuite抓包改包

双写::$DATA绕过,BurpSuite抓包改包

Pass-04

. .绕过,BurpSuite抓包改包

.htaccess绕过,先上传 .htaccess 文件,允许解析当前目录的 .jpg 文件,.htaccess 文件写入如下内容

Pass-05

apache 陌生后缀解析绕过,httpd.conf 中取消 addtype 注释,如:shell.php.xxx

Pass-06

大小写绕过,利用BurpSuite Intruder模块爆破php大小写后缀

.htaccess绕过 先上传 .htaccess 文件解析当前目录的 .jpg 文件,.htaccess 文件写入如下内容

双写::$DATA绕过,BurpSuite抓包改包

Pass-07

空格绕过,BurpSuite抓包改包

Pass-08

点号绕过,BurpSuite抓包改包

Pass-09

::$DATA绕过,BurpSuite抓包改包

Pass-10

. .绕过,BurpSuite抓包改包

Pass-11

双写绕过,BurpSuite抓包改包

Pass-12

00截断的原理,就是利用0x00是字符串的结束标识符,攻击者可以利用手动添加字符串标识符的方式来将后面的内容进行截断,而后面的内容又可以帮助我们绕过检测。需要注意的是,0x00截断是16进制的截断,需要修改16进制的数据头,如果使用burp,就要在Hex中对数据进行改写

url中的%00(只要是这种%xx)的形式,webserver会把它当作十六进制处理,然后把16进制的hex自动翻译成ascii码值"NULL"实现了截断,burpsuite中16进制编辑器将空格20改成了00

%00截断GET型(php<5.3.4、magic_quotes_gpc=off),BurpSuite抓包改包

Pass-13

0x00截断POST型(php<5.3.4、magic_quotes_gpc=off),BurpSuite抓包改包

Pass-14

gif头部绕过,修改一句话木马文件,在头部加上 GIF89a,将文件重命名为 .gif 后缀,再利用文件包含:

Pass-15

getimagesize()绕过,方法与上一题相同

Pass-16

exif_imagetype()绕过,开启php_exif后,方法与上一题相同

Pass-17

二次渲染绕过,上传一个正常图片,然后下载下来与原来的图片做对比,用工具找到没有发生改变的地方,写入一句话,保存后再次上传

Pass-18

条件竞争绕过,先开启 python 请求脚本,再用 BurpSuite 爆破模块的 Null payloads 模式使用多线程一直发包

Pass-19

Pass-20

/.绕过,BurpSuite抓包改包,将 upload-19.jpg 改为 upload-19.php/.

Pass-21

BurpSuite抓包改包

Last updated