upload-labs靶场学习笔记1-21关

目录

 

Pass-01(前端验证)

Pass-02(MIME验证)

Pass-03(黑名单验证,特殊后缀)

 Pass-04(黑名单验证,.htaccess重写解析绕过上传)

 Pass-05(黑名单验证,.user.ini.点空格点)

 Pass-06(黑名单,大小写绕过)

 Pass-07(黑名单验证,空格绕过)

 Pass-08(黑名单验证,点号绕过)

 Pass-09(. NTFS 交换数据流::$DATA 绕过上传)

 Pass-10(黑名单)

Pass-11(黑名单验证,双写后缀名绕过上传) 

 Pass-12(目录可控%00 截断绕过上传)

 Pass-13(目录可控 POST 绕过上传 00截断)

 Pass-14(图片马unpack)

 Pass-15(图片检测函数getimagesize绕过上传,图片马)

 Pass-16(exif_imagetype图片马)

Pass-17(二次渲染绕过)

Pass-18(文件上传条件竞争漏洞绕过一)

Pass-19(文件上传条件竞争漏洞绕过二)

Pass-20(文件名可控绕过上传)

 Pass-21(数组绕过上传)

总结:文件上传的防御方法


 

Pass-01(前端验证)

因为第一关是通过客户端js前端校验,只需要删除checkFile()函数把值改成true即可。然后上传,即可成功上传php文件。

upload-labs靶场学习笔记1-21关_第1张图片

 upload-labs靶场学习笔记1-21关_第2张图片

复制图片地址然后打开蚁剑连接获取网站webshell

Pass-02(MIME验证)

查看源码,分析后台php代码通过content-type对文件判断类型,content-type在客户端可以被修改,所以存在绕过风险。首先进行submit提交判断,再检测文件类型如果是image/jpeg或者image/png即允许上传。

upload-labs靶场学习笔记1-21关_第3张图片

 上传php文件并用bp抓包,修改content-type为image/jpeg,再上传即可。

upload-labs靶场学习笔记1-21关_第4张图片

复制图片地址然后打开蚁剑连接获取网站webshell

Pass-03(黑名单验证,特殊后缀)

本人题目用的环境是php5.4.45nts版本

分析源码,本题是通过黑名单验证,验证不全可以通过php3、php5、phtml,pht等绕过,前提应该修改php配置文件,改一下httpd.conf文件里的#AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php .php .phtml .php5 .php3,去掉#号。我用的是phpstudy,修改完配置记得重启phpstudy服务。然后修改拓展名上传1.php3文件,上传成功。upload-labs靶场学习笔记1-21关_第5张图片

关于AddType命令的作用解释

AddType 指令 作用:在给定的文件扩展名与特定的内容类型之间建立映射 语法:AddType MIME-type extension
[extension] …
AddType指令在给定的文件扩展名与特定的内容类型之间建立映射关系。MIME-type指明了包含extension扩展名的文件的媒体类型。
AddType 是与类型表相关的,描述的是扩展名与文件类型之间的关系。

复制图片地址然后打开蚁剑连接获取网站webshell

 Pass-04(黑名单验证,.htaccess重写解析绕过上传)

上传模块,黑名单过滤了所有的能执行的后缀名,如果允许上传.htaccess。htaccess 文件的作用是 可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定 义错误页面、改变你的文件扩展名、封禁特定 IP 地址的用户、只允许特定 IP 地 址的用户、禁止目录列表,以及使用其他文件作为 index 文件等一些功能。 在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文 件。要 htaccess 的规则生效 则需要在 apache 开启 rewrite 重写模块,因为 apache 是多数都开启这个模块,所以规则一般都生效。

upload-labs靶场学习笔记1-21关_第6张图片

upload-labs靶场学习笔记1-21关_第7张图片

分析源码, 过滤了如下后缀名:.php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",". pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jsp a",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHt ml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa", ".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf"但是没有过滤.htacess后缀名。

在.htacess文件里写入

先上传.htacess文件然后再上传1.jpg文件,访问1.jpg目录解析为php代码

复制图片地址然后打开蚁剑连接获取网站webshell

 

 Pass-05(黑名单验证,.user.ini.点空格点)

 upload-labs靶场学习笔记1-21关_第8张图片

查看源码,该过滤的都被过滤了只有.ini没有被过滤,查看提示

 百度查询.ini

