Web 常见的几种攻击和防范措施
XSS(Cross-Site Scripting)
跨站脚本攻击,因为缩写和 CSS 重叠,所以只能叫 XSS 。跨站脚本攻击是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 Javascript 进行的一种攻击。
1) 造成的影响
- 利用虚假输入表单骗取用户个人信息
- 利用脚本窃取用户的 Cookie 值,被害人在不知道的情况下,帮助攻击者发送恶意请求
- 显示伪造的文章或图片
2) 非持久性 XXS
#最直接的方式就是在 url 嵌入脚本代码
https://xxx.com/xxx?default=<script>alert(document.cookie)</script>
#一些浏览器如 Chrome 内置了一些 XSS 过滤器,可以防止大部分非持久化的 XSS 攻击
- 尽量不要从 url、document.referrer、document.forms 等这种 Dom APi 中获取数据直接渲染
- web 页面渲染的所有内容或者渲染的数据都必须保证来自服务端
- 尽量不要使用 eval,document.write(),document.writeln(),window.setTimeOut()等可执行字符串的方法
- 如果做不到以上几点,也必须对设计 DOM 渲染的方法传入的字符串进行 escape 转义
- 前端渲染的时候对任何字段都需要做 escape 转义编码
3) 持久性 XXS
典型的例子就是评论的时候,在
<textarea></textarea>
上插入<script></script>
脚本,
因为没转义保存到数据库,每个浏览评论的用户都会执行这端脚本。
4) 防范的措施
a) 设置白名单
#在 Header 增加上
# 只允许加载本站资源
Content-Security-Policy: default-src 'self'
#只允许加载 HTTPS 协议的图片
Content-Security-Policy: img-src https://*
#允许加载任何来源框架
Content-Security-Policy: child-src 'none'
b) 转义字符
function escape(str){
str = str.replace(/&/g,'&');
str = str.replace(/</g,'');
str = str.replace(/>/g,'>');
str = str.replace(/"/g,'&quto;');
str = str.replace(/'/g,''');
str = str.replace(/`/g,'`');
str = str.replace(/\//g,'/');
}
c) HttpOnly Cookie
# 大多数 XXS 都是通过 js 来获取 Cookie 信息
# 那么将改成
Cookie: HttpOnly
# 就有效防止客户端切 js 窃取 cookie
CSRF (Cross Site Request Forgery)
CSRF (Cross Site Request Forgery),即跨站请求伪造,是一种常见的 Web 的攻击,他利用用户已登录的身份,在用户毫不知情的情况下,已用户的名义完成非法操作。
1) 原理
当我们进入了一个转账页面,突然出现一个广告弹窗,点进去然后进入了 B 网站,
点你点击的时候,使用 jS 脚本修改 form 的提交地址和账号,
那么你给别人转账了
2) 防范措施
- 对
Cookie
设置SameSite
属性,不允许跨域请求 referer
判断是从哪个网站传过来的,但是https
跳http
的时候,因为安全问题,没有设置referer
。- 使用
token
- 在关键业务使用验证码,降低了用户体验,但是加强了安全。
Sql Injection
1) 跳过验证密码例子
#正常请求 http://127.0.0.1/inject.php?user=admin&pass=admin
# 那么后端代码写入
$user = $_GET['user']??'';
$pass = $_GET['pass']??'';
$sql = "select * from user where username='{$user}' and pwd='{pass}'";
# sql = "select * from user where username=admin and pwd = admin;"
# 如果请求的是 http://127.0.0.1/inject.php?user=admin&pass=admin%20or%201=1
# sql = "select * from user where username=admin and pwd = admin or 1=1;"
2) 通过 Union 来获取其他表的数据
# http://127.0.0.1/inject.php?user=admin&pass=admin' union select *,1 from path where '1=1
#实际上 sql = select * from user where username=admin and pwd = admin union select *,1 from path where 1=1;
#只要前半段查询的字段和后半段查询的语句的字段一样,那么就可以随意查询每个表的数据
3) 通过注释密码
# 首先做一个表单
<form action="./sql.php" method="post">
<p>
<label>
<input type="text" name="username">
</label>
</p>
<p>
<label>
<input type="password" name="password">
</label>
</p>
<input type="submit" value="submit">
</form>
# 后端
$sql = "select * from user where username = '{$user}' and psw = '{$pass}' ";
# sql = "select * from user where username= admin -- and psw = "
# -- 在 SQL 上是注释的意思,那么这样不同密码也能登录了
4) sql 注入的防范措施
- 如果传入后端的是一些整数,如翻译,id 浏览文章,记得在后端处理,如 PHP 使用 intval()进行转换
- 对于字符串变量,PHP 可以使用 addslashes() 函数转义,将 ' " \和空字符转为含有反斜杠溢出字符,或者使用 PDO 的参数绑定来提高安全性。
- 转义或过滤一些特殊字符,如%。
- 严格限制 Web 应用的数据库的操作权限,比如某些应用只能查询某个表,只能查询不能修改
- 做好数据库备份
点击劫持
原理:点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 Iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点解
1) 攻击示范
设置一个
iframe
然后将一个页面挡住,然后诱导用户点击。
当用户点击后,实际上是点击了订阅的按钮,从而间接性的骗取用户
2) 防御措施
X-FRAME-OPTION
是一个响应头 :DENY
表示不允许通过 iframe 的方式展示;SAMEORIGIN
表示可以在相同域名下通过 iframe 的方式演示;ALLOW-FROM
表示页面可以在指定来源的 iframe 中展示。JavaScript
防御,使用JavaScript
代码操作dom
防止iframe
显示。
URL 跳转漏洞
原理:黑客利用 URL 跳转漏洞来诱导安全意识比较低的用户点击,导致用户信息泄露或者资金的流失。
1) 攻击的示范
如:
http://gate.baidu.com/index?act=go&url=http://t.cn/RVTatrd
http://qt.qq.com/safecheck.html?flag=1&url=http://t.cn/RVTatrd
http://tieba.baidu.com/f/user/passport?jumpUrl=http://t.cn/RVTatrd
2) 实现方式
Header 头跳转
JavaScript 跳转
META 标签跳转
//这里使用 PHP 模拟 Header 跳转
<?php
$url = $_GET['url']??'';
header("Location: $url")
<--! 下面使用 meta 跳转 -->
<meta http-equiv="refresh" content="0; url='http://www.qq.com/'">
3) 防范措施
referer
限制 url 的来源,有缺点就是前面说的,https 跳 http 的时候因为安全问题为空- 加入有效验证
token
: 服务端生成用户不可控的 token 进行验证,即时用户自己生成恶意链接,也不会出现问题。