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

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

第六章 漏洞挖掘

  • CSRF漏洞挖掘需要确认以下信息:

    1. 目标表单是否有有效的token随机串
    2. 目标表单是否有验证码
    3. 目标是否判断了Referer来源
    4. 根目录下 crossdoman.xml的 allow-access-from domain 是否是通配符
    5. 目标JSON是否可以自定义callback等
  • 界面劫持漏洞挖掘需要确认以下信息:

    1. 目标HTTP响应头是否设置了X-Frame-Options字段
    2. 目标是否有javascript的Frame Busting机制
    3. 用iframe嵌入目标网站试试,若成功,则说明存在漏洞
  • 针对URL,可以利用的输入点是 id=1 ,输出点主要有:

    • HTML标签之间,如:[输出]
    • HTML标签之内,如:
    • 成为javascript代码的值,如:
    • 成为css代码的值,如:
  • HTML形式的编码

    • 进制编码:&#xH(十六进制格式)、&#D(十进制),最后的分号可以不要
    • HTML实体编码,如空格为
  • 在js执行之前,HTML形式的编码会自动解码。具体参见书本 P138

  • 具备 HtmlEncode 功能的标签


  



  
  

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

注意以下返回区别:

var textarea = document.createElement('textarea');
textarea.innerHTML='
innerText
'; console.log(textarea.innerHTML) //
innerText
(chrome, safari) // "
innerText
" (firefox)
var textarea = document.createElement('textarea');
textarea.innerText='
innerText
'; console.log(textarea.innerHTML) //
innerText
(chrome, safari) // '' (firefox)
var textarea = document.createElement('textarea');
textarea.innerHTML='
innerText
'; console.log(textarea.innerText) //
innerText
(chrome) //
innerText
(safari) // undefined (firefox 没有innerText接口)
  • 不同浏览器对urlencode处理的方式不同

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

  • 通过window.__defineSetter__ 可以劫持属性, 类似于 Object.defineProperty
window.__defineSetter__('a', function(){console.log(22);});
window.a=11;
// 22
// 11

字符集缺陷导致XSS攻击

  • 一个字符可能对应1~n个字节,一个字节为8位,每一位还是 0 或 1
  • 一个字符对应1~n个字节是由字符集和编码决定的
  • ASCII字符集是一个字符对应一个字节,不过每个字节只用了7位,最高位用于其他目的,即ASCII字符集共有2的7次方(128)个字符
  • Unicode字符集编码方式有 UTF-8UTF-16UTF-32UTF-7,最为常见的是UTF-8UTF-7
  • 宽字节码带来的安全问题(GB2312、GBK、GB18030、BIG5、Shift_JIS等)



    



绕过浏览器 XSS Filter

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

混淆代码

  • 经常在HTML中使用十进制和十六进制
  • 十进制在html中表示,如 8&#作为前缀,中间是十进制数字,以;作为后缀结束,其中后缀;可以没有
  • 十六进制表示如:Z,与十进制相比,&#后面紧跟x,中间是十六进制表示的数字,同样后缀可省略
  • CSS属性中,也只能是有个十进制和十六进制,另外十六进制可以表示为\6c
  • JS中,八进制表示为\56,十六进制表示为\x5c,多字节字符不能这样表示,需要用Unicode编码,如\u4ee3\u7801

浏览器三套 编/解码 方法

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

第二组:encodeURIdecodeURI

第三组:encodeURIComponentdecodeURICompon

  • 共同不编码的字符有66个
    0~9a~zA~Z*-_.

  • escape不编码的字符有69个,另外3个字符是:
    +/@

  • encodeURI不编码的字符有82个,另外16个字符是:
    +/@!#$&'():;=?~

  • encodeURIComponent不编码的字符有71个,另外5个字符是:
    !'()~

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

HTML中注入技巧

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

标签,HTML语言是松散的,且标签有优先级,可以通过混淆代码绕过,比如大小写不区分
  • HTML语法中有标签优先级概念,