WEB安全学习之危险的HTTP参数

        

user_agent

user_agent用户代理简称UA,他是一个特殊的字符串头。网站服务器通过UA来确定用户信息、操作系统、CPU类型、浏览器版本。网站服务器通过UA来给客户端发送不同的界面。

网站依赖UA具备一定的反爬能力。

爬虫是通过代码来访问网站,而非人类自行点击网站访问,被称为“网络机器人”。User_agent就是反爬策略中的第一步。网站通过请求头中的UA信息来判断是否为爬虫访问,如果是首先对其ip进行预警检测,对其进行重点监控,如果在规定的时间内超过访问次数,将在一段时间内禁止其再次进行再次访问。

系统

浏览器

User-Agent字符串

Mac

Chrome

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36

Mac

Firefox

Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0

Mac

Safari

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15

Windows

Edge

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763

Windows

IE

Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko

Windows

Chrome

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36

iOS

Chrome

Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/31.0.1650.18 Mobile/11B554a Safari/8536.25

iOS

Safari

Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4

Android

Chrome

Mozilla/5.0 (Linux; Android 4.2.1; M040 Build/JOP40D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36

Android

Webkit

Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; M351 Build/KTU84P) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30

通过http测试网站发送GET请求来查看请求头信息,获得爬虫程序的UA

#导入模块

import urllib.request

#向网站发送get请求

response=urllib.request.urlopen('http://httpbin.org/get')

html = response.read().decode()

print(html)

运行结果: 

{

  "args": {},

  #请求头信息

  "headers": {

    "Accept-Encoding": "identity",

    "Host": "httpbin.org",

    "User-Agent": "Python-urllib/3.7", #UserAgent信息包含在请求头中!

    "X-Amzn-Trace-Id": "Root=1-6034954b-1cb061183308ae920668ec4c"

  },

  "origin": "121.17.25.194",

  "url": "http://httpbin.org/get"

}

运行结果显示UA为Python-urllib/3.7

下面使用urllib.request.Request()方法重构 User-Agent 信息,代码如下所示:

from urllib import request

# 定义变量:URL 与 headers

url = 'http://httpbin.org/get' #向测试网站发送请求

#重构请求头,伪装成 Mac火狐浏览器访问,可以使用上表中任意浏览器的UA信息

headers = {

'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0'}

# 1、创建请求对象,包装ua信息

req = request.Request(url=url,headers=headers)

# 2、发送请求,获取响应对象

res = request.urlopen(req)

# 3、提取响应内容

html = res.read().decode('utf-8')

print(html)
{

  "args": {},

  "headers": {

    "Accept-Encoding": "identity",

    "Host": "httpbin.org",

    #伪装成了Mac火狐浏览器

    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:65.0) Gecko/20100101 Firefox/65.0",

    "X-Amzn-Trace-Id": "Root=1-6034a52f-372ca79027da685c3712e5f6"

  },

  "origin": "121.17.25.194",

  "url": "http://httpbin.org/get"

}

X-Forwarded-For

对应表头的不恰当使用可能带来安全风险

计算机网络体系结构

http采用TCP/IP体系结构,真实采用四层协议(控制两个对等实体进行逻辑通信(通信不真实存在,假设通信方便单独研究体系结构)规则的集合)

网络接口层:进行沟通传输,没有限定接口,不同接口之间可以进行传输

Ip协议可以将不同的网络接口互联,并向上TCP和UDP提供网络互联服务

TCP在接受IP协议的网络互联后向应用层相应协议提供可靠传输服务
UDP在接受IP协议的网络互联后向应用层相应协议提供不可靠传输服务

协议是一种规则,两个对等实体进行逻辑通信的规则

在规则协议的控制下,两个对等实体之间的逻辑通信使本层向上层提供服务,实现本层的协议还需要下一层所提供的服务。

协议是水平的,服务是垂直的

服务原语:上层使用下层所提供的服务必须通过与下层交换一些命令,这些命令称为服务原语。

协议数据单元PDU:对等层次之间传送的数据包称为该层的协议数据单元。

服务数据单元SDU:同一系统内,层与层之间交换的数据包称为服务数据单元

多个SDU可以合成为一个PDU;一个SDU也可划分为几个PDU

X-Forwarded-For 是一个 HTTP 扩展头部,是取得和服务器建立TCP连接的IP地址。X-Forwarded-For请求头格式:X-Forwarded-For: client, proxy1, proxy2

当客户端直接连接到服务器时,其 IP 地址被发送给服务器(并且经常被记录在服务器的访问日志中)。但是如果客户端通过正向或反向代理服务器进行连接,服务器就只能看到最后一个代理服务器的 IP 地址,这个 IP 通常没什么用。如果最后一个代理服务器是与服务器安装在同一台主机上的负载均衡服务器,则更是如此。X-Forwarded-For 的出现,就是为了向服务器提供更有用的客户端 IP 地址。

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

安全性和隐私性考量

按照设计的目的,此标头暴露隐私敏感信息,比如客户端的 IP 地址。因此,在应用此标头时,需要将用户的隐私问题考虑在内。