user.ini : 自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被
   CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用
   .htaccess 文件有同样效果。
   
   除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web
   根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
   
   在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI
   设置可被识别。
   
   两个新的 INI 指令,user_ini.filename 和 user_ini.cache_ttl 控制着用户 INI 文件的使用。
   
   user_ini.filename 设定了 PHP 会在每个目录下搜寻的文件名;如果设定为空字符串则 PHP 不会搜寻。默认值是
   .user.ini。
   
   user_ini.cache_ttl 控制着重新读取用户 INI 文件的间隔时间。默认是 300 秒(5 分钟)。

php.ini 是php配置文件,.user.ini也会被当成配置文件执行,从而导致php文件解析漏洞

引发.user.ini需要三个条件,

服务器脚本语言为PHP  

服务器使用CGI/FastCGI模式  

上传目录下要有可执行的php文件

什么是CGI/FastCGI模式呢?我也不知道,所以百度了一下。

什么是 CGI
       CGI 的全称为“通用网关接口”(Common Gateway Interface),为 HTTP 服务器与其他机器上的程序服务通信交流的一种工具, CGI 程序须运行在网络服务器上。
   
       传统 CGI 接口方式的主要缺点是性能较差,因为每次 HTTP 服务器遇到动态程序时都需要重新启动解析器来执行解析,之后结果才会被返回给 HTTP
       服务器。这在处理高并发访问时几乎是不可用的,因此就诞生了 FastCGI。另外,传统的 CGI 接口方式安全性也很差,故而现在已经很少被使用了。
什么是 FastCGI
       FastCGI 是一个可伸缩地、高速地在 HTTP 服务器和动态服务脚本语言间通信的接口(在 Linux 下, FastCGI 接口即为 socket,这个socket 可以是文件 socket,也可以是IP socket),主要优点是把动态语言和 HTTP
   服务器分离开来。多数流行的 HTTP 服务器都支持 FastCGI,包括 Apache 、 Nginx 和 Lighttpd 等。
   
   同时,FastCGI也被许多脚本语言所支持,例如当前比较流行的脚本语言PHP。FastCGI 接口采用的是C/S架构,它可以将 HTTP 服务器和脚本服务器分开,同时还能在脚本解析服务器上启动一个或多个脚本来解析守护进程。当 HTTP
   服务器遇到动态程序时,可以将其直接交付给 FastCGI 进程来执行,然后将得到结果返回给浏览器。这种方式可以让 HTTP
   服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高整个应用系统的性能。

我们的环境满足CGI条件,然后创建一个.user.ini文件并上传上去

upload-labs靶场学习笔记1-21关_第9张图片

.user.ini文件里的意思是:所有的php文件都自动包含666.jpg文件。.user.ini相当于一个用户自定义的php.ini,然后上传123.jpg文件,内含一句话木马。

 

 

将这里的300改为5,重启phpstudy服务等待5s,复制图片地址连接蚁剑获取webshell。

 

 Pass-06(黑名单,大小写绕过)

upload-labs靶场学习笔记1-21关_第10张图片

查看源码没有对大小写进行严格过滤,可以通过大小写方式绕过黑名单。把php改为Php即可绕过上传, 复制图片地址连接蚁剑获取webshell。

 Pass-07(黑名单验证,空格绕过)

upload-labs靶场学习笔记1-21关_第11张图片

查看源码,没有去空格函数trim(),可以通过加空格绕过。 

bp抓包,在1.php后面加一个空格,放包即可上传。

upload-labs靶场学习笔记1-21关_第12张图片

复制图片地址连接蚁剑获取webshell。

 Pass-08(黑名单验证,点号绕过)

在 windows 中文件后缀名. 系统会自动忽略.所以 shell.php. 像 shell.php 的效果一 样。所以可以在文件名后面机上.绕过。

 upload-labs靶场学习笔记1-21关_第13张图片

同样是黑名单过滤,但是可以加点.php.绕过。

用bp抓包,修改文件名为1.php.然后上传。

 

 然后复制图片地址连接蚁剑获取webshell。

 Pass-09(. NTFS 交换数据流::$DATA 绕过上传)

如果后缀名没有对::$DATA 进行判断,利用 windows 系统 NTFS 特征可以绕过上 传。

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

upload-labs靶场学习笔记1-21关_第14张图片

 查看源码,没有对::DATA过滤,可以用::DATA过滤。

接着用bp抓包然后修改文件后缀名::$DATA即可上传成功。

 

  然后复制图片地址连接蚁剑获取webshell。记得删除::$DATA。

 Pass-10(黑名单)

