浏览器 同源策略

    1. 3个关键点 scheme, host, port in URL. IE 浏览器有一点点特殊: https://en.wikipedia.org/wiki/Same-origin_policy
    2. Same Origin Policy 只是禁止读取返回的信息, 并不禁止发送请求, 所以其实请求已发出,浏览器以及收到,只是发现不符合这个策略而终止. prelight 可以通过2步, 来避免发出真正的请求. 也就是有的文档提到的 禁止读, 不禁止写.
    3. 正因为不禁止发出请求, 所以同源策略不能阻止 CSRF 和 clickjacking;
    4. 尽管有同源策略,不同的网站还是可以通过link 相互关联, 跨站使用img, CSS, Javascript, 常见适用同源策略的是AJAX 请求,iframe 等;
    5. 尽管通过同源策略限制了 AJAX, 但是有些时候要需要跨站资源共享, 所以就有了 CSRS (Cross Site Resource Sharing)相关的http header;
    6. 同源策略的内容
    7. IE 浏览器的特殊之处: a: trust zone 里面的可以任意跨域, b: 端口号 不用来区分跨域. 这些都是非标准
    8. 可以通过 document.domain="company.com" 来让多个子domain之间或子domain 与父domain 之间实现跨域(同时端口号被设置为null);
    9. 如何绕过同源策略 详细文档
    1. CSRS
    2. JSONP
    3. window.postMessage Cross-document messaging
    4. 同一个主域下如果协议和端口一样, 可以通过设置 window.domain 来处理(只能从长到短)
    5. WebSocket
    6. window.name 传递

      1. 如何避免跨站写?
    7. CSRF token

      1. 如何防止跨站读?
    8. 使你的资源不可被嵌入(img, CSS, JavaScript): 更改资源 Content-Type, 使用动态CSRF token;

      1. 跨站的请求不能定制 HTTP header, 不跨站的则可以.

    HTML 编码

    URL 编码

    URL使用%编码,即 %后边跟该字符对应的 UTF-8 编码后的16进制值, 每2个前面加一个%, 不是codepoint.
    如 encodeURI("新华网.中国") = %E6%96%B0%E5%8D%8E%E7%BD%91.%E4%B8%AD%E5%9B%BD
    如 %65bay.com = ebay.com

    JavaScript 使用 escape(), encodeURI(),encodeURIComponent(). escape() 方法已经被废弃

    1. 协议或schema 是固定的那么些协议
    2. 主机名 只能是白名单(字符数字和-)里面的
    3. path 浏览器一般使用UTF-8 去解码
    4. query 参数 一般使用html的Content-Type去解码
    5. anchor 一般使用UTF-8 ? 还是用 Content-Type 去解码?

    HTML 内容编码

    HTML 文档里可以出现2种编码

    1. <, >, &, ', ", 空格, 这些HTML 标签使用的的编码, 可以使用 %gt; %lt; %nsbsp; 来编码;
    2. 另外可以用Unicode的进制编码 %#xH; (16进制), %#DD (10进制)编码

    JavaScript: 这个问答有2个非常好的答案 HTML-encoding in JavaScript/jQuery
    Java 版本:

    import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
    String escaped = escapeHtml4(source);
    

    JavaScript 内容编码

    1. 某些控制字符 \t, \r \n \b \v \f
    2. 8进制3位数字 \145 : e \060 :10进制0
    3. 16进制2位数 \x65 \x30
    4. Unicode 4位数 \u0065 \u7530 u0061lert(1) 这种能用在字符串之外的位置, 其它则不可

    CSS 编码

    1. CSS 属性中可以使用十进制, 十六进制表示
    2. CSS 兼容HTML中的进制表示法.

    IPv4 在浏览器的表示

    IP 地址有V4 和 V6 2个版本.
    IPv4的最常用表示形式是: 202.108.8.82
    其实它是4个字节的数字, 人们为了好记, 中间加了3个点分隔.
    它背后的二进制格式是: 11001010 01101100 00001000 01010010 [javascript 用 (202).toString(2) 快速转换,自己补足8位].

    转换为一个10进制是: 3396077650 [这么算的: 202*256*256*256+108*256*256+8*256+82].
    转换为一个16进制是:0xca6c0852 [(3396077650).toString(16)]

    中间加点的格式:
    8进制:0312.0154.0010.0122
    10进制:202.108.8.82
    16进制:0xca.0x6c.0x8.0x52

    尝试把上面这5种形式输入浏览器的的地址栏吧.

    telnet http 实例

    telnet 例子:

    xiatian@kali:~$ telnet blog.tianxiaohui.com 443
    Trying 112.64.53.9...
    Connected to blog.tianxiaohui.com.
    Escape character is '^]'.
    GET / HTTP/1.1
    Host: blog.tianxiaohui.com
    
    HTTP/1.1 302 Moved Temporarily
    Server: nginx/1.0.14
    Date: Mon, 28 Mar 2016 12:41:55 GMT
    Content-Type: text/html
    Content-Length: 161
    Connection: close
    Location: https://blog.tianxiaohui.com/?
    
    <html>
    <head><title>302 Found</title></head>
    <body bgcolor="white">
    <center><h1>302 Found</h1></center>
    <hr><center>nginx/1.0.14</center>
    </body>
    </html>
    Connection closed by foreign host.
    

    下面是telnet 百度 主页的:

    xiatian@kali:~$ telnet www.baidu.com 80
    Trying 61.135.169.125...
    Connected to www.a.shifen.com.
    Escape character is '^]'.
    GET / HTTP/1.1
    Host: www.baidu.com
    
    HTTP/1.1 200 OK
    Date: Mon, 28 Mar 2016 12:43:50 GMT
    Content-Type: text/html
    Content-Length: 14613
    Last-Modified: Wed, 03 Sep 2014 02:48:32 GMT
    Connection: Keep-Alive
    Vary: Accept-Encoding
    Set-Cookie: BAIDUID=8DE87DAF466F323D5338FC4C788C25FD:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BIDUPSID=8DE87DAF466F323D5338FC4C788C25FD; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: PSTM=1459169030; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
    Set-Cookie: BDSVRTM=0; path=/
    P3P: CP=" OTI DSP COR IVA OUR IND COM "
    Server: BWS/1.1
    X-UA-Compatible: IE=Edge,chrome=1
    Pragma: no-cache
    Cache-control: no-cache
    BDPAGETYPE: 1
    BDQID: 0x91477ff30001c2ff
    BDUSERID: 0
    Accept-Ranges: bytes
    
    <!DOCTYPE html><!--STATUS OK-->
    <html>
    <head>
    

    php fastcgi fix path 引起的 /favicon.ico/a.php

    今天看这个帖子的时候, 有个人提到 /favicon.ico/a.php 怎么利用?
    http://www.wooyun.org/bugs/wooyun-2016-0185114

    利用的前提是你能正常上传图片文件, 图片文件的内容是php, 然后你请求/favicon.ico/a.php 的时候, fastcgi 因为找不到a.php, 就去向前找 favicon.ico 作为php 文件去执行了.

    官方bug 在这里:
    https://bugs.php.net/bug.php?id=50852

    <白帽子讲web安全> 在第8章 8.2.3 讲到这个问题细节.

    解决是把php.ini 里面的 cgi.fix_pathinfo=1 的值, 改成 0