From 9b93c24c0151ebd6ea0ac6da7263c0fd3a5d9069 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Fri, 23 Oct 2026 03:23:08 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E6=94=BB=E5=87=BB=E6=8A=80=E6=9C=AF.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- notes/攻击技术.md | 53 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/notes/攻击技术.md b/notes/攻击技术.md index e0107b4f..168b045f 100644 --- a/notes/攻击技术.md +++ b/notes/攻击技术.md @@ -15,6 +15,12 @@ 跨站脚本攻击(Cross-Site Scripting, XSS),可以将代码注入到用户浏览的网页上,这种代码包括 HTML 和 JavaScript。 +主要有三种类型: + +- 存储型:恶意代码保存在服务器上,例如论坛帖子,所有浏览该页面的用户都会受到攻击; +- 反射型:恶意代码放在 URL 参数中,服务器直接把它输出到页面上,需要诱导用户点击该 URL; +- DOM 型:前端 JavaScript 直接把不可信的数据写入 DOM,服务器没有参与。 + ### 攻击原理 例如有一个论坛网站,攻击者可以在上面发布以下内容: @@ -36,6 +42,7 @@ - 窃取用户的 Cookie - 伪造虚假的输入表单骗取个人信息 - 显示伪造的文章或者图片 +- 以用户的身份向网站发起请求 ### 防范手段 @@ -43,9 +50,9 @@ 设置了 HttpOnly 的 Cookie 可以防止 JavaScript 脚本调用,就无法通过 document.cookie 获取用户 Cookie 信息。 -#### 2. 过滤特殊字符 +#### 2. 转义特殊字符 -例如将 `<` 转义为 `<`,将 `>` 转义为 `>`,从而避免 HTML 和 Jascript 代码的运行。 +在把用户输入的数据输出到页面时进行转义,例如将 `<` 转义为 `<`,将 `>` 转义为 `>`,从而避免 HTML 和 JavaScript 代码的运行。输出到 HTML 标签、属性、JavaScript 代码和 URL 中需要使用不同的转义规则。 富文本编辑器允许用户输入 HTML 代码,就不能简单地将 `<` 等字符进行过滤了,极大地提高了 XSS 攻击的可能性。 @@ -87,6 +94,10 @@ alert(/xss/); > [XSS 过滤在线测试](http://jsxss.com/zh/try.html) +#### 3. 内容安全策略 + +通过 Content-Security-Policy 首部告诉浏览器只允许执行来自指定来源的脚本,禁止内联脚本,即使攻击者注入了代码也不会被执行。 + ## 二、跨站请求伪造 ### 概念 @@ -100,18 +111,18 @@ XSS 利用的是用户对指定网站的信任,CSRF 利用的是网站对用 假如一家银行用以执行转账操作的 URL 地址如下: ``` -http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。 +http://www.examplebank.com/withdraw?account=AccountName&amount=1000&for=PayeeName ``` 那么,一个恶意攻击者可以在另一个网站上放置如下代码: ``` -。 + ``` -如果有账户名为 Alice 的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失 1000 美元。 +如果有账户名为 Alice 的用户访问了恶意站点,而之前刚访问过银行不久,登录信息尚未过期,那么就会损失 1000 美元。 -这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。 +这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。改为 POST 请求也不能解决问题,攻击者可以使用自动提交的表单。 通过例子能够看出,攻击者并不能通过 CSRF 攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。 @@ -125,9 +136,13 @@ Referer 首部字段位于 HTTP 报文中,用于标识请求来源的地址。 #### 2. 添加校验 Token -在访问敏感数据请求时,要求用户浏览器提供不保存在 Cookie 中,并且攻击者无法伪造的数据作为校验。例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。 +在访问敏感数据请求时,要求用户浏览器提供不保存在 Cookie 中,并且攻击者无法伪造的数据作为校验。例如服务器生成随机数并附加在表单中,并要求客户端传回这个随机数。攻击者的网站受同源策略限制,无法读取到这个随机数。 -#### 3. 输入验证码 +#### 3. 设置 Cookie 的 SameSite 属性 + +SameSite=Strict 表示跨站请求不携带 Cookie,Lax 则只允许顶级导航的 GET 请求携带。Chrome 等浏览器的默认值已经是 Lax,上面例子中图片发出的请求不会带上 Cookie。 + +#### 4. 输入验证码 因为 CSRF 攻击是在用户无意识的情况下发生的,所以要求用户输入验证码可以让用户知道自己正在做的操作。 @@ -168,7 +183,7 @@ strSQL = "SELECT * FROM users;" #### 1. 使用参数化查询 -Java 中的 PreparedStatement 是预先编译的 SQL 语句,可以传入适当参数并且多次执行。由于没有拼接的过程,因此可以防止 SQL 注入的发生。 +Java 中的 PreparedStatement 是预先编译的 SQL 语句,可以传入适当参数并且多次执行。SQL 语句的结构在预编译时已经确定,传入的参数只会被当作数据,因此可以防止 SQL 注入的发生。 ```java PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?"); @@ -179,7 +194,11 @@ ResultSet rs = stmt.executeQuery(); #### 2. 单引号转换 -将传入的参数中的单引号转换为连续两个单引号,PHP 中的 Magic quote 可以完成这个功能。 +将传入的参数中的单引号转换为连续两个单引号。PHP 的 Magic Quotes 曾经自动完成这个功能,但是因为不可靠已经被移除,应该使用数据库驱动提供的转义函数,并且只在无法使用参数化查询时使用。 + +#### 3. 最小权限 + +应用连接数据库的账号只授予必要的权限,即使发生注入也无法执行删库等危险操作。 ## 四、拒绝服务攻击 @@ -187,9 +206,23 @@ ResultSet rs = stmt.executeQuery(); 分布式拒绝服务攻击(distributed denial-of-service attack,DDoS),指攻击者使用两个或以上被攻陷的电脑作为“僵尸”向特定的目标发动“拒绝服务”式攻击。 +常见类型: + +- 流量型:用海量数据包耗尽目标的带宽,例如 UDP Flood,以及利用 DNS、NTP 等服务的反射放大攻击; +- 协议型:耗尽服务器的连接资源,例如 SYN Flood 只发送 SYN 报文而不完成三次握手,使服务器维持大量半连接; +- 应用层:发送大量消耗服务器资源的正常请求,例如 HTTP Flood(CC 攻击)。 + +防范手段: + +- 使用 CDN、高防 IP 等服务对流量进行清洗; +- 使用 SYN Cookie 应对 SYN Flood,服务器在握手完成之前不为连接分配资源; +- 在应用层进行限流,并通过验证码区分正常用户和攻击程序。 + ## 参考资料 - [维基百科:跨站脚本](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) +- [OWASP Cross Site Scripting Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html) +- [OWASP Cross-Site Request Forgery Prevention Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html)