Author:颖奇L’Amore

Blog:www.gem-love.com

是周末的比赛,这个周末同时进行了b01lers/confidence/angstorm/susec这四场比赛,这个比赛没怎么看,就做了一道solves最多的web题目,但是质量还挺高的

等其他题目wp出来后,复现一下,如果有比较好的题目再更新上来


web 0

题目链接:http://66.172.11.208:1337/

代码分析

打开题目,得到Node.js源码:

 1function sha1(s) {
 2	return crypto.createHash("sha1")
 3		.update(s)
 4		.digest("hex");
 5}
 6
 7app.post("/flag", (req, res) => {
 8	const {first, second} = req.body;
 9	const salt = "pepper";
10
11	if (!first || !second || first.length !== second.length) {
12		res.send("bad input");
13		return;
14	}
15
16	if (first !== second && sha1(salt + first) === sha1(salt + second)) {
17		res.send(flag); // have some flag
18		return;
19	}
20
21	res.send("access denied");
22});

可以看到,首先利用crypto模块自定义了一个sha1()函数,之后对post接收到的first和second进行加盐哈希,需要满足三个条件:

  • first和second都不能为空
  • first和second不相等
  • 它们的加盐后sha1值相同

一个很典型的矛盾条件,而且可以看到sha1判断是强相等,不存在弱类型比较bypass的情况。

crypto模块机制分析

写了一个测试代码:

var crypto = require('crypto');
var sha1 = crypto.createHash('sha1');
sha1.update('y1');
sha1.update('ng');
var a = sha1.digest('hex');
console.log(a);

var sha2 = crypto.createHash('sha1');
sha2.update('y1ng');
var b = sha2.digest('hex');
console.log(b);

得到的sha1哈希值是相同的:

说明,对于crypto模块进行的sha1加密,如果有update()方法则首先对字符串进行相加,最后对相加得到的字符串进行哈希加密,总之加密处理只对最终的字符串进行一次加密

NodeJS弱类型

js中也存在弱类型:

但是对于强相等判断,就会返回false:

这一点,和PHP基本相同

NodeJS加运算机制分析

在Node.js(JavaScript)中,两个字符串相加得到新的字符串(字符串拼接),这没得说,但是,如果字符串与非字符串相加会得到什么?

字符串和对象相加,虽然不能直接把对象的属性加出来:

但是得到的结果仍然是字符串:

字符串、数组、数字相加结果是字符串:

并且可以看到,字符串与数组相加,是字符串与数组中的元素相加后返回字符串,"y1ng"+123"y1ng"+[123]加运算得到相同的字符串

NodeJS中length机制分析

首先,对于数字没有length属性,字符串和数组有:

字符串的length就是字符串长度,数组的length表示数组元素个数,这一点和其他语言都基本一样:

得到flag

再次回看代码

第一层判断,first和second的长度相等且都为空:

11	if (!first || !second || first.length !== second.length) {
12		res.send("bad input");
13		return;
14	}

假设first和second分别传入字符串”0″和数组[0],首先肯定不为空,然后根据上文length机制探究可知他们的length都是1,也满足长度相等,条件通过。

第二层判断,first和second判断强相等、sha1()进行加盐加密:

16	if (first !== second && sha1(salt + first) === sha1(salt + second)) {
17		res.send(flag); // have some flag
18		return;
19	}

对于字符串”0″和数组[0],他们满足强不等,第一个条件通过

然后进行哈希加密时,由于加盐,导致salt+first和salt+second双双返回字符串,并且根据上面分析可以知道,他们的结果应该是相同的:pepper0,所以哈希值应该也相同,第二个条件通过

最后根据代码,用JSON把first和second传上去,即可得到flag

flag:SUSEC{YOUR3_4B0UT_TO_H4CK_TIM3_RU_SURE}

颖奇L'Amore原创文章,转载请注明作者和文章链接

本文链接地址:https://www.gem-love.com/websecurity/2037.html

注:本站定期更新图片链接,转载后务必将图片本地化,否则图片会无法显示


颖奇L'Amore

Most of the time is also called Y1ng. Cisco Certified Internetwork Expert - Routing and Switching. CTF player for team r3kapig. Forcus on Web Security. Islamic Scholar. Be good at sleeping and fishing in troubled waters.

0 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

在此处输入验证码 : *

Reload Image