upload-labs靶场学习笔记1-21关_第15张图片

分析源码,构造后缀名绕过黑名单,

filen​ame=deldot(file_name)操作去除文件名末尾的点,构造后缀绕过黑名单

补充知识:deldot()函数从后向前检测,当检测到末尾的第一个点时会继续它的检测,但是遇到空格会停下来

 可以用.php. .进行绕过。

上传php文件并用bp抓包,修改后缀名为.php. .两点之间带空格,然后上传。

upload-labs靶场学习笔记1-21关_第16张图片

 然后复制图片地址连接蚁剑获取webshell。

Pass-11(黑名单验证,双写后缀名绕过上传) 

在上传模块,有的代码会把黑名单的后缀名替换成空,例如 a.php 会把 php 替换 成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传。

upload-labs靶场学习笔记1-21关_第17张图片

 分析源码,就是上述替换成空的情况。我们可以进行双写后缀名进行绕过。

同样是bp抓包,修改后缀名为1.pphphp。放包即可成功上传。

upload-labs靶场学习笔记1-21关_第18张图片

  然后复制图片地址连接蚁剑获取webshell。

 Pass-12(目录可控%00 截断绕过上传)

以上都是一些黑名单被绕过的,如果黑名单上传检测后,没有限定后缀名,绕过 的方法很多,与黑名单相对的就是白名单,使用白名单验证会相对比较安全,因 为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险。

upload-labs靶场学习笔记1-21关_第19张图片

 代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是 $_GET['save_path']服务器接受客户端的值,这个值可被客户端修改。所以会留下 安全问题。

可以使用%00截断的条件:

当 magic_quotes_gpc关闭的情况下,可以用%00 对目录或者文件名进行截断。
php 版本小于 5.3.4

原理:php的一些函数的底层是C语言,而move_uploaded_file就是其中之一,遇到0x00会截断,0x表示16进制,URL中%00解码成16进制就是0x00。

upload-labs靶场学习笔记1-21关_第20张图片

放包之后,  然后复制图片地址连接蚁剑获取webshell。

 Pass-13(目录可控 POST 绕过上传 00截断)

上面是 GET 请求的,可以直接在 url 输入%00 即可截断,但是在 post 下直接注 入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断 成文件名。

 补充知识:POST不会对里面的数据自动解码,需要在Hex中修改。

 原理同get,在此不赘述了,只不过请求变成POST请求。

upload-labs靶场学习笔记1-21关_第21张图片

+号的Hex是2b,把2b改成00。

 然后放包,复制图片地址连接蚁剑获取webshell。

 Pass-14(图片马unpack)

有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。常见 的文件上传图片头检测 它检测图片是两个字节的长度,如果不是图片的格式, 会禁止上传。 

常见的文件头
 JPEG (jpg),文件头:FFD8FF
 PNG (png),文件头:89504E47
 GIF (gif),文件头:47494638
 TIFF (tif),文件头:49492A00
 Windows Bitmap (bmp),文件头:424D

制作图片一句话,使用 copy 1.gif/b+moon.php shell.php 将 php 文件附加再 jpg 图片上,直接上传即可。

copy 1.jpg/b+1.php shell.jpg

 上传成功之后,利用文件包含漏洞执行php代码。

upload-labs靶场学习笔记1-21关_第22张图片

 点击文件包含漏洞 ,get传图片目录参数。

upload-labs靶场学习笔记1-21关_第23张图片

 

 复制图片地址连接蚁剑获取webshell。

 Pass-15(图片检测函数getimagesize绕过上传,图片马)

查看代码

upload-labs靶场学习笔记1-21关_第24张图片

 getimagesize 是获取图片的大小,如果头文件不是图片会报错直接可以用图片马 绕过检测。

图片马制作如上一关,直接上传并用文件包含漏洞即可。

最后再复制图片地址连接蚁剑。

 Pass-16(exif_imagetype图片马)

知识补充: exif_imagetype()读取一个图像的第一个字节并检查其后缀名。
返回值与getimage()函数返回的索引2相同,但是速度比getimage快得多。需要开启php_exif模块。

upload-labs靶场学习笔记1-21关_第25张图片

道理还是同上一关,制作图片马上传即可获取webshell。

Pass-17(二次渲染绕过)

