HTTP协议
在TCP/IP协议栈中,应用层包含很多的协议,其中应用最为广泛的协议被称之为HTTP协议。在日常生活中使用HTTP协议十分广泛,比如在访问网站的时候,使用的协议就是HTTP协议。
HTTP协议
HTTP是一个基于请求与响应模式的、无状态的应用层协议。
- 请求响应
客户端要向web服务器发送一个请求以后,等待服务器回送http响应消息。 - 无状态
http协议整个过程当中的各种信息不会被服务器所记录下来。
常基于TCP的连接方式 ,即http是将数据打包成TCP数据包来进行传送的,绝大多数Web应用,都是构建在HTTP协议之上,即目前使用浏览器访问web网站都是以http协议为标准的。
HTTP协议中的URL
HTTP URL是一种特殊类型的URI,包含了用于查找某个资源的标识信息。
一般URL的格式如下:
http://host[“:”port][path]:
- http表示要通过HTTP协议来定位网 络资源;
- host表示主机域名或者IP地址;
- port指定端口号,为空 则使用缺省端口 80;
- path指定请求资源的URI
例如
http://news.sina.com.cn/c/z/xjpfyzsg2014/
就是一个具体的URL
http的请求消息格式
HTTP请求由三部分组成:请求行、消息报头、请求正文 。
- 请求行:指明要访问什么资源
- 消息报头:指明http协议中各个字段的含义。HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。
- 请求正文:指明请求消息所包含的具体内容。
Http请求行
请求行以一个方法符号开头,以空格分开,后面是请求的URI和 协议的版本,格式如下:
Method Request-URI HTTP-Version CRLF
- Method:表示请求方法;
- Request-URI:是一个统一资源标识 符;
- HTTP-Version:表示请求的HTTP协议版本;
- CRLF:表示回车和换行
例如我们进入百度的首页,F12打开浏览器调试。找到Network,点击并刷新网页,就能看到浏览器请求的内容。
GET / HTTP/1.1 // 请求行
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 //请求头
// 请求正文
......
HTTP协议的方法
- GET :请求获取Request-URI所标识的资源
- POST :在Request-URI所标识的资源后附 加新的数据
- HEAD:请求获取由Request-URI所标识的资源的响应消息报头
- PUT: 请求服务器存储一个资源,并用Request-URI作为其标识
- DELETE:请求服务器删除Request-URI所标识的资源
- TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT:保留将来使用
- OPTIONS:请求查询服务器的性能或查询与资源相关的选项等
HTTP协议的响应消息格式
包括:初始状态行、首部行,实体主体 。
HTTP/1.1 200 OK // 状态行
Bdpagetype: 2
Bdqid: 0xf63dd9120001138a
Cache-Control: private
Connection: keep-alive
Content-Encoding: gzip
Content-Type: text/html;charset=utf-8
Date: Wed, 18 Mar 2020 05:02:14 GMT
Expires: Wed, 18 Mar 2020 05:02:14 GMT
Server: BWS/1.1
Set-Cookie: BDSVRTM=172; path=/
Set-Cookie: BD_HOME=1; path=/
Set-Cookie: H_PS_PSSID=30968_1426_21087_30903_30998_30824_31086; path=/; domain=.baidu.com
Strict-Transport-Security: max-age=172800
Traceid: 1584507734025483316217743576778242331530
X-Ua-Compatible: IE=Edge,chrome=1
Transfer-Encoding: chunked // 以上都是首部行等
// 实体主体
............
HTTP协议的安全隐患
(1) 钓鱼攻击
攻击者通过某种方式伪造了某个网站的信息。例如攻击者会设计一个网站,网站的内容与被攻击目标完全一致,最后将其访问的方式在网络上散布,当客户端点击相应的连接,就有可能访问到仿冒的网站,这个网站对于客户来说十分熟悉,就有可能上当受骗。受骗的主要原因就是不知道仿冒的网站是真还是假,因为在http协议中没有严格的认证机制,通过此方式,攻击者就有可能获取用户的敏感信息。
(2) 跨站脚本攻击
- 脚本:一个小程序,能够被浏览器解析执行。
- 脚本攻击(script attack):攻击者将具有攻击性的脚本发送给 浏览器解释执行,从而获取用户数据或破坏系统 。
为了保护用户数据的安全,浏览器一般不允许脚本程序访问跨会话(session)数据。
HTTP协议一般使用TCP来传输数据,每当用户与web浏览器建立通信时都会建立一个连接,这个连接我们称作会话,不同的连接或会话之间的数据是受到浏览器保护的,脚本程序是不能够跨越会话或者浏览器去访问其他网页上的数据。
<SCRIPT>Alert(Document.Cookie)</SCRIPT>
以上是一个简单的脚本程序,其中使用了Alert函数来显示文档中的cookie信息,cookie即包含用户敏感信息的本地文件,比如说访问一个购物网站,web服务器会将用户的账户和密码等信息存放到本地,以便以下一次登录网站的时候不再输入账户和密码。
脚本攻击过程
攻击者向攻击目标发送一段脚本程序,攻击目标解析执行之后读取本地cookie并将此信息发送给攻击者。
脚本程序不能跨越会话或者浏览器去访问其他网页上的数据。
跨站脚本攻击过程
在这样的一个过程中,为了获取被攻击者的数据,攻击者是不能直接将脚本程序发送给被攻击目标的。
如何实现跨站呢?
首先攻击者将可能存在攻击性代码的脚本程序发送到服务器上,这些脚本就会被服务器存放在本地,被攻击目标访问服务器的时候,则可能访问到含有这些脚本程序的网页,这些网页就可能被被攻击者下载到本地并解析执行。在执行的过程中就有可能获取到相应的信息并发送给攻击者。
攻击者向web服务器上传脚本程序的页面,即可能生成含有脚本程序的途径有:
- 论坛
允许用户提交信息 - 评论
产品评论、售后评价等允许提交信息 - 即时通信
允许用户发送消息 - 社交网络应用
允许用户收发消息、讨论和评价
发生跨站脚本攻击的条件
- 一个允许用户输入信息的web应用 ,允许用户在其中提供相应的内容
- 用户输入数据可用于动态生成页面 ,这些信息能够被服务器存储,攻击者进行访问时,能够动态生成网页。
- 用户的输入未作合法性验证 攻击者所提供的非法程序没有被检测出来
跨站脚本攻击分类
-
持久性跨站(persistent XSS or stored XSS)
攻击数据存放于服务器。当用户访问正常网页时,动态生成网页,服务端会将恶意的指令 夹杂在正常网页中传回给用户。 -
非持久性跨站(non-persistent XSS or reflected XSS)
恶意脚本程序脚本主要是在受害者请求HTTP后得到一个即刻的响应时执行 如(服务端根据用户提交的恶意数据生成页面)。 -
文档对象模型跨站(DOM-based XSS)
如果客户端脚本(例如JavaScript)动态生成 HTML的时候,没有严格检查 和过滤参数,则可以导致 DOM (Document Object Model)跨站攻击。
用户通过浏览器访问网页时,返回给用户的是一个文档对象模型,在所有的HTML对象中,document是最主要的文档对象,它还 包括很多字对象(如location, URL ,referrer和body等)
document.location
document.URL
document.URLUnencoded
document.referrer
document.write()
document.writeln()
document.boby.innerHtml
文档对象包含很多的属性和方法,通过对这些方法进行调用或者对属性进行赋值,就能实现跨站脚本攻击,例:
http://www.abc.com/welcome.html
<HTML> <TITLE>Welcome!</TITLE> Hi <SCRIPT> var
pos=document.URL.indexOf("name=")+5;
document.write(document.URL.substring(pos,document.URL.length)); </SCRIPT>
<BR> Welcome to our system … </HTML>
当用户访问这个网页的时候,其要求用户输入姓名,这个网页会根据用户输入的姓名来动态显示相应的内容。正常情况下会在浏览器中显示Welcome to our system
但是我们嵌入这样一段代码:
http://www.abc.com/welcome.html?name= < script>alert(document.cookie)</ script>
在这样的情况下,攻击者就将用户名替换成了一段脚本代码,就实现了对用户的跨站脚本攻击。