47

学习前必读:

1、课前一定要明白:
无文件解析安全问题上,格式解析是一对一的(不能jpg解析php)
换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析

2、文件上传安全指的是攻击者通过利用上传实现后门的写入连接后门进行权限控制的安全问题,对于如何确保这类安全问题,一般会从原生态功能中的文件内容,文件后缀,文件类型等方面判断,但是漏洞可能不仅在本身的代码验证逻辑中出现安全问题,也会在语言版本,语言函数,中间件,引用的第三方编辑器等存在缺陷地方配合利用。另外文件上传也有多个存储逻辑,不同的文件存储方案也会给攻击者带来不一样的挑战!

测试环境安装参考:

https://github.com/ffffffff0x/f8x

https://github.com/fuzzdb-project/fuzzdb

https://github.com/sqlsec/upload-labs-docker

  1. 下载上述资源

  2. docker安装

    f8x -df8x -docker

  3. 进入项目文件夹

    cd upload-labs-docker

  4. 一键部署运行
    docker-compose up -d

upload-labs-docker知识点:

1、前端JS

  • 第一关:使用哥斯拉生成后门在可上传文件类型(如.jpg)中,上传后,因前端验证,后端不验证,所以抓包修改文件类型,直接发送.php文件,再连接就行。

2、.htaccess(中间件)
AddType application/x-httpd-php .png

借助这个配置让.png的命名文件当做类型application/x-httpd-php .png执行(php的类型)

当做php执行

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

  • 第二关:上传2.php,抓包该参数,文件格式改成.htaccess,内容改成AddType application/x-httpd-php .png ,接着上传2.png,内容包含php木马后门,直接哥斯拉连接2.png

3、MIME类型
Content-Type:image/png

媒体类型

(通常称为Multipurpose Internet Mail ExtensionsMIME类型 )是一种标准,用来表示文档、文件或字节流的性质和格式。

MIME的组成结构非常简单;由类型与子类型两个字符串中间用 ‘/‘ 分隔而组成。不允许空格存在。type 表示可以被分多个子类的独立类别。subtype 表示细分后的每个类型。

通用的结构为:

1
type/subtype

MIME类型对大小写不敏感,但是传统写法都是小写。

  • 第三关:修改类型就行了,验证方式不能只通过一种方式,需要多方位去验证

4、文件头判断
GIF89a

一个文件里面的内容到底是啥?用惯了Windows的人肯定是看后缀。但是后缀这个东西说改就改,不可靠。所以,最保险的还是把文件类型信息写到文件里面,通常来说,也就是写到文件开头的那几个字节。这是最方便,最快捷的用来辨别一个文件真实内容的方法。

常见的文件头标志如下:

JPEG (jpg),文件头:

1
FFD8FF

PNG (png),文件头:

1
89504E47

GIF (gif),文件头:

1
47494638

HTML (html),文件头:

1
68746D6C3E

ZIP Archive (zip),文件头:

1
504B0304

RAR Archive (rar),文件头:

1
52617221

Adobe Acrobat (pdf),文件头:

1
255044462D312E

MS Word/Excel (xls.or.doc),文件头:

1
D0CF11E0
  • 第四关:修改上传文件前缀为GIF,然后抓包把类型也改了,上传

5、黑名单-过滤不严
无递归,pphphp,也没有过滤大小写

replace.png

  • 第五关:上传一个.pphphp

6、黑名单-过滤不严
系统大小写敏感属性

head.png

因为题目环境是 Docker 容器运行的 Linux 系统,所以本题人工修改成了 Windows 的特性

Linux区分大小写,Windows不区分

  • 第六关:上传一个.Php

7、低版本GET-%00截断
自动解码一次 /var/www/html/upload/x.php%00

url上面 %00 (自动解码一次)

PHP 内核是由 C 语言实现的,所以使用了 C 语言中的一些字符串处理函数。比如在连接字符串时候, 0 字节
(\x00) 将作为字符串结束符。所以在这个地方,攻击者只要在最后加入一个 0 字节,就能截断 file 变量之后的字符串

这种方法只适用于

  • magic_quotes_gpc = Off

  • PHP 版本小于 5.3.4

  • 第七关:确认版本无误后,上传正确格式包含木马的图片文件,抓包,修改GET上传路径,使用%00截断后面的内容

8、低版本POST-%00截断(环境要求与第七题同)
手工解码一次 ../upload/x.php%00 二次解码

00截断 是%00解码结果

post下面 %00 (手工解码一次)

  • 第八关:上传正确格式包含木马的图片文件,抓包,修改POST数据包下面上传路径,使用%00截断后面的内容,接着使用解码解回去发送

9、黑名单-过滤不严
php3

fuzzdbmaster项目中的字典,后缀爆破:attack file-upload altextensions-php.txt

head.png

  • 第九关:抓包,php字典后缀爆破,看长度和响应路径

10、逻辑不严-条件竞争

逻辑缺陷-先上传后判断 → 访问即创建代码(访问了自动触发代码 新建一个文件写入后门)

正确:先判断,后上传
<?php fputs(fopen('xiao.php','w'),'<?php eval($_REQUEST[1]);?>');?>
上传不断发包
请求不断发包

条件竞争是指一个系统的运行结果依赖于不受控制的事件的先后顺序。当这些不受控制的事件并没有按照开发者想要的方式运行时,就可能会出现 bug。尤其在当前我们的系统中大量对资源进行共享,如果处理不当的话,就会产生条件竞争漏洞。

攻击者上传了一个用来生成恶意 shell 的文件,在上传完成和安全检查完成并删除它的间隙,攻击者通过不断地发起访问请求的方法访问了该文件,该文件就会被执行,并且在服务器上生成一个恶意 shell 的文件。至此,该文件的任务就已全部完成,至于后面发现它是一个不安全的文件并把它删除的问题都已经不重要了,因为攻击者已经成功的在服务器中植入了一个shell 文件,后续的一切就都不是问题了。

不过竞争的马因为生存周期短的原因,所以和普通的 Webshell 不太一样,他的使命是在有限的生命中等待一个有缘人的光顾,然后快速生成一个小 Webshell,落红不是无物,化作春泥更护花(泪目)。

head.png

  • 第十关:在文件停留过服务器的一秒内快速访问生成后门,使用Null payloads和continue indefinitely持续访问30010以及30010/upload/xiao.php,然后一直刷新

我的电脑好像太慢了,一直刷不出来,绝

11、二次渲染
先搞个正常图片,上传导出渲染后的图片
对比保留部分,在保留部分添加后门代码
最后利用提示的文件包含执行图片后门代码

head.png

  • 第十一关:使用16进制编辑器把后门插入到两个图片保留的一样部分

12、函数缺陷
move_uploaded_file 1.php/.

head.png

如果可以让我们自己发挥重命名,那么shell.php/. 可以上传一个php文件

13、代码审计-数组绕过
—————————–174283082921961
Content-Disposition: form-data; name=”save_name[0]”

http://2.php/
—————————–174283082921961
Content-Disposition: form-data; name=”save_name[2]”

gif