XSS基础
同源策略(sop)
同源的判断:主机,协议,端口一致 存在的意义:防止一个tab页从另一个tab页跨域执行脚本
XSS
基础攻击方法:
1.直接创建<script>code</script>并让浏览器执行
2.href,src等属性可能引起的XSS(JavaScript伪协议,data://)


其实就是利用伪协议控制如onmouseover,location.href,action等的输入流
传参javascript:payload到href等属性,实现如<a href=”javascript:alert(1)”>之类的效果
data:协议常用攻击的结构: data:[mime type];base64,payload 其中[mime type]在这里放个图算了,一般xss都是用text/html格式来触发恶意js代码的
好的,接下来来试验一下data:协议.
这里是放了一个data协议的超链接,base64解码后是<script>alert(1)</script>,点开后就会弹窗
注:这个data:协议在chorme里不能被window.location.href重定向,而且上面这图的这个链接在chrome直接点是点不动的,必须右键打开
3.onload事件
这个事件的作用:当整个页面加载完全后触发onload事件
<body>, <frame>, <frameset>, <iframe>, , <link>, <script>均支持这个事件
构造形如<body onload=alert(1)> 即可
它的内容可以是一个js函数,也可以是一个简单的alert(1)
4.img onerror连续技
利用img的src无效时,会直接使用onerror里的的事件,构造payload。
<img src=”#” error=alert(1)>
其中有个技巧就是,onerror=location=“JavaScript:alert(1)”
这样,加个=location就可以使用伪协议了
利用方法


自己制作一个a.php
然后这是被攻击页,重定向到a.php并附带参数
就可以收集不同人的cookie并记录起来
另外提一句,可以利用类似方法,使用navigator.userAgent属性来获得useragent内容。
2.改变网页内容
就是存储型xss。
绕过方法
总的来说防御xss的方式只是三种:httponly、过滤字符、转义字符。 httponly是一种属性,用来设置cookie,当其为true时,js无法获取cookie (具体实现方法待补)
1.>标签被过滤或禁用的情况
可用//代替,这个能用的场景不适合<script>..</script>型payload,因为前面的script标签的>写成//的话,脚本不会被执行。使用情景应为<src=”” error=> 或<body onclick=>
2.xss探针
利用该payload在源码里检测过滤,可检测出网站对xss有没有基础防护 ”;!–“<XSS>=&{()}
3.htmlspecialchars函数与csp
htmlspecialchars函数,转义敏感字符:
但是,光靠一个htmlspecailchars函数,无法很有效进行防御。于是csp(内容安全策略)诞生了。
csp是和sop同一级别的安全策略。
csp功能:CSP只允许被认可的JS块、JS文件、CSS等被解析,只允许向指定的域发起请求。 csp大致格式:
header("Content-Security-Policy: default-src 'self'; script-src 'self' https://lorexxar.cn;");

这是各个属性:

这是各个属性的设置值:
4.利用<svg>标签(作用:编码绕过)

编码绕过:
在你的payload前植入<svg>标签并将敏感字符编码(字符实体),就可以绕过过滤模块,然后在执行时,svg标签会把字符实体转换成字符并执行
如这样,原函数过滤会把(给删除,但是你加了<svg>标签就会绕过过滤,并在执行时把字符实体还原成(
5.关于href属性的一个绕过小技巧
href属性里,//后面的内容会被忽略
6.关于注释绕过
html注释有两种形式,可以试试不同形式是否能绕过<!– –!>, js注释是/** /,出了<script>标签就没用了
7.type属性覆盖
input的type属性只遵循最前面一个的type属性,所以在一些情况下可以把type属性的值给覆盖为新的一个值
8.换行绕过
在html解析的时候,即使代码之间有换行也依旧会照常执行。所以在一些情况下可以构造换行来规避掉如正则表达过滤等手段
9.action属性覆盖(利用较苛刻)


这是在prompt(1)to win平台中看到的一个绕过方法,收藏一下吧
在一个from-input结构中,当你用document.forms[num].action去读取某个form的的action值时,若input标签里出现了name=’action’,读取出的acton属性就会从form上的action值变成 [object HTMLInputElement]. 以此来为action放入JavaScript伪协议创造机会,规避过滤
这是覆盖后的情况
这是覆盖前