当在客户端和服务器之间没有受信任的反向代理服务器时(比如一个负载均衡服务器),X-Forwarded-For 标头是不可信的。如果客户端和所有的代理服务器都没有恶意且行为良好,那么此标头中的 IP 地址列表具有指令部分所描述的意义。但是如果客户端或任意代理服务器存有恶意或配置错误,那么此标头的任意部分(或整体)可能是伪造的(并且有可能不是一个列表或者甚至不包含 IP 地址)。

如果客户端和服务器之间存在任意受信任的反向代理服务器,最终 X-Forwarded-For 中的 IP 地址列表是可信的,因为这些 IP 是由受信任的代理服务器添加的(只要服务器只能通过这些代理服务器进行访问而不是可以被直接访问)。

使用 X-Forwarded-For 进行安全相关的操作时(比如速率限制或基于 IP 的访问控制),必须仅使用由受信任的代理服务器添加的 IP 地址。使用不可信的 IP,可能导致速率限制被规避、访问控制被绕过、内存耗尽,或其他与安全性或可用性相关的负面后果。

反过来,只有当使用伪造的值不会导致负面影响时,最左边的(不可信的)值才能被使用。

对 X-Forwarded-For 标头的不当解析可能导致伪造的值被用于安全相关的目地,造成上文提及过的负面后果。

在一个请求中可能出现多个 X-Forwarded-For 标头。这些标头中的 IP 地址必须被当作一个列表进行处理,从第一个标头中的第一个 IP 地址开始,直到最后一个标头中的最后一个 IP 地址结束。有两种方法生成这个列表:

1.用逗号拼接所有 X-Forwarded-For 标头的值,然后用逗号将其分割成一个列表

2.用逗号将每一个 X-Forwarded-For 标头的值都分割成一个列表,然后将这些列表合并成一个列表

只使用多个 X-Forwarded-For 标头中的一个是不够的。

(一些反向代理服务器会自动将多个 X-Forwarded-For 标头合并成一个,但是最安全的做法是不要假设就是这种情况。)

当选择离客户端最近的 X-Forwarded-For IP 地址时(不可信并且不用于安全相关的目地),应该选择最左边的、第一个有效且不是私有/内部地址的 IP 地址。(要求”有效“是因为伪造的值可能根本就不是 IP 地址;要求“不是私有/内部地址”是因为客户端使用的代理服务器可能在它们的内部网络中,在这种情况下代理服务器可能添加了私有 IP 地址空间中的地址。)

Referer

可能暴漏用户的浏览历史,涉及到用户的隐私问题

Referer请求头包含了当前界面的来源页面地址,即表示当前页面是通过此来源页面的链接进入的。服务器端一般采用referer请求头识别访问来源,以此统计分析、日志记录以及缓存优化。

当请求页面采用的是非安全协议而来源页面采用安全协议是referer不会被发送

主要用于浏览器行为跟踪——跟踪分析用户行为

HTTP Cookie是服务器发送到用户浏览器并保存在本地的一小块数据。浏览器会存储 cookie 并在下次向同一服务器再发起请求时携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器——如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

服务器使用 Set-Cookie 响应头部向用户代理(一般是浏览器)发送 Cookie 信息。一个简单的 Cookie 可能像这样:

HTTPCopy to Clipboard

Set-Cookie: <cookie-name>=<cookie-value>

这指示服务器发送标头告知客户端存储一对 cookie:

HTTPCopy to Clipboard

HTTP/1.0 200 OKContent-type: text/html

Set-Cookie: yummy_cookie=chocoSet-Cookie: tasty_cookie=strawberry

现在,对该服务器发起的每一次新请求,浏览器都会将之前保存的 Cookie 信息通过 Cookie 请求头部再发送给服务器。

​
HTTPCopy to Clipboard

GET /sample_page.html HTTP/1.1

Host: www.example.org

Cookie: yummy_cookie=choco; tasty_cookie=strawberry

​

有两种方法可以确保 Cookie 被安全发送,并且不会被意外的参与者或脚本访问:Secure 属性和 HttpOnly 属性。

标记为 Secure 的 Cookie 只应通过被 HTTPS 协议加密过的请求发送给服务端。它永远不会使用不安全的 HTTP 发送(本地主机除外),这意味着中间人攻击者无法轻松访问它。不安全的站点(在 URL 中带有 http:)无法使用 Secure 属性设置 cookie。但是,Secure 不会阻止对 cookie 中敏感信息的访问。例如,有权访问客户端硬盘(或,如果未设置 HttpOnly 属性,则为 JavaScript)的人可以读取和修改它。JavaScript Document.cookie API 无法访问带有 HttpOnly 属性的 cookie;此类 Cookie 仅作用于服务器。例如,持久化服务器端会话的 Cookie 不需要对 JavaScript 可用,而应具有 HttpOnly 属性。此预防措施有助于缓解跨站点脚本(XSS) (en-US)攻击。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值