CISP-PTE - Web 安全基础

2021-05-11
2021-05-11
5 min read
Hits

  本文是 CISP-PTE Web 安全基础课程的学习笔记。

HTTP 协议

HTTP 请求方法

HTTP 1.0 的请求方法

  1. GET:可以把数据放在 URL 中传递,也可以不包含任何数据,HTTP 请求只有请求头,没有请求数据
  2. POST
    1. 表单格式(application/x-www-form-urlencoded)把数据放在头文件下面的请求正文区
    2. 混合格式(multipart/form-data)有文件上传时常用的方法。可以接受同时提交不同类型的数据
    3. JSON 格式(application/json)
    4. XML 格式(text/xml)
    5. 文本(text/plain)
  3. HEAD:只返回头部数据,不返回数据部分的内容。返回的内容基本上与 GET、POST 的返回头一致

HTTP 1.1 新增的请求方法

  1. OPTIONS:默认情况下会返回允许的请求类型。一般需要跨域的时候需要设置
  2. PUT
  3. DELETE
  4. TRACE:让 web 服务器端将客户端的所有请求信息返回给客户端的方法,该方法多见于 debug 的需求
  5. CONNECT:在特定应用(proxy、SSL 等)走 HTTP 协议时会用到

HTTP 状态码

HTTP 状态码的分类

状态码已定义范围分类说明
1xx100 ~ 101信息提示一般不会出现
2xx200 ~ 206成功请求返回正常,可能根据请求状况稍微不同
3xx300 ~ 307重定向请求重定向到其它资源(有可能是本地)
4xx400 ~ 417客户端错误请求的页面错误(不存在、权限不够等)
5xx500 ~ 505服务端错误服务端问题(配置、代码等问题)

HTTP 状态码的含义

详细状态码含义请参阅维基百科 HTTP 状态码

用计算机语言获取 HTTP 状态码

curl -I -m 10 -o /dev/null -s -w "%{http_code}\n" <URL>     # curl
curl -I -m 10 -o /dev/null -s -w "%{http_code}\n" "http://baidu.com"     # curl 举例

import urllib2
urllib2.urlopen('<URL>').code     # Python
urllib2.urlopen('http://baidu.com').code     # Python 举例

HTTP 协议响应头信息

HTTP 响应头的类型

HTTP 响应头的含义

Access:服务器支持哪些请求方法(如 GET、POST 等)。 Content-Encoding:文档的编码(Encode)方法。 Content-Length:表示内容长度。 Content-Type:表示后面的文档属于什么 MIME 类型。 Date:当前的 GMT 时间。 Expires:应该在什么时候认为文档已经过期,从而不再缓存它 Last-Modified:文档的最后改动时间。 Location:表示客户应当到哪里去提取文档。 Refresh:表示浏览器应该在多少时间之后刷新文档(以秒计)。 Server:服务器名字。 Set-Cookie:设置和页面关联的 Cookie。 WWW-Authenticate:标识访问请求实体的身份验证方案。

HTTP 协议的 URL

URL 的定义

URL 是统一资源定位符,是互联网上标准资源的地址

URL 包含

  1. 协议
  2. 用户名:密码
  3. 主机 - 子域名.域名.顶级域名(或IP)
  4. 端口号
  5. 目录/文件名.文件后缀
  6. 参数=值
  7. 标志

URL 协议包含

  1. http(超文本传输协议资源)
  2. https(用安全套接字层传送的超文本传输协议)
  3. ftp(文件传输协议)
  4. mailto(电子邮件地址)
  5. ldap(轻型目录访问协议搜索)
  6. file(当地电脑或网上分享的文件)
  7. news(Usenet 新闻组)
  8. gopher(Gopher 协议)
  9. telnet(Telnet 协议)

URL 的格式

  协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

  只有大小写字母、数字、一些特殊符号$-_.+!*‘(),以及某些保留字,才可以不经过编码直接用于 URL

  编码格式为十六进制,每两个十六进制前加百分号。例如“你好”的 utf-8 码为:\xe4\xbd\xa0\xe5\xa5\xbd,URL – utf-8 格式编码为:%E4%BD%A0%E5%A5%BD

系统敏感文件

Windows

C:\boot.ini     # 查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml     # IIS 配置文件
C:\Windows\repair\sam      # 存储系统初次安装的密码
C:\Program Files\mysql\my.ini     # Mysql 配置
C:\Program Files\mysql\data\mysql\user.MYD     # Mysql root
C:\Windows\php.ini     # php 配置信息
C:\Windows\my.ini     # Mysql 配置信息

Linux

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts
/etc/passwd
/etc/shadow
/etc/my.cnf
/etc/httpd/conf/httpd.conf
/root/.bash_history
/root/.mysql_history
/proc/self/fd/fd[0-9]*(文件标识符)
/proc/mounts
/porc/config.gz

  在动态网页语言中,某个用户(浏览器)访问(登陆)后,可以一直记录状态,这种状态浏览器使用 Cookie 来保存。

  服务器通过在 HTTP 响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的 Cookie,然而纯粹的客户端脚本如 JavaScript 或者 VBScript 也可以生成 Cookie。

   浏览器检查所有存储的 Cookie,如果某个 Cookie 所声明的作用范围大于等于将要请求的资源所在的位置,则把该 Cookie 附在请求资源的 HTTP 请求头上发送给服务器。

  Cookie 的内容主要包括:名字、值、过期时间、路径和域。

  如果不设置过期时间,则表示这个 Cookie 的生命期为浏览器会话期间。

Session 机制

  Session 机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

  当程序需要为某个客户端的请求创建一个 Session 的时候,服务器首先检查这个客户端的请求里是否已包含了一个 Session 标识,称为 SESSIONID。

  如果已包含一个 SESSIONID 则说明以前已经为此客户端创建过 Session,服务器就按照 SESSIONID 把这个 Session 检索出来使用(如果检索不到,可能会新建一个)。

  如果客户端请求不包含 SESSIONID,则为此客户端创建一个 Session 并且生成一个与此 Session 相关联的 SESSIONID。

  SESSIONID 的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 SESSIONID 将被在本次响应中返回给客户端保存。

  保存这个 SESSIONID 的方式可以采用 Cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。

  由于 Cookie 可以被人为的禁止,必须有其他机制以便在 Cookie 被禁止时仍然能够把 SESSIONID 传递回服务器。经常被使用的一种技术叫做 URL 重写,就是把 SESSIONID 直接附加在 URL 路径的后面,附加方式也有两种,表现形式为

http://...../xxx;jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764
http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

HttpOnly

Set-Cookie: SESSIONID=abc123; expires=Wednesday, 17-Nov-99 23:12:40 GMT; HttpOnly     # 服务端发送 Cookie 的时候,可以设置 HTTP-Only

  这个参数的优点是不会被 js 获取,即使有 xss 漏洞,也获取不了 SESSIONID 相关的 Cookie 值。

Secure

设置 Cookie 的某个值 Secure 为 True,则此 Cookie 只有在 HTTPS 协议中才会进行传输,HTTP 协议传输时,不传输此 Cookie。