表情帝 发表于 2016-6-7 16:18:39

Javascript CTF挑战赛全攻略

Javascript CTF比赛的形式其实跟其他的CTF大同小异,利用客户端身份验证过程的漏洞找到Flag,同时这也展示了客户端验证是多么的不可靠。

参赛地址

https://www.net-force.nl/challenges/

Javascript挑战1,等级101:“javascript,secure?”

在这个挑战,弹出了一个需要用户名和密码的JavaScript警告框。

   

不能直接右键查看源文件,在chrome中,可以使用view-source查看页面源文件。如:


view-source:https://www.net-force.nl/challenge/level101/secret.html

很容易就看到了用户名和密码。

   

密码就是javascript。

Javascript挑战2,等级l02:“this won’t take long…”

查看页面源文件,发现有生成密码的函数submitentry()。这个函数运行完毕之后就会得到密码,确实是“不会等太久”。

   

我们可以通过在线执行js代码(http://js.do)得到密码,我们稍微修改下代码,让密码“alert”出来。

   

密码:bingo123

Javascript挑战3,等级104:“Escape now!!!”

这种挑战给我们展示了一个需要用户名和密码登录框,而安全性是由一个JavaScript函数的形式实现……

   

查看源文件发现有一个unescape()函数对某些内容进行了解码。稍微修改下代码,将解码后的值赋值给m,然后用alert显示m的值。

   

所以我们很容易看到了正确的值。


Username:user

Password:member

Javascript挑战4,等级103:“Is this safe?”

跟其他的题目一样,也需要用户名密码,查看源文件发现有一处注释的内容是一段哈希值。

   

我们使用“John the Ripper”跑下这段哈希,得到了明文“blaat”。

   

然而,这并不是这道题目的password,再看了下js代码发现用户会被重定向到一个与username有关的链接。

https://www.net-force.nl/challenge/level103/soulslayer/

于是我在这个链接后面加了“blaat.html”。

   

于是我们得到了密码:blaataap。

javascript挑战5,等级105:“Mirco$oft crap…”

页面很明确的要求需要ie的参与。

   

看了下页面源代码,需要解码一段编码后的字符串。我们依然使用js.do在线执行代码。解码后发现内容是用javascript.encode编码的。

   

Jscript.encode是微软用来编码js和vb脚本的。如果我们要读取源代码则需要进行解码。我们使用http://the-computer-site.com/jscript-decode.php进行在线解码。

   

仔细看完脚本后,我们能够确定它是用URL计算密码。我们稍微修改脚本,并使其显示存储在URL值中的密码。删除了for循环,因为这只是用来验证密码的代码。通过alert显示addr和pass2两个值。

   

现在我们得到了藏有正确密码的链接:

https://www.net-force.nl/challenge/level105/solution.php?blabla=Hall0

   

密码:hack0r

javascript挑战6,等级106:“HTML Guardian”

这个挑战告诉我们这个页面的源文件是由HTML Guarding保护。

   

我们的目标是绕过HTML Guardian的防护并读取实际的源文件。我们注意到右键单击在这个页面上禁用的,所以我们通过view-source查看源文件。

view-source:https://www.net-force.nl/challenge/level106/

正如所料,源文件也是加密过的,不过我们发现了eval()和unescape()用来解码一段脚本。

   

在线执行之后得到了这段被解密后的脚本。

   

对代码进行了缩进和排序后,我们注意到函数Koh()经过计算后返回M的值。

   

我们在函数返回M的值之前将其展现出来。

   

密码:0nd3rW4t3r

Javascript挑战7,等级107:“Having fun?!?”

这个挑战需要一组用户名和密码,并且页面被HTML protect保护。

   

我们的目标是定位藏在页面源文件某处的用户名和密码。当我们查看源文件发现被编码的代码,解码后的结果赋值给变量e。通过alert读取e的值。

   

然而这段明文脚本只是计算s的值。因此我们试图执行此脚本确定s的值。然而我们只跑了涉及到“e”的一部分代码,脚本报错显示”d”的值未确定。我们从页面源文件得到了d的值,并修改代码使得成功运行,得到了“明文”。

      

当我们在这个脚本向下滚动,我们注意到了“passwdok()”函数(密码OK)。此函数的名称表明它执行密码验证检查。这一功能的主要部分被编码,我们需要解码。因此,我们让js.do解码这个脚本。

            

现在我们了解了认证过程,该变量good_login和good_pass分别是正确的用户名和密码的SHA1。该脚本计算用户提供的用户名和密码的哈希值,并进行判断是否都一致,如果结果为真则alert(‘Well Done!’      )。现在我们接着用John the Ripper来解密哈希值。   

            

或者我们可以提交到在线平台去解密

http://www.hashkiller.co.uk/sha1-decrypter.aspx。

            

用户名密码:bas/dude

通过这些题目我们可以发现使用客户端验证非常不安全。在源代码中包含有关认证过程的信息要尽可能少,因为即使用了某些保护软件依旧能解密出页面的源文件。

wuyan 发表于 2016-6-7 21:26:04

最后一题没复现出来
页: [1]
查看完整版本: Javascript CTF挑战赛全攻略