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) 设置白名单 ```yaml #在 Header 增加上 # 只允许加载本站资源 Content-Security-Policy: default-src 'self' #只允许加载 HTTPS 协议的图片 Content-Security-Policy: img-src https://* #允许加载任何来源框架 Content-Security-Policy: child-src 'none' ``` #### b) 转义字符 ```javascript 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 ```yaml # 大多数 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) 跳过验证密码例子 ```php #正常请求 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 来获取其他表的数据 ```php # 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) 通过注释密码 ```php # 首先做一个表单 <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 上是注释的意思,那么这样不同密码也能登录了 ``` ![](https://gz-blog-storage-1252787757.cos.ap-guangzhou.myqcloud.com/usr/uploads/2024/05/17162848531758.jpg) ### 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 //这里使用 PHP 模拟 Header 跳转 <?php $url = $_GET['url']??''; header("Location: $url") ``` ```html <--! 下面使用 meta 跳转 --> <meta http-equiv="refresh" content="0; url='http://www.qq.com/'"> ``` ### 3) 防范措施 1. `referer` 限制 url 的来源,有缺点就是前面说的,https 跳 http 的时候因为安全问题为空 2. 加入有效验证 `token`: 服务端生成用户不可控的 token 进行验证,即时用户自己生成恶意链接,也不会出现问题。 © Reprint prohibited Support Appreciate the author AliPayWeChat Like If you think my article is useful to you, please feel free to appreciate