第一章-web安全基础(学习笔记)
常见的Web安全漏洞
owasp top10(十大安全漏洞)
- 注入
- 失效的身份认证
- 敏感数据泄露
- XML外部实体
- 失效的访问控制
- 安全配置错误
- 跨站脚本(XSS)
- 不安全的反序列化
- 使用含有已知漏洞的组件
- 不足的日志记录和监控
HTTP基础
超文本传输协议,规定浏览器和万维网服务器之间相互通信的规则,它允许将超文本标记语言文档冲Web服务器传送到Web浏览器。
HTTP之URL
URL:统一资源定位符
- URL的标准格式
协议://服务器域名[:端口]/路径、[?查询]
- 协议:包含HTTP、HTTPS等
- 服务器域名:也可使用IP地址来表示
- 端口:端口并不是URL必需的部分,可以省略采用默认端口。如:HTTP的默认端口为80。
- 路径:主机上的一个目录或者地址。
- 查询:从?开始为查询部分,其中分为参数名和参数值。
HTTP请求
HTTP请求分为三部分:请求行、请求头和请求正文。
- 请求行:由请求方法、请求路径和协议版本3部分组成。
- 请求头:HTTP请求的第二行至空白行为请求头。包含客户端环境,请求正文的有用信息。
- 请求正文:空行代表请求头结束请求正文开始。
HTTP响应
HTTP响应分为三部分:相应行、响应头(消息包头)和响应正文。
- 响应行:由协议版本、状态码、状态信息三部分组成。
- 响应头:第二行至末尾空白行为响应头。用来传递不能放入响应行的附加响应信息、关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
- 响应正文:返回给客户端的文本信息。
HTTP状态码
5种HTTP状态码
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
常见的HTTP状态码
状态码 | 状态描述 | 说明 |
---|---|---|
200 | ok | 客户端请求成功 |
301 | 永久移动 | 永久移动。请求的资源已被永久移动到新的UR1,返回信息会包括新的URI,浏览器会自动定向到新的URI。今后任何新的请求都应使用新的URI代替 |
302 | 临时移动 | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
400 | 不良请求 | 客户端错误,请求包含语法错误或无法完成请求 |
401 | 未经授权 | 请求要求用户的身份认证 |
403 | 禁 | 服务器理解客户端的请求,但是拒绝执行此请求 |
404 | 找不到 | 服务器无法根据客户端的请求找到资源(网页) |
500 | InternalServerError | 服务器内部错误,无法完成请求 |
503 | 服务不可用 | 由于超载或系统维护,服务器暂时无法处理客户端的请求 |
HTTP请求方法
HTTP1.0定义了3个请求方法:GET、HEAD、POST。1.1又新增了5个请求方法:PUT、DELETE、CONNECT、OPTIONS、TRACE
请求方法 | 描述 |
---|---|
GET | 请求指定页面信息,并返回实体主体 |
HEAD | 与GET请求相似,但是只返回响应行和响应头,不返回响应正文 |
POST | 向指定资源提交数据以处理请求(例如,提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改 |
PUT | 从客户端向服务器传送数据并进行存储或替换 |
DELETE | 请求删除服务器指定的页面! |
CONNECT | HTTP 1. 1协议中预留给能够将连接改为管道方式的代理服务器 |
OPTIONS | 允许客户端查看服务器的性能 |
TRACE | 回显服务器收到的请求,主要用于测试或诊断 |
GET方法示例
POST方法示例
POST与GET方法的区别:
- GET方法没有请求正文,而POST方法有
- GET方法请求数据有长度限制,而POST方法请求数据没有长度限制。
- GET方法会在浏览器中显示请求的数据;而POST方法不会,因此更为安全。
HTTP请求头
请求头 | 信息 |
---|---|
Host | 请求的Web服务器域名或者IP地址 |
User-Agent | HTTP客户端运行的浏览器类型的详细信息。通过该信息,Web服务器可以判断出当前HTTP请求的客户端浏览器类别 |
Accept | 指定客户端能够接收的内容类型,内容类型的先后次序表示客户端接收的先后次序 |
Accept-Language | 指定HTTP客户端浏览器用来展示返回信息所优先选择的语言 |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有Cookie值一起发送给Web服务器 |
Referer | 包含一个URL,用户从该URL代表的页面出发访问当前请求的页面 |
HTTP响应头
响应头 | 信息 |
---|---|
Location | 控制浏览器重定向到哪个页面 |
Server | 服务器的banner信息 |
Set-Cookie | 服务器发送给客户端的Cookie设置信息 |
Cache-Control | 服务器控制浏览器是否要缓存网页 |
Cookie和Session
HTTP本身是无状态的,不能保存服务器和客户端状态信息。客户端访问一次Web应用和连续访问十次Web应用,服务器返回的页面都是一样的,但有些情况下需要服务器记住或者识别用户,为此引入了Cookie和Session的概念
Cookie简介
- Cookie是客户端保存用户信息的一种机制,存储在客户端的文件中。
- Cookie存在过期时间,会在相应时间后到期自动删除Cookie文件。
Cookie详解
设置Cookie
- 语法:setcookie(name,value,expire,path,domain);
- Cookie存储的信息包含名称、值、过期时间、路径、域。
- 路径和域构成了Cookie的作用范围。
- 设置user的cookie,复制为test,过期时间为1h。示例如下
<?php
setcookie("user","test",time()+3600);
?>
- cookie文件存放在
\walk\AppData\Local\Googel\Chrome\User Data\Default\Cookies
中。不同用户的浏览器安装路径不一样,cookie文件路径也不同。 - chrome浏览器的cookie文件是SQLLite数据库文件,Chrome33以上版本对Cookies进行了加密,用SQLLite Developer打开Chrome的Cookies文件就会发现Value字段已经加密。
- 运行以下脚本可以将Cookie解密:
import sqlite3
import win32api
outFile_path = r'D:\Cookies.txt';
sql_file = r'c:\Users\walk\AppData\Local\Google\Chrome\User Data\Default\Cookies';
sql_exe = "select host_key,name,value,encrypted_value from Cookies";
conn = sqlite3.connect(sql_file)
for row in conn.execute(sql_exe):
pwdHash = str(row[3])
try:
ret = win32crypt.CryptUnprotectData(pwdHash,None,None,None,0)
except:
print('Fail to decrypt Chrome Cookies')
sys.exit(-1)
with open(outFile_path,'a+') as outFile:
outFile.write('host_key:{0:<20}name:{1:<20}value:{2} \r\n'.format(row[0].encode('gbk'),row[1].encode('gbk'),ret[1].encode('gbk')))
conn.close()
print('All Chrome Cookies saved to:\n') + outFile_path
获取Cookie
输出user Cookie的值test,代码如下:
<?php
print_r($_COOKIE["user"]);
?>
此代码可以获取name为user的Cookie信息
删除Cookie
<?php
setcookie("user","",time()-3600);
?>
通过此代码可以删除name为user的Cookie。
Session详解
- Session是在无状态的HTTP下服务端跟踪用户状态时用于标识具体用户的机制,Session信息存储在服务器端的数据库或者文件中。
Session的实现原理
- Session的工作机制是:为每个用户创建一个唯一的ID,并基于这个ID来存储变量。
Session的组成
- Session包含一下三个部分:
(1) Session id。用户session的唯一标识,随机生成。
(2)Session file。Session的存储文件,文件名称为sess_(Session_id)。
(3)Session data。保存序列化后的用户数据。
Session的存储位置
- session的存储位置在PHP配置文件php.ini中定义,也可以通过应用程序设置。
- 下面的PHP配置文件中,session存储在默认的/var/lib/php/session目录下。
PHP中Session设置函数
1) Session会话开启函数session_start
在存储Session内容之前,必须开启Session会话,开启Session会话的函数是Session_start,该函数位于标签之前。格式如下:
此代码开启一个Session会话,并且为用户创建一个唯一的ID,并基于这个ID存储变量。
2)Session的存储与读取
Session通过PHP的$_SESSION变量进行Session的存储与读取。
以上代码通过$_SESSION变量存储ctfs的值(为1),运行后输出sessiontest=1。
Session传输
Session一般是在Cookie中传输的,若Cookie被禁用,则会通过URL重写的方式进行传输。
- 通过URL重写实现Session传输
- 表单隐藏字段
服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够吧Session id传递回服务器