有些图片上传,会对上传的图片进行二次渲染后在保存,体积可能会更小,图片 会模糊一些,但是符合网站的需求。例如新闻图片封面等可能需要二次渲染,因 为原图片占用的体积更大。访问的人数太多时候会占用,很大带宽。二次渲染后 的图片内容会减少,如果里面包含后门代码,可能会被省略。导致上传的图片马, 恶意代码被清除。首先判断图片是否允许上传 gif,gif 图片在二次渲染后,与原图片差别不会太大。 所以二次渲染攻击最好用 git 图片马。 制作图片马 将原图片上传,下载渲染后的图片进行对比,找相同处,覆盖字符串,填写一句 话后门,或者恶意指令。

用hxd对比上传前后的图片,找到前后编码不变的地方,插入php代码或者一句话。

upload-labs靶场学习笔记1-21关_第26张图片

原图片与渲染后的图片这个位置的字符串没有改变所在原图片这里替换成直接上传即可。

然后利用文件包含漏洞连接蚁剑。

Pass-18(文件上传条件竞争漏洞绕过一)

在文件上传时,如果逻辑不对,会造成很大危害,例如文件上传时,用 move_uploaded_file 把上传的临时文件移动到指定目录,接着再用 rename 文件 设置为图片格式,如果在 rename 之前 move_uploaded_file 这个步骤 如果这个文 件可被客户端访问,这样我们也可以获取一个 webshell。

upload-labs靶场学习笔记1-21关_第27张图片

 采用白名单上传,$upload_file = UPLOAD_PATH . '/' . $file_name; 设置上传路径, 后缀名没有限定为图片类型,接着 move_uploaded_file($temp_file, $upload_file) 将图片移动指定的目录,接着使用 rename 重名为图片类型。在重名之前如果被 浏览器访问,可以得到一个 webshell。

 上传 php 后门脚本,上传之后用 burpsutie 设置访问,线程建议体提高一些。 抓包上传 php 文件 设置变量不停的提交这包

upload-labs靶场学习笔记1-21关_第28张图片

 需要知道 php 的访问路径,抓包 不停的提交访问。 首先提交访问上传后的 php 路径 第二提交上传的文件的数据包即可。

upload-labs靶场学习笔记1-21关_第29张图片

 可以看到页面返回 200 证明上传成功

Pass-19(文件上传条件竞争漏洞绕过二)

这一关与上一关相似,不过是上传的不是php文件而是图片马,先制作图片马,然后步骤跟上一关相似。在此不作赘述。

Pass-20(文件名可控绕过上传)

文件上传时,文件名的可被客户端修改控制,会导致漏洞产生。

查看代码

upload-labs靶场学习笔记1-21关_第30张图片

 采用黑名单限制上传文件,但是 $_POST['save_name']文件是可控的,可被客户端 任意修改,造成安全漏洞.

文件名攻击的方法主要有两种

1.上传文件,文件吗采用%00 截断,抓包解码例如 moon.php%00.php 截断后 moon.php 或者使用/. 2.与中间的漏洞配合使用 例如 iis6.0 上传 1.php;1.jpg apache 上传 1.php.a 也 能解析文件 a.asp;1.jpg 解析成 asp

%00 截断 需要 gpc 关闭 抓包 解码 提交即可 截断文件名 php 版本小于 5.3.4

upload-labs靶场学习笔记1-21关_第31张图片

 upload-labs靶场学习笔记1-21关_第32张图片

 Pass-21(数组绕过上传)

有的文件上传,如果支持数组上传或者数组命名。如果逻辑写的有问题会造成安 全隐患,导致不可预期的上传。这种上传攻击,它是属于攻击者白盒审计后发现 的漏洞居多。

查看代码

upload-labs靶场学习笔记1-21关_第33张图片

 首先检测文件类型,看到可控参数 save_name 如果不是数组如果后缀名不是图 片禁止上传。 如果是数组绕过图片类型检测 接着处理数组。 首先 一个例子的处理。 如果是两个参数 拼接字符串是 xx.php/.png

upload-labs靶场学习笔记1-21关_第34张图片

 构造上传表单,设置数组上传。从代码中,可以知道第二个数组必须大于 1 即可 第二个数组的值就获取不了,字符串拼接起来就是 moon.php/. 就能上传

upload-labs靶场学习笔记1-21关_第35张图片

 这题确实没搞懂。

总结:文件上传的防御方法

服务器端使用白名单防御,修复 web 中间件的漏洞,禁止客户端存在可控参 数,存放文件目录禁止脚本执行,限制后缀名 一定要设置图片格式 jpg、gif 、 png 文件名随机的,不可预测。

你可能感兴趣的:(学习,web安全,安全,安全性测试)