深入理解web安全

1、CSRF(跨站请求伪造)

CSRF攻击是源于WEB的隐式身份验证机制。
WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!

1.1 JSON端点中的CSRF

可以使用XHR来实现csrf,使用XMLHttpRequest、fetch能构造出JSON请求,并且能设置Content-Type,但是无法跨域

  1. POST body需要以JSON格式发送,而这种格式如果用HTML表单元素来构建的话会比较麻烦。
  2. Content-Type头需要设置为application/json。设置自定义Header需要使用XMLHttpRequests,而它还会向服务器端发送OPTIONS预检请求。

1.2 CSRF 防御

1.二次验证或验证码
用户操作验证,在提交数据时需要输入验证码
2.请求来源验证,验证请求来源的referer
referer值可被修改;
referer被限制发送,导致误报

3.表单token验证
Token的值必须是随机的,不可预测的;
有限的生命周期
使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露

4.在 HTTP 头中自定义属性并验证
通过 XMLHttpRequest 这个类,一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性;也不用担心 token 会透过 Referer 泄露到其他网站中去
局限性:XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作。

2. SSRF(服务器端请求伪造)

2.1 可利用的协议

file:/// 获取文件

sftp:// Sftp代表SSH文件传输协议(SSH File Transfer Protocol),或安全文件传输协议(Secure File Transfer Protocol),这是一种与SSH打包在一起的单独协议,它运行在安全连接上

ldap:// 轻量级目录访问协议
通常说的LDAP是指运行这个数据库的服务器,应用如AD域控
LDAP也是有client端和server端,读性能特别强,但是写性能差
树型查询结构

gopher://
Gopher是一种分布式文档传递服务。利用该服务,用户可以无缝地浏览、搜索和检索驻留在不同位置的信息(信息检索)
端口 : 70
利用此协议可以攻击内网的 Redis、Mysql、FastCGI、Ftp等等,也可以发送 GET、POST 请求。
gopher协议的格式:gopher://IP:port/_TCP/IP数据流

dict:// 引用允许通过DICT协议使用的定义或单词列表
tftp:// 允许客户端从远程主机获取文件或将文件上传至程主机

2.2 原理、利用和绕过

服务端并没有对用户提交的URL做任何的限制和过滤

2.2.1 存在位置

通过url分享、加载、下载
转码服务
在线翻译功能
图片收藏

2.2.2 利用

端口扫描
攻击内网或本地的web应用
信息收集:内网应用指纹识别
读取本地文件

2.2.3 绕过

1.限制域名时,用 @绕过
2.短网址
3.进制转换
4.利用[::]来绕过localhost
5.利用。替换 .
6.利用特殊域名 :利用的原理是DNS解析
http://www.owasp.org.127.0.0.1.xip.io/
http://0/

2.3 防御

1.过滤返回信息
2.统一错误信息
3.限制请求的端口为http常用的端口
4.黑名单内网ip
5.禁用不需要的协议

3. CORS

3.1 原理

浏览器会将ajax请求分为两类,其处理方案略有差异:简单请求、特殊请求

特殊请求:请求头携带origin参数,响应头返回Access-Control-Allow-Origin等信息
●Origin指出当前请求属于哪个域;

●Access-Control-Allow-Origin:*/任意域名
Access-Control-Allow-Credentials:是否允许携带cookie
Content-Type: text/html; charset=utf-8

跨域请求要想操作cookie,需要满足3个条件:

●服务的响应头中需要携带Access-Control-Allow-Credentials并且为true。
●浏览器发起ajax需要指定withCredentials 为true
●响应头中的Access-Control-Allow-Origin一定不能为*,必须是特定的域名

4. XXE(xml外部实体注入漏洞)

4.1 原理

XML文档结构包括XML声明、DTD文档类型定义(可选)、文档元素
主要是利用了DTD引用外部实体导致的漏洞

产生XXE有三个条件,首先是解析了XML,其次是XML外部可控。最后是没有禁用外部实体

支持的协议

4.2 利用

4.2.1 有回显

读取任意文件
内网IP、端口探测
XXE与文件上传结合(
	1. 上传SVG图片
	2. 利用jar:// 协议攻击

4.2.2 无回显:需要使用第三方平台协助攻击

外带数据读取文件
报错注入

4.3 防御

禁用外部实体和参数实体
过滤用户提交的xml数据

Java :
OWASP推荐的修复代码如下,号称是可以防御几乎所有XXE攻击

原理:程序解析到 DOCTYPE 时,判断fDisallowDoctype 为Ture,停止解析xml文档。

5. SSTI(服务器端模板注入)

5.1 原理

对用户输入过滤不严,攻击者可以通过构造恶意数据

判断模板类型
如{{7*’7’}}在Twig中会的到49,而在Jinja2中会得到7777777

5.2 利用

{{x+x}}
使用魔术方法,找到可利用的类,调用该类下的函数进行利用
获取配置文件
RCE
反弹shell
文件读写
xss

5.3 防御

将逻辑层和渲染层分离
对用户提交的数据进行转义

6. XSS

6.1 防御

6.1.1 富文本

思路:从输入端防御

  1. 过滤“事件” 和

7. WAF绕过

7.1 绕过方式

● 1. 白名单绕过
● 2. 大小写绕过
● 3. 双写绕过
● 4. 编码绕过
● 5. 内联注释绕过(id=1/!and/1=1)
● 6. 字符拼接

8. SQL注入

8.1 预编译(参数化)

8.1.1 预编译实现

是通过PreparedStatement和占位符来实现的

8.1.2 JAVA 持久层框架

jdbc: 使用PreparedStatement是必要的,可以有效地防止sql注入

Mybatis: #{}是预编译处理, 是字符串替换,使用 {}是字符串替换,使用 是字符串替换,使用{}就可能导致SQL注入
● 当原生jdbc不支持预编译的位置
比如order by 之后 表名、排序等位置,采用直接拼接的方式,可能产生sql注入

● sql语句中的In之后常常存在注入点
当进行同条件多值查询的时候,Select * from admin where id in (#{id}) 这种形式的语句会报错。因此需要这样写 select * from admin where id in {${id}} 导致SQL拼接

● 模糊查询
MyBatis框架网站的搜索功能处常常存在SQL注入,原因就是模糊查询的时候,有时会用到参数拼接的形式

Hibernate:要用到HQL(Hibernate Query Language) ,是面向对象的查询语言, 它和 SQL 有些相似。
HQL查询并不直接发送给数据库,而是由hibernate引擎对查询进行解析并解释,然后将其转换为SQL。
HQL的注入模式非常有限:只能有限的暴力破解出实体和列名,登录处会存在万能密码。

8.1.3 不能使用预编译(参数化)的位置

● order by后面的字段名、升序降序ASC或者DESC等关键字无法预编译
● 不能指定查询中的表和列的名称
● (mybatis)不能对动态参数进行预编译

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值