Web有两个系列的题。考点都比较简单。
主要就是考思路吧。
Web签到题
app.post('/getflag', (req, res) => {
console.log("[-] Getflag post")
if (!req.body) {return res.send("400")}
let one = req.body.one
let two = req.body.two
console.log(req.body)
if (!one || !two) {
return res.send("400")
}
if ((one.length !== two.length) || (one === two)) {
return res.send("Strings are either too different or not different enough")
}
one = customhash.hash(secret_key + one)
two = customhash.hash(secret_key + two)
if (one == two) {
console.log("[*] Flag get!")
return res.send(flag)
} else {
return res.send(`${one} did not match ${two}!`)
}
})
很明显的nodejs弱类型
{"one":[1],"two":[1]}
第一个系列:
首先就是个登陆入口。
存在robots.txt。里面有个admin-stash。访问得到Flag
登陆入口。没啥东西。尝试sql注入。打了个单引号。500了。是个python。
然后各种测试。后端其实是sqlite
用' or 1--
得到Attempting to login as more than one user!??
提示多个用户登陆。。应该就是or 1返回了所有用户.用limit语句成功登陆
' or 1 limit 0,1--
登陆后。发现有三个链接。
URL是/watch/TCYI.mp4
访问/watch/a就500了。
python web中。有很多类似/<path:file>
的任意文件读取
尝试访问/watch/app.py。
得到Flag
在界面的右下角有个Admin
访问就跳转。估计不是Admin身份。
用limit语句遍历登陆。发现没有Admin用户。
抓包看看。发现有个JWT头。解密后就是当前用户和privialge。权限
找了下密钥。公钥。都没找到。对于jwt一般就HS256或者none。或者找到爆破密钥
这里是none
const jwt=require('jsonwebtoken');
const user='admin';
const privilege=2;
console.log(jwt.sign({user,privilege}, null, {algorithm: 'none'}));
第二个系列
依旧是登陆
欸。依旧是存在robots.txt。没啥用。几个文件都不存在
读取backup.txt。密码就是flag
读取main.py。得到第二个flag
然后。依旧是sqlite注入
' or 1 limit 1,1--
得到admin的flag
limit遍历。还有一个用户的flag
然后就没思路了。。。
尝试跑了下库。没东西。
Ha1师傅的字典🐂🍺。扫出了sitemap.xml
得到sitemap.xml.bak
最后一个挑战。burp抓包看到__adminPortal
带上登陆后的session访问得到
F12发现unicode字符。实质上是普通字符+一堆unicode字符。unicode把普通字符覆盖了。写个脚本匹配出里面的普通字符得到Flag
import requests
import string
c = {
'session':'854b2123-1894-40c6-bcc1-032d3a7da846'
}
s=string.printable
result=requests.get(url='http://88.198.219.20:45041/__adminPortal',cookies=c).text
data=result.split('<h3 style="display:none">')
for i in data[1]:
if i in s:
print(i,end='')
else:
pass
取证题就会一个流量分析。。
WIFI数据包。拿rockyou爆破出密码
然后解密数据包导出PDF得到Flag
杂项python。
import math
x = 0.0
z = 0.0
flag_x = 10000000000000.0
flag_z = 10000000000000.0
print("Your player is at 0,0")
print("The flag is at 10000000000000, 10000000000000")
print("Enter your next position in the form x,y")
print("You can move a maximum of 10 metres at a time")
for _ in range(100):
print(f"Current position: {x}, {z}")
try:
move = input("Enter next position(maximum distance of 10): ").split(",")
new_x = float(move[0])
new_z = float(move[1])
except Exception:
continue
diff_x = new_x - x
diff_z = new_z - z
dist = math.sqrt(diff_x ** 2 + diff_z ** 2)
if dist > 10:
print("You moved too far")
else:
x = new_x
z = new_z
if x == 10000000000000 and z == 10000000000000:
print("ractf{#####################}")
break
问题就出在这个float函数上
float函数支持nan,inf这些
如果传入字符。float后与x相减。依旧是nan
然后math.sqrt(nan**2-diff_z**2)
依旧是nan
而字符串又始终比数字大。