美文网首页
web安全。 简述SQL注入、XSS、CSRF

web安全。 简述SQL注入、XSS、CSRF

作者: 七六丶 | 来源:发表于2018-09-19 15:59 被阅读0次

    SQL注入

    SQL注入攻击就是攻击者把SQL语句写入到表单的输入框或者页面get请求的查询字符串,来达到欺骗服务器去执行写入的SQL语句命令。
    SQL语句能绕过防火墙直接访问数据库。
    SQL注入实现
    比如简单的用户登录查询

    SELECT * FROM users WHERE username = 'abc' AND password = '123'
    

    服务端代码(node)

    const SQL = `SELECT * FROM user WHERE username = '${username}' AND password = '${passwpord}'`
    

    表单输入

    username = ' or 1=1
    password = angthing
    

    实际的查询代码

    SELECT * FROM users WHERE username = ''or1=1 AND password = 'anything'
    

    或者去通过url的get请求去发起
    比如url带有查询字符串(例如,?id=123),向这个网站发起请求,改变其中的id参数, 使它带一个额外的单引号(?id=123') ,可以查看返回信息得知这个网站是否可以被SQL注入。
    SQL注入防范方法(node-mysql)

    1. 使用escape()对传入参数进行编码:

    mysql.escape(param)
    connection.escape(param)
    pool.escape(param)

    1. 使用connection.query()的查询参数占位符
      可使用 ? 做为查询参数占位符。在使用查询参数占位符时,在其内部自动调用 connection.escape() 方法对传入参数进行编码。
      例如:
    
    var userId = 1, name = 'test';
    var query = connection.query('SELECT * FROM users WHERE id = ?, name = ?', [userId, name], function(err, results) {
       // ...
    });
    console.log(query.sql); // SELECT * FROM users WHERE id = 1, name = 'test'
    
    1. 使用mysql.format()转义参数
      准备查询,该函数会选择合适的转义方法转义参数 mysql.format()用于准备查询语句,该函数会自动的选择合适的方法转义参数。
      例如:
    var userId = 1;
    var sql = "SELECT * FROM ?? WHERE ?? = ?";
    var inserts = ['users', 'id', userId];
    sql = mysql.format(sql, inserts); // SELECT * FROM users WHERE id = 1
    
    1. 也可以通过正则或者字符串筛选来对输入内容的验证

    XSS(跨站脚本攻击)

    XSS指的是跨站脚本攻击,是web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本,当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。比如获取用户的cookie通过ajax发送到攻击者的服务器,导航到恶意网站等。

    XSS攻击原理
    分类:
    反射型

    注入脚本从网站服务器被反弹回来,比如错误消息、搜索结果、或者任何其他响应(这些响应完全或部分包含了用户在浏览器输入的内容)。反射型攻击通过其他途径传递到受害者,比如邮件、或其他网站。当用户被引诱点击恶意链接,提交一个特别构造的表单、或浏览一个恶意站点,注入脚本传送到了脆弱站点并反射给用户的浏览器,浏览器认为该链接来自一个可信的服务器就执行了它。反射型XSS也称为非持久型。

    简单的举个栗子:
    html

    <textarea id='text'/>
    <button type='button' id='btn'></button>
    <script>
      const btn = document.queryselector('#btn')
      const text = document.queryselector('#text')
      btn.addEventListener('click', async () => {
          try{
              const result = await axios.get(`/test?test=${text.value}`)
              const { success, text } = result
              if(success){
                    document.body.insertAdjacentHTML('beforeend', text)
              }
          }catch(e){
              //
          }
      })
    </script>
    

    express

    const express = require('express')
    const router = express.Router()
    
    router.get('/test', (req, res, next) => {
     //
     res.json({
       success:true,
       test:req.query.test
     })
    })
    

    现在我们通过文本框添加一段代码

    <img src="null" onerror='alert(document.cookie)' />
    

    通过click事件, 把这段代码提交到服务端,并进行了相应,就会获得到用户的cookie。
    实际上我们只是进行了模拟攻击。如果是攻击者的话,会注入一段第三方的js代码(各种编码形式的unicode编码,html十进制、十六进制编码),然后将获取到的cookie储存到他们的服务器上,这样的话攻击者就可以拿身份认证做一些有害于我们的事情了。

    <img src="x" onerror="\u0061\u006c\u0065\u0072\u0074('js-unicode-encoded')">
    <img src="x" onerror="alert(1)">
     <img src="x" onerror="&#x61&#x6c&#x65&#x72&#x74&#x28&#x27&#x68&#x74&#x6d&#x6c&#x7f16&#x7801&#x27&#x29">
    

    储存型

    存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了

    最典型的就是留言板XSS。用户提交了一条包含XSS代码的留言到数据库。当目标用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了。
    DOM XSS

    DOM XSS攻击不同于反射型XSS和存储型XSS,DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的DOM解析。这完全是客户端的事情。

    DOM XSS代码的攻击发生的可能在于我们编写JS代码造成的。我们知道eval语句有一个作用是将一段字符串转换为真正的JS语句,因此在JS中使用eval是很危险的事情,容易造成XSS攻击。避免使用eval语句。
    再举下🌰:

    test.addEventListener('click',  () => {
      const node = window.eval(txt.value)
      window.alert(node)
    }, false)
    
    //txt中的代码如下
    <img src='null' onerror='alert(123)' />
    

    通过eval语句就造成了XSS攻击。

    XSS危害

    1. 盗取cookie
      通过XSS攻击,由于注入代码是在被攻击者客户端执行的,因此盗取到cookie信息,从而冒充被攻击者。
      2.钓鱼攻击
      所谓钓鱼攻击就是构建一个钓鱼页面,诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击。

    XSS预防
    1.输入过滤
    对用户输入的内容进行检测, 比如<、>、/ 等可能导致脚本注入的特殊字符,或者过滤 script 、javasript 等脚本关键字。同时我们也要验证16进制的字符。 只要对每个输入点进行验证,保证对所有用户的输入进行检测,就能有效的阻止XSS攻击。
    2.输出编码
    对输出的内容进行编码和解码,就能保证所有的都是当做文本来进行处理。
    3.cookie加密
    对于cookie来说, 尽量的不去存储敏感信息,如用户名,密码等。其次我们对其进行MD5加密之后再进行算法的处理,来截取cookie来达到加密效果,或者也可以和ip进行绑定。

    CSRF

    跨站请求伪造

    你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。
    原理  
    网站A :为恶意网站。
    网站B :用户已登录的网站。
    当用户访问 A站 时,A站 私自访问 B站 的操作链接,模拟用户操作。
    假设B站有一个删除评论的链接:http://b.com/comment/?type=delete&id=81723
    A站 直接访问该链接,就能删除用户在 B站 的评论。
    CSRF防御
    1.验证码
    一些关键的操作都可以伴随着验证码的确认。
    2.token
    CSRF能被攻击成功,根本原因是所有的参数都被攻击者猜到。
    既然知道原因,那我们可以对症下药。每次请求都携带着token去服务器和session进行验证。

    相关文章

      网友评论

          本文标题:web安全。 简述SQL注入、XSS、CSRF

          本文链接:https://www.haomeiwen.com/subject/vaiogftx.html