常见 Web 的攻击技术
互联网上的攻击大都将 Web 站点作为目标。常见的攻击手段有哪些,以及攻击会造成怎样的影响。
简单的 HTTP 协议本身并不存在安全性问题,因此协议本身几乎不会成为攻击的对象。应用 HTTP 协议的服务器和客户端,以及运行在服务器上的 Web 应用等资源才是攻击目标。
针对 Web 应用的攻击模式有2种:
主动攻击:主动攻击(active attack)是指攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式。由于该模式是直接针对服务器上的资源进行攻击,因此攻击者需要能够访问到那些资源。主动攻击模式里具有代表性的攻击是 SQL 注入攻击和 OS 命令注入攻击。
被动攻击:被动攻击(passive attack)是指利用圈套策略执行攻击代码的攻击模式。在被动攻击过程中,攻击者不直接对目标 Web 应用访问发起攻击。被动攻击模式中具有代表性的攻击是跨站脚本攻击(xss)和跨站点请求伪造(csrf)。
被动攻击通常的攻击模式如下所示。
- 攻击者诱使用户触发已设置好的陷阱,而陷阱会启动发送已嵌入攻击代码的 HTTP 请求。
- 当用户不知不觉中招之后,用户的浏览器或邮件客户端就会触发这个陷阱。
- 中招后的用户浏览器会把含有攻击代码的 HTTP 请求发送给作为攻击目标的 Web 应用,运行攻击代码。
- 执行完攻击代码,存在安全漏洞的 Web 应用会成为攻击者的跳板,可能导致用户所持的 Cookie 等个人信息被窃取,登录状态中的用户权限遭恶意滥用等后果。
实施 Web 应用的安全对策可大致分为以下两部分。
- 客户端的验证Web 应用端(服务器端)的验证
- 输入值验证
- 输出值转义
多数情况下采用 JavaScript 在客户端验证数据。可是在客户端允许篡改数据或关闭 JavaScript,不适合将 JavaScript 验证作为安全的防范对策。保留客户端验证只是为了尽早地辨识输入错误,起到提高 UI 体验的作用。Web 应用端的输入值验证按 Web 应用内的处理则有可能被误认为是具有攻击性意义的代码。输入值验证通常是指检查是否是符合系统业务逻辑的数值或检查字符编码等预防对策。
站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 JavaScript 进行的一种攻击。动态创建的 HTML 部分有可能隐藏着安全漏洞。就这样,攻击者编写脚本设下陷阱,用户在自己的浏览器上运行时,一不小心就会受到被动攻击。
跨站脚本攻击有可能造成以下影响:
- 利用虚假输入表单骗取用户个人信息。
- 利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。
- 显示伪造的文章或图片。
HTTP 头信息
请求字段(Request)
字段名 | 说明 | 示例 |
---|---|---|
Accept | 指定客户端能够接收的内容类型 | Accept: text/html |
Accept-Charset | 客户端可以接受的字符编码集 | Accept-Charset: utf-8 |
Accept-Encoding | 能够接受的内容编码方式 | Accept-Encoding:gzip, deflate |
Accept-Language | 可以接受的自然语言列表 | Accept-Language:zh-CN,zh;q=0.9,en;q=0.8 |
Accept-Datetime | 指定接受的版本时间 | Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT |
Authorization | 用于身份认证的凭证信息 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Cache-Control | 指定请求缓存机制 | Cache-Control: no-cache |
Connection | 连接类型(默认持久连接) | Connection: keep-alive |
Cookie | 向服务器发送的Cookie信息 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求信息长度 | Content-Length: 348 |
Content-Type | 当前请求MIME类型 | Content-Type:application/json; charset=utf-8 |
Date | 发送时间 | Date:Thu, 23 Nov 2017 14:41:17 GMT |
Expect | 指明需要的特定服务器行为 | Expect: 100-continue |
From | 发起请求的用户邮箱 | From: admin@321dh.com |
Host | 指明请求服务器的域名和端口号 | Host:www.321dh.com:80 |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Modified-Since | 设置更新时间 | If-Modified-Since: Sat,29 Oct 1994 19:43:31 GMT |
If-None-Match | 设置客户端ETag值 | If-None-Match: "737060cd8c284d8af7ad3082f209582d" |
If-Range | 适用于断点续传下载 | If-Range: "737060cd8c284d8af7ad3082f209582d" |
If-Unmodified-Since | 请求体在给定时间未修改才响应 | If-Unmodified-Since: Sat,29 Oct 1994 19:43:31 GMT |
Max-Forwards | 限制代理或网关转发消息的次数 | Max-Forwards: 10 |
Origin | 跨域资源请求的地址 | Origin: http://www.321dh.com |
Pragma | 设置特殊实现的指令 | Pragma: no-cache |
Proxy-Authorization | 向连接代理认证的凭证信息 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 指定请求返回的字节数范围 | Range: bytes=500-999 |
Referer | 表明当前请求从哪个页面过来的 | Referer: http://www.321dh.com |
TE | 指明期望使用的传输编码 | TE: trailers, deflate |
User-Agent | 请求用户的身份信息 | Mozilla/5.0 (Mac OS X 10_13_1) Chrome/62.0.3202.94 Safari/537.36 |
Upgrade | 请求服务端升级协议 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Via | 表明请求代理的来源地址 | Via: 1.0 fred, 1.1 example.com(Apache/1.1) |
Warning | 消息实体中可能存在错误的警告 | Warning: 199 Miscellaneous warning |
常见的非标准请求字段
字段名 | 说明 | 示例 |
---|---|---|
X-Requested-With | 指明Ajax及可扩展标记语言请求 | X-Requested-With: XMLHttpRequest |
DNT | 设置是否停止跟踪用户 | DNT: 1 |
X-Forwarded-For | 表明客户端最终连接服务器的地址 | X-Forwarded-For: client1, proxy1, proxy2 |
X-Forwarded-Host | 表明客户端要请求的原始主机 | X-Forwarded-Host: www.321dh.com:80 |
X-Csrf-Token | 防止跨站请求伪造 | X-Csrf-Token: i8XNjC4b8KVok4uw5RftR38Wgp2BFwql |
响应字段(Response)
字段名 | 说明 | 示例 |
---|---|---|
Access-Control-Allow-Origin | 指定参与跨域的网站 | Access-Control-Allow-Origin: * |
Access-Control-Allow-Methods | 允许的请求方法 | Access-Control-Allow-Methods: GET, PUT, POST, DELETE |
Accept-Patch | 支持的文件类型 | Accept-Patch: text/example;charset=utf-8 |
Accept-Ranges | 支持的部分内容范围类型 | Accept-Ranges: bytes |
Age | 当前对象缓存时长 | Age: 244 |
Allow | 对于特定资源有效的动作 | Allow: GET, HEAD |
Cache-Control | 指定缓存机制 | Cache-Control: max-age=3600 |
Connection | 连接类型(默认持久连接) | Connection: keep-alive |
Content-Disposition | 告知下载文件的名称 | Content-Disposition: attachment; filename="name.ext" |
Content-Encoding | 数据编码方式 | Content-Encoding: gzip |
Content-Language | 响应内容使用的语言 | Content-Language: da |
Content-Length | 信息长度 | Content-Length: 348 |
Content-Location | 响应数据的地址选项 | Content-Location: /index.htm |
Content-Type | 当前内容的MIME类型 | Content-Type:application/json |
Date | 响应时间 | Date:Fri, 24 Nov 2017 02:59:05 GMT |
Expires | 过期时间 | Expires:Mon, 27 Nov 2017 15:20:50 GMT |
Last-Modified | 最后修改时间 | Last-Modified:Mon, 13 Nov 2017 20:19:12 GMT |
Location | 重定向地址 | Location: http://www.321dh.com/index.html |
Pragma | 特殊实现的指令 | Pragma: no-cache |
Public-Key-Pins | 用于缓解中间人攻击 | Public-Key-Pins: max-age=250; pin-sha256="ozYqqbQ2yXLVKB9=" |
Refresh | 设置重定向跳转 | Refresh: 5; url=http://www.321dh.com |
Server | 服务器信息 | Server: nginx/1.13.3 |
Set-Cookie | 发送给客户端的数据 | Set-Cookie: UserID=JohnDoe; Max-Age=3600; |
Status | 状态 | Status: 304 |
Transfer-Encoding | 数据传输的编码方式 | Transfer-Encoding: chunked |
Upgrade | 要求客户端升级协议 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Vary | 匹配请求协议方式 | Vary: Accept-Encoding |
Via | 告知客户端当前响应发送的途径 | Via: 1.0 fred, 1.1 321dh.com |
WWW-Authenticate | 指定请求使用的认证方式 | WWW-Authenticate: Basic |
常见的非标准响应字段
字段名 | 说明 | 示例 |
---|---|---|
X-XSS-Protection | XSS跨站脚本攻击过滤器 | X-XSS-Protection: 1; mode=block |
X-Content-Type-Options | 防止客户端嗅探文件MIME类型 | X-Content-Type-Options: nosniff |
X-Powered-By | 显示响应脚本语言 | X-Powered-By: PHP/5.4.0 |
X-UA-Compatible | 推荐指定的渲染引擎来显示内容 | X-UA-Compatible: IE=edge |