Loading...

Web 常见的几种攻击和防范措施

XSS(Cross-Site Scripting)

跨站脚本攻击,因为缩写和 CSS 重叠,所以只能叫 XSS 。跨站脚本攻击是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或 Javascript 进行的一种攻击。

1) 造成的影响

  1. 利用虚假输入表单骗取用户个人信息
  2. 利用脚本窃取用户的 Cookie 值,被害人在不知道的情况下,帮助攻击者发送恶意请求
  3. 显示伪造的文章或图片

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,'/'); }
# 大多数 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 判断是从哪个网站传过来的,但是 httpshttp 的时候,因为安全问题,没有设置 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 注入的防范措施

  1. 如果传入后端的是一些整数,如翻译,id 浏览文章,记得在后端处理,如 PHP 使用 intval()进行转换
  2. 对于字符串变量,PHP 可以使用 addslashes() 函数转义,将 ' " \和空字符转为含有反斜杠溢出字符,或者使用 PDO 的参数绑定来提高安全性。
  3. 转义或过滤一些特殊字符,如%。
  4. 严格限制 Web 应用的数据库的操作权限,比如某些应用只能查询某个表,只能查询不能修改
  5. 做好数据库备份

点击劫持

原理:点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 Iframe 嵌套的方式嵌入自己的网页中,并将 iframe 设置为透明,在页面中透出一个按钮诱导用户点解

1) 攻击示范

设置一个 iframe 然后将一个页面挡住,然后诱导用户点击。
当用户点击后,实际上是点击了订阅的按钮,从而间接性的骗取用户

2) 防御措施

  1. X-FRAME-OPTION 是一个响应头 : DENY 表示不允许通过 iframe 的方式展示;SAMEORIGIN表示可以在相同域名下通过 iframe 的方式演示;ALLOW-FROM表示页面可以在指定来源的 iframe 中展示。
  2. 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) 防范措施

  1. referer 限制 url 的来源,有缺点就是前面说的,https 跳 http 的时候因为安全问题为空
  2. 加入有效验证 token: 服务端生成用户不可控的 token 进行验证,即时用户自己生成恶意链接,也不会出现问题。
If you think my article is useful to you, please feel free to appreciate