upload靶场总结1-11客户端验证和文件后缀验证

发布时间 2023-05-24 16:43:43作者: vaneshadow

第一关JS校验

利用文件上传js前端的后缀名检测来进行检测

后端并没有对文件进行检验

上传文件方法

1.关闭前端的js

image-20230321173315964

2.burp抓包 先上传允许上传的文件,然后抓包后修改上传文件的后缀

image-20230321173625089

image-20230321173820589

image-20230321173846162

3、将网站源码复制下来,放到本地,然后将js代码删除。

先查看网页源代码然后复制粘贴到本地文本文件,将文件名后缀改为html,用vscode打开删除js校验的代码

若是直接打开则能看到文件上传还是存在

image-20230321182955684

但是我们并没有上传的目的地址

回到原先正常的页面,上传一个正常的照片,从开发者工具网络中

image-20230321184349788

请求地址就是我们需要上传的地址

修改我们的代码文件action 这个action是告诉他这个图片提交给谁,因为这个源代码中没有,那我只好给它整一个

image-20230321184612370

保存后以HTML浏览器打开

image-20230321190513275

上传成功

第二关服务端(后端)验证

一如既往burp抓包

漏洞描述:只检测 content-type 字段导致的漏洞。(后端利用 PHP 的全局数组$_FILES()获取上传文件信息)

利用方法:修改 content-type 字段的值为图片格式。

image-20230321190935328

常用 content-type 字段:

image/jpeg :jpg 图片格式

image/png :png 图片格式

image/gif :gif 图片格式

text/plain :纯文本格式

text/xml : XML 格式

text/html : HTML 格式

image-20230321191424895

上传成功

image-20230321191314357

第三关文件名后缀校验(黑名单绕过)

image-20230321191721388

由代码可见,获取文件后缀名后,进行判断有些是不能上传的,但是这哥们明显没有将所有危险文件都deny

特殊文件名绕过: .php3 .php4 .php5 .phtml .phtm .phps .phpt .php345

image-20230321191955075

上传成功,页面回显访问回显路径

image-20230321192024651

因为上传上去的文件名会改变,但是在数据包(burp)中有回显(实战中可能没有),所以我们还是可以访问的

上传成功

注意

要在apache的httpd.conf中有如下配置代码:AddType application/x-httpd-php .php .phtml .phps .php5 .pht,如果不配置他是无法解析php5代码的,访问的时候就是一个空白页

配置过程

image-20230321192234529

打开配置文件---打开httpd.conf

存疑我没找到

第四关文件名后缀校验(配置文件解析控制)

image-20230321193326767

黑名单长到心碎

但可

以允许上传.htaccess 文件。

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

利用方法:上传.htaccess 解析文件,利用其配置,将白名单文件的类型解析成php 文件类型。

上传.htaccess 文件 内容如下:(将服务器上的 1.jpg 文件解析成 php 文件,这里文件可以自由配置)

<FilesMatch "1.jpg">

SetHandler application/x-httpd-php

</FilesMatch>

再上传一个一句话木马,文件名为 1.jpg,依旧访问 1.jpg,但其会以 php形式显示

注意.htaccess文件不能起名字,他就是.htaccess文件,如果你将他改为4.htaccess或者其他的什么名字是不可以的,无法解析。在实战中有可能上传上去这个文件会被自动重命名,被重命名了就不可以了。

如果以上操作都弄好了,还是出不来,还是去改phpstudy配置文件,其他选项菜单--打开配置文件---httpd.conf

img

箭头指向位置一开始none,改为all保存,重启phpstudy,就可以了。

第五关

image-20230321200557441

很好他把上一关学到的htaccess禁用了

​ $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");

利用方法:

(1)使用大小写绕过.htaccess (网上有这个方法,但我看了看我的这个版本的源码,它给转化了)

image-20230321201133766

真的难受兄弟

(2)利用.user.ini 配置文件

.user.ini。它比.htaccess 用的更广,不管服务器是 nginx/apache/IIS,当使用 CGI/FastCGI 来解析 php 时,php 会优先搜索目录下所有的.ini 文件,并应用其中的配置。类似于 apache 的.htaccess,但语法与.htacces 不同,语法跟 php.ini 一致。

image-20230321201446355

php.ini 是 php的配置文件,.user.ini 中的字段也会被 php 视为配置文件来处理,从而导致 php 的文件解析漏洞。

但是想要引发 .user.ini 解析漏洞需要三个前提条件

  • 服务器脚本语言为PHP
  • 服务器使用CGI/FastCGI模式
  • 上传目录下要有可执行的php文件
