基础知识

0x01 HTTP协议

超文本传送协议(Hypertext Transport Protocol , HTTP)是分布式、协作式、超媒体系统应用之间的通信协议,是万维网(World Wide Web)交换信息的基础。HTTP是一个客户端终端(用户)和服务端(网站)请求和应答的标准(TCP)。通过使用Web浏览器、网络爬虫或者其他工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80),称这个客户端为用户代理程序。通常,有HTTP客户端发起一个请求,创建一个到服务器指定端口(默认端口为80端口)的TCP连接。HTTO服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,如“HTTP/1.1 200 OK”及返回的内容(请求的文件、错误信息、或者其他信息)。

HTTP方法

(1)OPTIONS:该办法可使服务器传回该资源所支持的所有HTTP请求方法。用‘*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
(2)HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)
(3)GET:向指定资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,如在Web Application中,其中一个原因就是GET可能会被网络蜘蛛等随意访问。
(4)POST:向指定资源提交数据,请求服务器进行处理(如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
(5)PUT:向指向资源位置上传其最新内容。
(6)DELETE:请求服务器删除Request-URI所标识的资源。
(7)TRACE:回显服务器收到的请求,主要用于测试或诊断。
(8)CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
以下是一个典型的HTTP GET 请求:

1
2
3
4
5
6
7
8
9
GET / HTTP/1.1
User-Agent: Mozilla/4.0(compatible; MSIE 8.0; Windows NT 6.0)
Host: www.bit.edu.cn
Accept: text/html
Accept-Language: zh-CN
Accept-Rncoding: gzip,deflate
Cache-Control: no-cache
Cookie: SessionId= ICONFPDBEPOBLFFGBKKNCGAL
Connection: Keep-Alive

其中,请求的第一行都是由3个以空格间隔的项目组成,分别是请求方法、请求路径、和HTTP版本。其他一些常见的消息头如下。
(1)Referer消息头用于表示发出请求的原始URL。
(2)User-Agent消息头提供与浏览器或其他请求的客户端软件有关的信息。
(3)Host消息头用于指定出现被访问的完整URL中的主机名称。
(4)Cookie消息头用于提交服务器向客户端发布的其他参数。

HTTP 状态码

HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位柱子代码。所有HTTP响应的第一行都是状态行,以次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一数字代表当前响应的类型。
(1)1xx消息————请求已被服务器接收,继续处理。
(2)2xx成功————请求已成功被服务器接收、理解、并接受。
(3)3xx重定向————需要后续操作才能完成这一请求。
(4)4xx请求错误————请求含有词法错误或者无法被执行。
(5)5xx服务器错误————服务器在处理某个正确请求时发生错误。

1
2
3
4
5
6
7
HTTP/1.1 200 OK 
Date: Mon,04 Mar 2013 07:53:16 GMT
Server: Apache/2.2.23 (Unix) mod_jk/1.2.14
Content-Length: 31300
Keep-Alive: timeout=5,max=99
Connection: Keep-Alive
Content-Type: text-html

每个HTTP响应的第一行由3个以空格间隔的项目组成,分别为HTTP版本、状态码和原因短语。其他一些常见的消息头如下:
(1)Server消息头包含一个旗标,指明所使用的Web服务器软件。有时还包括其他信息,如所安装的模块和服务器操作系统。其中包括的信息可能并不准确。
(2)Set-Cookie消息头向浏览器发送另一个Cookie,它将在最后向服务器发送的请求中由Cookie消息头返回。
(3)Progma消息头指示浏览器是否将响应保存在缓存中。
(4)Expires消息头指出响应内容过期日期。
(5)Content-Length消息头规定消息主题的字节长度。
(6)Content-Type消息头表示这个消息主题中包含一个HTML文档。

HTTP Cookie

HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。所以Cookie就是用来绕开HTTO的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含的信息,借此维护用户跟服务器会话中的状态。

HTTPS

超文本传输安全协议(Hypertext Transfer Protocol Secure, HTTPS)是超文本传输协议和SSL/TLS的组合,用以提供加密通信及对网络服务器身份的鉴定。HTTPS连接经常被用于万维网上的交易支付和企业信息系统的敏感信息的传输。
HTTPS可为浏览器和服务器间传输的数据提供机密性与完整性保护功能。有助于防止信息泄漏,并且可以保证用户处理的服务器的安全性。但是HTTPS并不能抵御直接针对某个应用程序服务器或客户端组件的攻击,而许多成功的攻击都属于这种类型。因此无论服务器是否使用HTTPS,大多数Web应用程序安全漏洞仍然存在。

0x02 B/S功能及会话

服务端功能

Web应用程序主要向用户提供动态生成的内容。当用户请求一个动态资源时,服务器会建立响应并在服务器端执行相应的脚本生成内容,然后将内容返回给用户。在形式上服务器类似于计算机程序,接受输入并处理输入,最后向用户返回输出结果。
HTTP请求通常使用以下3种方式向应用程序传递参数。
(1)通过URL里的查询字符串。
(2)通过在请求主题中使用POST方法。
(3)通过HTTP Cookie。

客户端功能

服务器端应用程序要接收用户输入与操作,并向用户返回其结果,它必须提供一个客户端界面。由于所有的Web应用都通过Web浏览器访问,因此这些界面共享一个技术核心。近些年来客户端技术不断发生变化,以下介绍一些常见的客户端技术。

HTML

超文本标记语言(Hyper Text Markup Language, HTML)是为“网页创建和其他可在网页浏览器中看到的信息”设计的一种标记语言。
超链接是HTML中常见的一个标签,事实上服务器与客户端之间大量的通信都由用户单击超链接驱动。
虽然超链接具有极大的方便性,但许多Web程序还需要采用更灵活的形式收集输入,HTML表单是一种常见的机制,它允许用户提交任意的输入。

CSS

层叠样式表(Cascading Style Sheets),又称串样式列表,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言,由W3C定义和维护。CSS目前最新版本为CSS3,是能够真正做到网页表现与内容分离的一种样式是设计语言。相对于传统HTML的表现而言,CSS能够对网页中的对象的位置排版进行像素级的精髓控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力,并能够进行初步交互涉及,是目前基于文本展示最优秀的表现设计语言。CSS能够根据不同使用者的理解能力,简化或者优化写法,针对各类人群,有较强的易读性。

JavaScript

JavaScript是一种由Netscape的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,例如,Perl遗留的速度问题,为客户提供更流畅的浏览效果。
JavaScript是一种相对简单但功能强大的编程语言,使用它可以方便地以各种仅使用HTML无法实现的方法对Web界面进行扩展。JavaScript常用于执行以下任务。
(1)确定用户输入,然后将其提交给服务器避免数据包含错误而提交不必要的请求。
(2)根据用户的输入动态修改用户界面,以减少客户端与服务器端通信次数。
(3)查询并更新浏览器内的文档对象模型(Document Object Model, DOM),控制浏览器行为。

浏览器扩展技术

除了JavaScript技术外,一些Web应用程序还使用浏览器扩展技术,使用定制代码从各个方面扩展浏览器的内置功能。这些扩展可通过适当的浏览器执行或需要在客户端安装可执行程序。以下列出常见的一些后客户端技术。
(1)Java applet
(2)ActiveX控件
(3)Flash对象
(4)Silverlight对象

状态与会话

HTTP协议本身是无状态的,客户端只需简单地想服务器请求,服务器响应请求返回响应消息。无论是客户端还是服务器都没有记录信息,每一次请求都是独立的。随着Web应用的发展,按需生成动态信息变得越来越重要。其中,Cookie就是为了解决HTTP无状态的而产生的,后来又出现Session,一种在客户端和服务器端保持状态的解决方案。
Session基址是一种服务器机制,服务器一般采用类似于散列表的存储结构保存信息。
与Cookie机制不同的是,Session采取的是在服务器端保持状态,而Cookie是在客户端保持状态。同时,服务器端需要在客户端保存一个标识。所以Session机制通常需要借助于Cookie来保存Session标识。

编码格式

URL 编码

统一资源定位符(Uniform/Universal Resource Locator)也被称为网页地址,如同在网络上的门牌,是因特网上标准的资源的地址(Address)。它最初由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为因特网标准RFC1738。
在因特网的历史上,统一资源定位符的发明是一个非常基础的步骤。统一资源定位符的语法是一般的、可扩展的,它使用ASCII代码的一部分来表示因特网的地址。统一资源定位符的开始,一般会标志着一个计算机网络所使用的网络协议。
统一资源定位符的标准格式如下。

1
协议类型://服务器地址(必要时要加上端口号)/路径/文件名

URL只允许使用US-ASCII字符集中的可打印字符(ASCII代码在0x20~0x7e范围内)。而且由于其在URL方案或HTTP协议内具有特殊含义,这个范围内的一些字符也不能在URL中使用。URL编码方案对扩展ASCII字符集中的任何有问题的字符进行编码,使其可以通过HTTP安全传输。任何URL编码的字符都是以%为前缀,其后是这个字符的两位十六进制ASCII代码。

Unicode 编码

Unicode是一种为支持全世界所使用的各种编码系统而设计的字符编码标准,它采用各种编码方案,其中一些可用于表示Web应用程序中不常见的字符。
16位Unicode编码的工作原理与URL编码类似。为通过HTTP进行传输,16位Unicode编码的字符以%u为前缀,其后是这个字符的十六进制Unicode码点。

HTML 编码

HTML编码是一种用于表示问题字符以将其安全并入HTML文档的方案。许多字符在HTML中具有特殊含义(如HTML元字符),并被用于定义文档结构而非其内容。为了安全使用这些字符,并将其用在文档的内容中,就必须对其进行HTML编码。
当攻击Web应用程序时,HTML编码主要在探查跨站脚本漏洞时发挥作用。

Base64 编码

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在XML中存储复杂数据。
如果最后的输入数据块不能构成3段输出数据,就用一个或两个等号补足输出。