XSS的利用方式
浏览器的工作原理
访问一个链接(或者刷新一个页面),首先url解码,然后是html解码,
然后是JS解码,然后是DOM渲染。
利用h5的autofocus自动获取焦点
然后用onfocus来执行获取焦点的事件
这里可以用?截断后面的引号,把引号当作参数。
上面这些可以自动弹窗。
click me 正常成功
click me HTML10进制成功
click me HTML 16进制成功
click me JS unicode失败
click me JS unicode成功
click me JS 16进制失败
click me JS 8 进制失败
浏览器中使用
1.xss中最经常用到的编码
html实体编码(10进制与16进制):
如把尖括号编码[ < ] -----> html十进制:
javascript的八进制跟十六进制:
如把尖括号编码[ < ] -----> js八进制:\74 js十六进制:\x3c
jsunicode编码:
如把尖括号编码[ < ] ----->jsunicode:\u003c
url编码:
如把尖括号编码[ < ] -----> url: %3C
base64编码:
base64: PA==
2 各个编码的具体利用场景
(1)base64编码
Data协议使用方法 data:资源类型;编码,内容
到目前为止 我遇到使用base64编码的情况 大多数是这样
在这种情况下 如果过滤了<> ' " javascript 的话 那么要xss可以这样写 然后利用base64编码!
将整条base64编码为PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==
下面三组都可行
111
a的利用方式
test
这样当test A链接点击时 就会以data协议 页面以html/text的方式解析 编码为base64然后单点击a链接时base64的编码就被还原成我们原本的
然后成功弹窗!
(2)html实体编码(10进制(ASCII编码)与16进制)
浏览器是不会在html标签里解析js中的那些编码的!onerror较特殊,onerror里的内容是当js解析的,因此可以用JSunicode编码,但是不能全部编码只能编码函数名。如果全部编码是会出错的,如这种可以弹窗。
十进制和十六进制编码的分号是可以去掉的。实体编码的数字前可以加上很多的0进行绕过WAF,如
如以下代码可成功执行
οnerrοr="alert('xss')">
=>[空格] : : =>[冒号] =>[换行
HTML5 新增的实体命名编码,如
: => [冒号] => [换行
如click
解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。
click
首先html编码被还原出来 然后就成了换行 跟冒号
为什么换行后还能够执行 是因为浏览器中的解析器中词法分析器 起的作用会跳过空白跟换行之类的无效字符。换行时必须用单双号围住,否则不会跳过。跳过回车和换行,不支持on事件.
然后就构造成了一个完整的语句
click 代码成功执行
(3)Javascript编码
Javascript伪协议在属性值中都可以使用, 如111点击111后触发弹窗。
javascript中只识别几种编码:Jsunicode js8进制 js10进制
第一种情况 你输入的值存入某个变量 然后最后出现在某个能把字符串当做js代码来执行的函数里!如:
eval() setTimeout() setInterval()
以上都是会将字符串当做js代码执行的函数!
第二种情况
var search = "可控点";
document.getElementById().innerHTML=search;
以上情况很多都是出现在你搜索后 然后显示的 你所查询的关键字
如果过滤了 <> ' " & % 等等这些!然后再输出到页面上!
按理说这样是安全了&#x