CGI

[公共网关接口](https://baike.baidu.com/item/公共网关接口/10911997)(Common Gateway Interface,CGI)是Web 服务器运行时外部程序的规范,按CGI 编写的程序可以扩展服务器功能。CGI 应用程序能与[浏览器](https://baike.baidu.com/item/浏览器/213911)进行交互,还可通过数据API与[数据库服务器](https://baike.baidu.com/item/数据库服务器/613818)等外部数据源进行[通信](https://baike.baidu.com/item/通信/300982),从数据库服务器中获取数据。格式化为HTML文档后,发送给浏览器,也可以将从浏览器获得的数据放到数据库中。

FastCGI

快速通用网关接口**(**Fast** **C**ommon **G**ateway **I**nterface/**FastCGI**)是一种让交互程序与Web服务器通信的协议。FastCGI是早期[通用网关接口](https://zh.wikipedia.org/wiki/通用网关接口)(CGI)的增强版本。

FastCGI致力于减少[网页服务器](https://zh.wikipedia.org/wiki/網頁伺服器)与[CGI](https://zh.wikipedia.org/wiki/通用网关接口)[程序](https://zh.wikipedia.org/wiki/计算机程序)之间交互的开销,从而使[服务器](https://zh.wikipedia.org/wiki/伺服器)可以同时处理更多的网页请求。

以上全是互联网产物

上传文件 .user.ini,内容为: auto_prepend_file=1.jpg

.user.ini文件里的意思是:所有的php文件都自动包含1.jpg文件。.user.ini相当于一个用户自定义的php.ini

然后在复制图像地址后,用蚁剑访问将文件名改为readme.php

3、这关其实也可用 php. . 点空格点 绕过上传(如下图)

image-20230321202830051

第六关文件名后缀校验(大小写绕过)

这一关同样是后端黑名单,同时过滤掉.htaccess和.ini。但是没有使用strtolower()函数,可以使用大小写绕过黑名单

把.php 格式改为 .Php 上传上去之后,就会自动解析为.php.

大小写绕过原理:

Windows 系统下,对于文件名中的大小写不敏感。例如:test.php 和 TeSt.PHP 是一样的。

Linux 系统下,对于文件名中的大小写敏感。例如:test.php 和 TesT.php 就是不一样的

image-20230321203609163

image-20230321203632655

第七关文件名后缀校验(空格绕过)

漏洞描述:对上传的文件名未做去空格的操作->trim()

Windows 系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。

利用方法:burp 抓包,修改对应的文件名 添加空格

image-20230321204200779

上传成功

image-20230321204229400

第八关文件名后缀校验(点号绕过)

漏洞描述:对上传的文件后缀名未做去点.的操作 ->deldot()过滤文件名末尾的.

利用 Windows 系统下,文件后缀名最后一个点会被自动去除。

利用方法:文件后缀名为 .php.

image-20230321204740100

上传成功

image-20230321204812903

第九关 文件名后缀校验(::$DATA 绕过)

漏洞描述:对上传的文件后缀名没有做去::$DATA 处理

image-20230321205341703

这个关卡的代码没有这一行 因此我们可以利用::$DATA后缀

Windows 系统下,如果上传的文件名为 1.php::$DATA 会在服务器上生成一个

1.php 的文件,其中内容和所上传文件内容相同,并被解析。

利用方法:上传带有一句话木马的文件,其文件名为 1.php::$DATA

image-20230321205517276

但是直接按照路径打开

image-20230321205651327

把::$data 删掉

image-20230321205722581

成功上传

也就是说用蚁剑连接的时候也要url中删除::$data

第十关文件名后缀校验(拼接绕过)

漏洞描述:将文件名进行过滤操作后,将文件名拼接在路径后面,所以需要绕过前面的首尾去空以及去点。

利用方法:上传文件名为 .php. .(点+php+点+空格+点)

image-20230321210139342

上传成功

image-20230321210209781

第十一关文件名后缀校验(双写绕过)

漏洞描述:利用 str_ireplace()将文件名中符合黑名单的字符串替换成空

利用方式:利用双写黑名单字符,对字符串的一次过滤后拼接出 php,文件名.pphphp

<?php
echo str_ireplace("WORLD","Shanghai","Hello world!");
?>
把字符串 "Hello world!" 中的字符 "WORLD"(不区分大小写)替换成 "Shanghai":

image-20230321211306857

image-20230321211449959

上传成功

image-20230321211558059