互联网安全架构之常见的Web攻击手段及解决办法

一.Web 安全常见攻击手段

  XSS(跨站脚本攻击)

  SQL 注入

  CSRF(跨站请求伪造)

  上传漏洞

  DDoS(分布式拒绝服务攻击)等

二.攻击手段原理及解决方案

  1.XSS攻击

    原理:XSS 攻击是页面被注入了恶意的代码,而浏览器执行了恶意的代码。

    分类:反射型XSS,DOM型XSS,以及存储型XSS

    简单案例

      新建一个Spring Boot项目,添加Thymeleaf模块和web模块,编写两个非常简单的html如下图

      

      

      再编写一个控制器

@Controller
public class Mycontroller {
    @RequestMapping("/test1")
    public String test1(){
        return "test1";
    }
    @RequestMapping("/test2")
    public String test2(){
        return "test2";
    }
    @RequestMapping("/testServlet")
    public String myServlet(HttpServletRequest request , HttpServletResponse response){
        String str = request.getParameter("name");
        request.setAttribute("name",str);
        try {
            request.getRequestDispatcher("test2").forward(request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "test2";
    }

      用火狐浏览器打开(注意:谷歌浏览器默认禁止了script提交,会将网页拦截)

       

      点击提交后,页面弹出了弹出框,而没有在页面中显示数据

      

    危害

      上面案例只是测试,在实际中,恶意的XSS攻击往往还会:

        窃取客户端Cookies或进行钓鱼欺骗

        控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力

        盗窃企业重要的具有商业价值的资料

        强制发送电子邮件

        控制受害者机器向其它网站发起攻击等

    解决方案

      1.对用户输入的信息进行处理,将HTML代码进行转义等。例如模板引擎自带的转义,将上述test2页面中

th:utext="${name}"

      改为

th:text="${name}"

      或者自己编写一个工具类,例如

//html标签转义成自定义字符
function htmlEscape(sHtml) { 
    return sHtml.replace(/[<>&"]/g,function(c){
        return {'<':'&lt;','>':'&gt;','&':'&amp;','"':'&quot;'}[c];
    }); 
}

      2.使用 UTF-8 为默认的字符编码以及设置 content 为 text/html 等。

      3.对重要的cookie设置httpOnly, 防止客户端通过document.cookie读取cookie。

      4.创建参数拦截filter类过滤器,对每次的请求拦截,将数据转义后再进数据库中。

      ......

  2.SQL注入

    原理:将一些特殊的参数输入到后台,而这些输入大都是SQL语法里的一些组合,执行这些恶意的输入会导致非法数据侵入数据库或取出非法的数据。

    案例:select count(1) from test where id = xxx or 1 = 1  本来只需要统计id为xxx的数据的个数,但是后面的1 = 1永远为true,导致该查询语句会查询所有的id。

    危害

      数据库信息泄漏:数据库中存放的用户的隐私信息的泄露

      网页篡改:通过操作数据库对特定网页进行篡改

      网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击

      数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改

      服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统

      破坏硬盘数据,瘫痪全系统等

    解决方案

      1.检查用户输入的合法性,尽量的限制用户输入特殊的符号,确信输入的内容只包含合法的数据。

      2.使用过滤(对关键字符进行转义)与编码统一,并使用参数化的sql语句。

      3.使用预编译等较安全的方式,例如PreparedStatement。

      4.使用加密方式加密输入的数据,使加密后的数据与数据库中的数据进行比较。

  3.CSRF攻击

    原理:(用如下案例解释)

      1. 用户打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;

      2.在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;

      3. 用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;

      4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问网站A;

      5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户的Cookie信息和权限处理该请求,导致来自网站B的恶意代码被执行。 

    解决方案:(这里有多个方案)

      方案一.验证 HTTP Referer 字段

        根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址,若来源地址的不对,则拒绝请求。(这种方式存在一些问题,详情可以参考IBM中对CSRF的一些描述,具体链接

      方案二.使用验证码

        每一个重要的post提交页面,使用一个验证码,因为第三方网站是无法获得验证码的。还有使用手机验证码,比如转账是使用的手机验证码。

      方案三.在请求地址中添加 token 并验证

        CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

      方案四.在 HTTP 头中自定义属性并验证

        这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。

      上面各种解决方案各有优势,也都有各自的缺陷。因此,实际情况中应选择最合适的策略,这样才能把 CSRF 的危害降到最低。

  4.文件上传漏洞

    原理:Web程序没有对上传文件的格式进行严格过滤 , 还有一部分是攻击者通过 Web服务器的解析漏洞来突破Web应用程序的防护,导致恶意的可执行的脚本文件(病毒、木马等)被上传,并获得了执行服务端命令的权限。

    案例:这里我看了他人的一遍博客https://www.cnblogs.com/yuxiaole/p/9293472.html,非常简单直观。

    危害:攻击者甚至能够获取服务端的部分控制权,危害非常大。

    解决方案

      1.在前端和后台都要限制文件上传类型,例如在前端中做如下限制

#前端脚本检测,只允许上传 .jpg格式的文件
<script type="text/javascript">
    function selectFile(fnUpload) {
        var filename = fnUpload.value; 
        var mime = filename.toLowerCase().substr(filename.lastIndexOf(".")); 
        if(mime!=".jpg") 
        { 
            alert("请选择jpg格式的照片上传"); 
            fnUpload.outerHTML=fnUpload.outerHTML; 
        }
    }
</script>

      2.对上传的文件在服务器上存储时进行重命名

      3.检查上传文件的类型和大小

      4.上传文件要保存的文件名和目录名由系统根据时间生成,不允许用户自定义,并且文件权限应该定义好

  5.DDoS攻击

    原理:借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,由于每个计算机中的程序都将通过向目标发送请求并要获取响应,过多的请求可能会导致目标服务器或网络溢出容量,从而导致对其他正常流量的拒绝服务。

    解决方案

      1.部署负载均衡

      2.尽量避免 NAT 的使用

      3.充足的网络带宽保证

      4.把网站做成静态页面

      5.做备份网站

      6.配置硬件防火墙等

      ......

猜你喜欢

转载自www.cnblogs.com/ywb-articles/p/10825408.html