Web安全简介
1.1 服务器是如何被入侵的
攻击者想要对计算机进行渗透,需要一个必要的条件:二者必须能够进行通信。
而通信需要端口,端口上运行着服务,因此入侵也是靠端口。
过去的荣光
在2000至2008年间,常用的攻击方法是直接对目标进行攻击,比如端口扫描、一些服务密码的爆破。后来随着发展,可扫描出的切入点越来越少,新的战场转移到了Web之上。
随着发展,如今的Web称为Web应用程序会更加合适。如今的Web功能十分强大,和早期的Web差别十分巨大,用户需要做的仅仅是拥有一个浏览器。
Web的四个要点:数据库、编程语言、Web容器、优秀的程序设计者
Web的服务默认运行在80端口之上,是系统提供的服务之一。
网站并不是上线以后便会安全,服务器环境发生变化后,可能会导致安全问题。
目前常用的攻击方式:
- C段扫描 攻击者通过同一网段内的一台主机对目标主机进行ARP等手段的使用。
- 社会工程学
- Services 直接利用服务进行溢出
2 深入HTTP请求流程
随着Web2.0时代的到来,互联网从传统的C/S架构转变为更为方便快捷的B/S架构。客户机只需要使用浏览器便可以进行使用,无需安装臃肿的客户端。
2.1 HTTP协议解析
超文本传输协议,详细规定了互联网和万维网服务器之间的通信规则,是万维网信息交换的基础,它允许将HTML文档从Web服务器传送到Web浏览器。
2.1.1 发起HTTP请求
浏览器输入URL,点击回车便是一次HTTP请求。
还可以借助curl和weget来进行HTTP请求。
2.1.2 HTTP协议解析
HTTP目前的最新版本是1.1,它是一种无状态协议。即Web浏览器与Web服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器端回送响应,之后连接就被关闭了。另外一层意思是HTTP请求只能由客户端发起,服务器不能主动向客户端发送数据。
HTTP遵循请求应答模型。
1.HTTP请求与响应
- 请求报文
HTTP请求包括三部分:请求行(请求方法)、请求头(消息报头)和请求正文。
POST /login.php HTTP/1.1 //请求行
HOST:www.xxser.com //请求头
User-Agent: Mozilla/5.0
//空白行代表请求头结束
Username=admin&password=admin //请求正文
请求行
请求行由三部分组成,第一部分说明请求类型,第二部分请求内容,第三部分使用的HTTP版本
请求头
可以包含多个请求头。请求头是由客户端自己设定的
请求正文
请求正文是可选的,常用在POST方法中。
- 应答报文
应答报文由响应行、响应头和响应正文组成。
第一行为响应行,其中有HTTP版本、状态码以及消息
第二行至空白行之间为响应头
响应头之后是响应正文
2、HTTP请求方法
- GET
GET方法用于获取请求页面的指定信息(以实体的格式)。如果请求内容为动态脚本,那么返回文本是Web容器解析后的HTML源代码。比如请求index.jsp,不是返回index.jsp,而是返回解析后的HTML代码。
此外,服务器只会接收自己需要的参数,用户附加的多余参数是不会被服务器接收的。
GET /index.php?id==1 HTTP/1.1
HOST: www.xxser.com
- HEAD
HEAD方法除了服务器不能在响应里返回消息主体外,其他都和GET方法相同。经常用来测试超文本链接的有效性、可访问性和最近的改变。常用于编写扫描工具,用来测试资源是否存在。
HEAD /index.php HTTP/1.1
HOST: www.xxser.com
- POST
与GET类似,但是GET方法没有请求内容,而POST方法是有请求内容的。POST请求最多用于向服务器发送大量的数据。GET虽然也能发送数据,但是有大小的限制,并且GET请求会将发送的数据显示在浏览器端,而POST不会,安全性相对来说更高一点。
- PUT
PUT方法用于请求服务器把请求中的实体存储在请求资源下,是替换存储
PUT /input.txt
HOST: www.xxser.com
Content-Length: 6
123456
这段HTTP PUT请求会在主机根目录下创建input.txt,内容为123456.通常情况下服务器都会关闭PUT方法,因为该操作有很大的安全风险
- DELETE
请求源服务器删除请求得指定资源
- TRACE
用于激发一个远程的应用层的请求消息回路。即回显服务器收到的请求
- CONNECT
动态切换到隧道的代理
- OPTIONS
用于请求获得由URI标识的资源在请求/响应的通信过程中可以使用的功能选项。
3.HTTP状态码
HTTP响应中的第一行中存在装他妈字段。目前有以下5种状态码
- 1xx:信息提示,标识请求已经被成功接收,继续处理,范围是100-101
- 2xx:成功,服务器成功处理了请求,范围是200-206
- 3xx:重定向,用于告诉客户端它请求的资源已经移动,并告诉客户端新地址。浏览器将重新对新资源发起请求。范围是300-305
- 4xx:客户端错误状态码,服务器无法处理客户端发送的东西,比如格式错误或者资源不存在400-415
- 5xx:客户发送有效请求,但是Web服务器出错了,5xx用来描述服务器的内部错误
4.HTTP消息
HTTP消息又称HTTP头,由四部分组成:请求头,响应头,普通头,实体头
- 请求头
请求头只出现在HTTP请求中,请求报文允许客户端向服务器传递请求的附加消息和客户端自身的消息,常用的请求头如下:
1.Host
用于指定被请求资源的Internet主机和端口号,例如
HOST: www.xxser.com:801
2.User-Agent
允许客户端将它的操作系统、浏览器和其他属性告诉服务器
Usr-Agent:My privacy
3.Referer
Referer包含一个URL,代表当前访问URL的上一个URL,也就是说,用户是从什么地方来到本页面的。
Referer: www.xxser.com/login.php
4.Cookie
一段文本,常用来标识请求者的身份
5.Range
Range可以请求实体的部分内容,多线程下载的时候一定会用到。例如:
表示头500字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500字节:bytes=-500
表示500字节以后的范围:bytes=500-
6.x-forward-for
即XXF头,它代表请求端的IP,可以有多个,中间以逗号分开
HTTP 请求头中的 X-Forwarded-For_大大肉包博客-优快云博客
7.Accept
用于指定客户端接收哪些MIME信息
MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据
如果不设置,默认任何数据都可以进行接收
8.Accept-Charset
指定客户端接受的字符集,不设置的话,默认接收所有的字符集
- 响应头
响应头是服务器根据请求向客户端发送的HTTP头,常见的HTTP响应头如下:
1.Server
服务器使用的Web服务器的名称,攻击者通过查看此头,可以探测Web服务器名称,因此,建议在服务器端修改此头的信息
2.Set-Cookie
向客户端设置Cookie,通过查看此头,可以清楚看到服务器向客户端发送的Cookie信息
3.Last-Modified
资源最后的修改时间
4.Location
告诉浏览器去访问哪一个页面。通常浏览器接收这个请求后会立刻访问Location所指的页面。常配合302状态啊进行使用
5.Refresh
告诉浏览器定时刷新浏览器
- 普通头
在普通报头中,有少数报头域用于所有的请求和响应消息,但是不用于被传输的实体,只用于传输的消息,比如Data,表示消息产生的日期时间
- 实体头
请求和响应消息都可以传送一个实体头。实体头定义了关于实体正文和请求所标识的资源的元信息。元信息也就是实体内容的属性,包括信息类型、长度、压缩方法、最后一次修改时间等
1.Content-Type
用于向接收方指示实体的介质类型
2.Content-Encoding
用作媒体类型修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因此要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
3.Content-Length
指明实体正文的长度,以字节方式存储的十进制数字来表示
4.Last-Modified
指明资源最后修改时间和日期
2.1.3 模拟HTTP请求
使用Telnet模拟一次简单的HTTP请求
>telnet www.baidu.com 80
>按ctrl+],进入回显模式
>点击回车,进入编辑模式
>输入
GET /index.html HTTP/1.1
Host: www.baidu.com
>连续按两次回车
2.1.4 HTTP协议与HTTPS协议的区别
HTTPS协议全称为Hypertext Transfer Protocol over Secure Socket Layer,它是以安全为目标的HTTP通道,其实就是HTTP的升级版,比单纯的HTTP协议更加安全。
HTTPS的安全基础是SSL,即在HTTP下加入SSL层,也就是HTTPS通过安全传输机制进行传送数据,可以保护数据的机密性与完整性
数据传输方式并没有发生变化。主要区别如下:
- HTTP信息以明文方式传输,HTTPS是具有安全性的SSL加密传输协议
- HTTP采用80端口,HTTPS采用443端口
- HTTPS协议需要使用到ca证书,大都要缴费
- HTTP是无状态连接的,HTTPS基于HTTP协议,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护
HTTP两个版本的区别
2.2 截取HTTP请求
在渗透测试中,经常会进行HTTP请求得截获来发现一些隐秘的漏洞,如绕过JS、发现隐藏标签内容等。
2.2.1 Burp Suite Proxy初体验
工具说明
工具 | 说明 |
---|---|
proxy | 一个拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许拦截、修改、查看在两个方向上的原始数据包 |
spider | 一个应用智能感应的网络爬虫,它能完整枚举应用程序的内容与功能 |
scanner | 一个高级工具,执行后,能自动发现Web应用程序的内容与功能 |
intruder | 一个定制的高度可配置工具,对web应用程序进行自动化攻击,如枚举标识符、表单破解和信息搜集 |
repeater | 靠手动操作来补发单独的HTTP请求,并分析应用程序的响应 |
sequencer | 用来分析那些不可预知的应用程序会话令牌和重要数据项的随即性的工具 |
decoder | 解码/编码工具 |
comparer | 一个实用工具,通常通过一些相关的请求和响应得到两项数据的一个可视化的差异 |
本节主要使用Proxy模块来进行一次实际的绕过JS验证。
实验步骤
1、在winserver 2000建立网站
2、网站源码见code
3、物理机浏览器访问新建的网站
可以看到新建的网站,打开即可
4、启动burp,配置proxy,代理设置为127.0.0.1:8080
5、设置启用代理,我用的火狐浏览器插件FoxyProxy
6、burp抓包,修改提交内容
7、成功绕过前端js检查
带有敏感字段的数据成功被提交
貌似没有什么反应?
别急,后端并没有对数据进行处理,当然会没有反应
如果我们 在后端以如下的方式对数据进行处理:
<%response.write(request.form("username"))%>
然后,我们的提交内容被写在页面,浏览器把它当作一条指令来执行,便成功进行了xss
网站配置问题:
https://blog.youkuaiyun.com/yunyiduan/article/details/80597094
2.2.2 Fiddler
Fiddler是一款优秀的Web调试工具,它可以记录所有的浏览器与服务器之间的通信信息(HTTP和HTTPS),并且允许设置断点,修改输入输出数据。
下载地址:
http://fiddler2.com/
拦截HTTP(S)请求
Fiddler默认只会拦截HTTP请求,在Tools–Fiddler Options–HTTPS–Decrypt HTTPS traffic配置拦截HTTPS请求
命令行指令:
- cls 清除会话列表
- select 选择会话
- bup 截取request
- help 帮助
过滤器
使用Fiddle拦截某个网站的请求时,会拦截图片、CSS、JS等文件信息,导致产生很多的会话,可以使用Fiddler过滤器来过滤请求
Filters-Responses Type and Size 进行设置,选择需要查看的会话
设置断点
在设置断点后,Fiddler会捕捉所有经过的消息,我们可以任意修改HTTP请求信息,包括Host、Cookies或表单数据。
法1:Rules-Automatic Breakpoints 选择断点的插入点:Before Request After Response Disabled
法2:执行 bpu www.xxser.com 设置拦截响应信息可以使用bpafter命令
请求一旦被拦截 网站就会处于阻塞状态 在会话列表中选择被拦截的网站,在左侧自动跳转到Inspectors模块中
释放:Break on Response
不再拦截:Run to Comlietion
编码器
TextWizard
会话编辑器
Composer
可以针对单个URL的会话进行分析 在左侧栏指定URL会话,拖至Composer 编辑器会自动分析请求
插件支持
Fiddler有自己的插件官网
常用的一些第三方插件:
- Intruder21
类似于burp
- x5s
帮助测试人员找出最可能出现跨站脚本的地点
- Ammonite
Web应用程序安全扫描插件 有效检测SQL命令注射、OS命令注射、本地文件包含、缓冲区溢出和XSS漏洞
2.3 HTTP应用 黑帽SEO之搜索引引擎劫持
SEO:搜索引擎优化
黑帽SEO指的是通过作弊手段欺骗搜索引擎 获取非正常的排名 让网站更靠前
黑帽SEO中一个提升排名的方法就是友情链接 与较大的网站做友情链接 可以使自己的排名具有优势,但是较大网站不会无缘无故与你做友情链接,于是黑帽SEO一般都会对网站进行入侵 然后偷偷挂友情链接 以获得更好的排名
另一种手段是搜索引擎劫持。
HTTP中有个请求头叫做Referer 还有一个头叫做User-Agent 黑帽SEO就是利用这两个头来欺骗搜索引擎的。Referer用于告诉搜索Web服务器 用户是从哪一个页面来的 User-Agent告诉Web服务器用户使用的浏览器和操作系统信息。当用户通过搜索引擎打开此网站的时候,一般会引出源页面
js绕过代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>js绕过</title>
<script type="text/javascript">
function check(f){
var str=f.username.value;
var c=new Array('script','<','>','input','img');
for(var i=0;i<c.length;i++){
if(str.indexOf(c[i])!=-1){
alert('你的输入存在敏感字符'+c[i]);
return false;
}
}
return true;
}
</script>
</head>
<body>
<div>
<form method="Post" name='f'>
<input type='text' name='username'>
<input type="submit" value="click" onclick="check(f)">
</form>
</div>
<%response.write(request.form("username"))%>
</body>
</html>