请选择 进入手机版 | 继续访问电脑版
查看: 1411|回复: 1

Javascript CTF挑战赛全攻略

[复制链接]
  • TA的每日心情
    擦汗
    2017-4-1 15:01
  • 签到天数: 138 天

    [LV.7]常住居民III

    发表于 2016-6-7 16:18:39 来自手机 | 显示全部楼层 |阅读模式
    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

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

    使用道具 举报

  • TA的每日心情
    无聊
    2017-9-11 15:40
  • 签到天数: 425 天

    [LV.9]以坛为家II

    发表于 2016-6-7 21:26:04 | 显示全部楼层
    最后一题没复现出来
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表