加密与安全_三种常见的注入攻击

news2024/9/20 11:06:35

文章目录

  • 概述注入攻击类型及危害
  • 注入攻击的工作原理
    • SQL注入
    • 代码注入
    • XSS(跨站脚本)
  • SQL注入
    • SQ L注入攻击的本质
    • 常见误区及注入点
      • 误区1:SQL注入仅发生在GET请求中
      • 误区2:没有返回数据的接口不易受注入影响
      • 误区3:SQL注入的危害仅限于突破登录
    • SQL注入演示及原理
    • 防御措施 (jdbcTemplate 、 mybatis)
  • 代码注入
    • 示例分析
    • 解决方案
      • 方案一:参数绑定(避免直接拼接)
      • 方案二:使用沙箱环境限制权限
  • XSS 攻击
  • 防御措施与最佳实践
    • 防御SQL注入
    • 防御代码注入
    • 防御XSS攻击

在这里插入图片描述

概述注入攻击类型及危害

注入攻击是指攻击者通过传递恶意数据,将这些数据当作代码在目标系统中执行。这类攻击的本质是数据与代码的边界被打破,导致数据被误执行。常见的注入攻击类型包括:

  • SQL注入(SQL Injection):攻击者通过恶意构造的SQL语句,破坏数据库的正常查询流程,可能获取、修改甚至删除数据库中的敏感数据。
  • 代码注入(Code Injection):外部传入的数据被当作代码执行,导致系统被执行未经授权的指令。
  • 跨站脚本攻击(XSS):攻击者通过注入恶意脚本,使得这些脚本在其他用户的浏览器中执行,从而窃取用户数据或劫持用户会话。

注入攻击的工作原理

SQL注入

  • 原理:攻击者通过输入特殊构造的SQL语句,使其成为数据库查询的一部分,从而控制数据库执行非预期的操作。例如:通过修改查询条件的值来执行恶意SQL命令。
  • 危害:可能导致敏感数据泄露、篡改数据、数据库结构破坏等。

示例:一个简单的SQL查询

SELECT * FROM users WHERE username = 'user' AND password = 'pass';

当攻击者输入' OR '1'='1作为密码时,SQL变为:

SELECT * FROM users WHERE username = 'user' AND password = '' OR '1'='1';

这导致查询总是返回真,从而绕过认证。

代码注入

  • 原理:动态语言环境下,如果将传入的数据误当成代码来执行,黑客就可以传递恶意指令。例如,某些脚本引擎会执行用户传递的计算表达式,若没有严格隔离,可能被恶意利用。
  • 危害:导致服务器执行未经授权的代码,可能控制服务器甚至访问内部数据。

示例

# Python代码注入示例
user_input = "os.system('rm -rf /')"
exec(user_input)  # 直接执行了恶意代码

XSS(跨站脚本)

  • 原理:黑客将恶意脚本嵌入到用户可以输入的字段中(如评论、用户名),这些脚本在被展示时直接在浏览器中执行,从而窃取用户信息或篡改页面内容。
  • 危害:可能导致用户信息泄露、账户劫持、网络钓鱼甚至蠕虫传播。

示例

<!-- 用户输入恶意脚本 -->
<script>alert('Hacked!');</script>

当其他用户访问该页面时,脚本会在他们的浏览器中执行。


SQL注入

SQ L注入攻击的本质

SQL注入攻击利用了应用程序在处理用户输入时的缺陷,将恶意的SQL代码注入到查询中执行。这种攻击不仅限于登录绕过,还包括数据泄露、数据破坏,甚至是服务器控制等恶意行为。

常见误区及注入点

误区1:SQL注入仅发生在GET请求中

SQL注入不仅限于URL参数(GET请求),Post请求体、Cookies、HTTP Headers等任何输入点都可能成为注入攻击的目标。攻击者常用自动化工具而非手动修改URL来执行注入。

误区2:没有返回数据的接口不易受注入影响

即便接口没有返回任何数据,攻击者仍可利用SQL错误信息推测数据库结构。即使没有明显错误,盲注(如布尔盲注、时间盲注)也能逐步获取数据。

误区3:SQL注入的危害仅限于突破登录

SQL注入可用于获取整个数据库数据,修改或删除表结构,甚至执行操作系统命令。其危害远超登录绕过,必须全方位防御。


SQL注入演示及原理

示例:以下代码展示了一个使用JdbcTemplate的接口,通过SQL字符串拼接来进行模糊查询。该接口存在严重的SQL注入风险。

 @PostMapping("jdbcwrong")
    public void jdbcwrong(@RequestParam("name") String name) {
        //curl -X POST http://localhost:45678/sqlinject/jdbcwrong\?name\=test
        //python sqlmap.py -u  http://localhost:45678/sqlinject/jdbcwrong --data name=test --current-db --flush-session
        //python sqlmap.py -u  http://localhost:45678/sqlinject/jdbcwrong --data name=test --tables -D "common_mistakes"
        //python sqlmap.py -u  http://localhost:45678/sqlinject/jdbcwrong --data name=test -D "common_mistakes" -T "userdata" --dump
        log.info("{}", jdbcTemplate.queryForList("SELECT id,name FROM userdata WHERE name LIKE '%" + name + "%'"));
    }

攻击者可以通过sqlmap工具自动化检测该接口,并可以一步步拖库。


防御措施 (jdbcTemplate 、 mybatis)

正确的防护方法:使用参数化查询,避免拼接SQL字符串,让数据库将输入参数作为数据处理,而非代码。例如:

 @PostMapping("jdbcright")
    public void jdbcright(@RequestParam("name") String name) {
        //curl -X POST http://localhost:45678/sqlinject/jdbcright\?name\=test
        log.info("{}", jdbcTemplate.queryForList("SELECT id,name FROM userdata WHERE name LIKE ?", "%" + name + "%"));
    }

对于 MyBatis 来说,同样需要使用参数化的方式来写 SQL 语句。在 MyBatis 中,“#{}”是参数化的方式,“${}”只是占位符替换

在MyBatis中,应避免$,采用#来参数化,并通过函数如CONCAT实现复杂查询:

  @PostMapping("mybatiswrong")
    public List mybatiswrong(@RequestParam("name") String name) {
        //curl -X POST http://localhost:45678/sqlinject/mybatiswrong\?name\=test
        //python sqlmap.py -u  http://localhost:45678/sqlinject/mybatiswrong --data name=test --current-db --flush-session
        return userDataMapper.findByNameWrong(name);
    }

    @PostMapping("mybatisright")
    public List mybatisright(@RequestParam("name") String name) {
        //curl -X POST http://localhost:45678/sqlinject/mybatisright?name\=test
        return userDataMapper.findByNameRight(name);
    }

    @PostMapping("mybatiswrong2")
    public List mybatiswrong2(@RequestParam("names") String names) {
        //curl -X POST http://localhost:45678/sqlinject/mybatiswrong2\?names\=\'test1\',\'test2\'
        //python sqlmap.py -u  http://localhost:45678/sqlinject/mybatiswrong2 --data names="'test1','test2'"
        return userDataMapper.findByNamesWrong(names);
    }

  



	@Mapper
    public interface UserDataMapper {
        @Select("SELECT id,name FROM `userdata` WHERE name LIKE '%${name}%'")
        List<UserData> findByNameWrong(@Param("name") String name);
    
        List<UserData> findByNamesWrong(@Param("names") String names);
    
        @Select("SELECT id,name FROM `userdata` WHERE name LIKE CONCAT('%',#{name},'%')")
        List<UserData> findByNameRight(@Param("name") String name);
    
        List<UserData> findByNamesRight(@Param("names") List<String> names);
    
    }
 

使用“#{}”来参数化name 参数,对于 LIKE 操作可以使用 CONCAT 函数来拼接 % 符号


对于IN语句,使用MyBatis的foreach标签,确保每个元素被正确参数化:

错误示例:

  @PostMapping("mybatiswrong2")
    public List mybatiswrong2(@RequestParam("names") String names) {
        //curl -X POST http://localhost:45678/sqlinject/mybatiswrong2\?names\=\'test1\',\'test2\'
        //python sqlmap.py -u  http://localhost:45678/sqlinject/mybatiswrong2 --data names="'test1','test2'"
        return userDataMapper.findByNamesWrong(names);
    }
 <select id="findByNamesWrong" resultType="javaprogramming.commonmistakes.dataandcode.sqlinject.UserData">
        SELECT id, name
        FROM `userdata`
        WHERE name in (${names})
    </select>

正确示例: 给 MyBatis 传入一个 List,然后使用其 foreach 标签来拼接出 IN 中的内容,并确保 IN 中的每一项都是使用“#{}”来注入参数

  @PostMapping("mybatisright2")
    public List mybatisright2(@RequestParam("names") List<String> names) {
        //curl -X POST http://localhost:45678/sqlinject/mybatisright2\?names\=test1,test2
        return userDataMapper.findByNamesRight(names);
    }
 
   <select id="findByNamesRight" resultType="javaprogramming.commonmistakes.dataandcode.sqlinject.UserData">
       SELECT id,name FROM `userdata` WHERE name in
       <foreach collection="names" item="item" open="(" separator="," close=")">
           #{item}
       </foreach>
   </select>
 

代码注入

在 Web 应用中,动态执行代码是实现复杂逻辑的一种方法,比如通过脚本语言来进行数据验证或规则处理。然而,这种方式也容易导致代码注入漏洞。代码注入漏洞是指外部用户通过特定输入,操纵应用程序的代码执行逻辑,执行恶意代码,甚至危及系统的安全性。

示例分析

以下是一个 Java 代码示例,利用 JavaScript 脚本引擎 ScriptEngine 来动态执行 JavaScript 代码:

private ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
//获得JavaScript脚本引擎
private ScriptEngine jsEngine = scriptEngineManager.getEngineByName("js");

@GetMapping("wrong")
public Object wrong(@RequestParam("name") String name) {
    try {
        // 通过eval动态执行JavaScript脚本,这里name参数通过字符串拼接方式混入JavaScript代码
        return jsEngine.eval(String.format("var name='%s'; name=='admin'?1:0;", name));
    } catch (ScriptException e) {
        e.printStackTrace();
    }
    return null;
}

此代码通过 eval 方法执行了拼接的 JavaScript 代码。传入的 name 参数可以被恶意操纵,例如传入字符串 haha';java.lang.System.exit(0);',这会导致恶意的 Java 代码被执行,如关闭整个应用程序。

解决方案

方案一:参数绑定(避免直接拼接)

解决思路类似 SQL 注入的防御方法,将外部输入当作数据而非代码。使用 SimpleBindings 来安全地传递参数,而不是通过字符串拼接执行代码:

@GetMapping("right")
public Object right(@RequestParam("name") String name) {
    try {
        // 使用参数绑定,避免直接拼接代码
        Map<String, Object> parm = new HashMap<>();
        parm.put("name", name);
        return jsEngine.eval("name=='admin'?1:0;", new SimpleBindings(parm));
    } catch (ScriptException e) {
        e.printStackTrace();
    }
    return null;
}

这种方式能够有效阻止恶意代码被执行,因为用户输入不会直接作为代码执行。

方案二:使用沙箱环境限制权限

通过构建一个沙箱环境来限制代码执行的权限,可以防止恶意代码获取敏感资源或执行系统级操作。这里使用 SecurityManagerAccessControlContext 创建沙箱环境:

@Slf4j
public class ScriptingSandbox {
    private ScriptEngine scriptEngine;
    private AccessControlContext accessControlContext;
    private SecurityManager securityManager;
    private static ThreadLocal<Boolean> needCheck = ThreadLocal.withInitial(() -> false);

    public ScriptingSandbox(ScriptEngine scriptEngine) throws InstantiationException {
        this.scriptEngine = scriptEngine;
        securityManager = new SecurityManager() {
            @Override
            public void checkPermission(Permission perm) {
                if (needCheck.get() && accessControlContext != null) {
                    super.checkPermission(perm, accessControlContext);
                }
            }
        };
        setPermissions(Arrays.asList(
            new RuntimePermission("getProtectionDomain"),
            new PropertyPermission("jdk.internal.lambda.dumpProxyClasses", "read"),
            new RuntimePermission("createClassLoader"),
            new RuntimePermission("accessDeclaredMembers"),
            new ReflectPermission("suppressAccessChecks")
        ));
    }

    public void setPermissions(List<Permission> permissionCollection) {
        Permissions perms = new Permissions();
        if (permissionCollection != null) {
            for (Permission p : permissionCollection) {
                perms.add(p);
            }
        }
        ProtectionDomain domain = new ProtectionDomain(new CodeSource(null, (CodeSigner[]) null), perms);
        accessControlContext = new AccessControlContext(new ProtectionDomain[]{domain});
    }

    public Object eval(final String code) {
        SecurityManager oldSecurityManager = System.getSecurityManager();
        System.setSecurityManager(securityManager);
        needCheck.set(true);
        try {
            return AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
                try {
                    return scriptEngine.eval(code);
                } catch (ScriptException e) {
                    e.printStackTrace();
                }
                return null;
            }, accessControlContext);
        } catch (Exception ex) {
            log.error("抱歉,无法执行脚本 {}", code, ex);
        } finally {
            needCheck.set(false);
            System.setSecurityManager(oldSecurityManager);
        }
        return null;
    }
}

使用示例:

@GetMapping("right2")
public Object right2(@RequestParam("name") String name) throws InstantiationException {
    // 使用沙箱执行脚本
    ScriptingSandbox scriptingSandbox = new ScriptingSandbox(jsEngine);
    return scriptingSandbox.eval(String.format("var name='%s'; name=='admin'?1:0;", name));
}

在这个沙箱环境中,即使传入恶意脚本如 haha';java.lang.System.exit(0);',也无法获得执行权限,会抛出 AccessControlException 异常。

在实际应用中,建议结合使用参数绑定与沙箱环境两种方式来最大程度地确保动态代码执行的安全性。以下是总结建议:

  • 参数绑定:通过 SimpleBindings 方式绑定传入参数,避免代码与数据混合执行。
  • 沙箱环境:使用 SecurityManager 限制脚本的权限,防止未经授权的代码执行。

XSS 攻击


防御措施与最佳实践

防御SQL注入

  • 使用参数化查询或ORM:避免直接将用户输入嵌入到SQL语句中,使用参数化可以将用户输入视为数据而非代码。
  • 输入验证和清理:确保输入的数据符合预期格式。
  • 限制数据库权限:使用最低权限原则,防止应用程序账户有过多的权限。

防御代码注入

  • 严格验证输入:避免直接执行用户输入的内容,尤其是eval、exec等动态执行语法。
  • 使用安全沙箱环境:在受限的环境中执行代码,避免对主系统的影响。

防御XSS攻击

  • 对用户输入进行转义:将用户输入的特殊字符转换为无害的字符,防止执行。
  • 内容安全策略(CSP):通过HTTP头部的CSP指令限制脚本来源。
  • 输入验证和输出编码:对所有的输入进行验证,对输出到HTML的内容进行严格编码。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringSecurity原理解析(八):CSRF防御解析

一、CsrfFilter CsrfFilter 主要功能是用来防止csrf攻击 一、什么是CSRF攻击 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack 或者 session riding&#xff0c;通常缩写为 CSRF 或者 XSRF&#xff0c…

关于广告投放平台的设计

文章目录 广告投放平台的作用广告平台的核心功能 最近在看关于广告投放平台相关的设计&#xff0c;倒是没看到完整的案例介绍。整理一下收集的各种信息&#xff0c;假如需要设计一个广告投放系统&#xff0c;该怎么做&#xff1f; 广告投放平台的作用 要体现广告投放平台的作用…

如何实现LLM的通用function-calling能力?

众所周知&#xff0c;LLM的函数function-calling能力很强悍&#xff0c;解决了大模型与实际业务系统的交互问题。其本质就是函数调用。 从openai官网摘图&#xff1a; 简而言之&#xff1a; LLM起到决策的作用&#xff0c;告知业务系统应该调用什么函数&#xff0c;以及入参是…

动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目

一、介绍 动物识别系统。本项目以Python作为主要编程语言&#xff0c;并基于TensorFlow搭建ResNet50卷积神经网络算法模型&#xff0c;通过收集4种常见的动物图像数据集&#xff08;猫、狗、鸡、马&#xff09;然后进行模型训练&#xff0c;得到一个识别精度较高的模型文件&am…

Android ImageView支持每个角的不同半径

Android ImageView支持每个角的不同半径 import android.annotation.SuppressLint; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; import android.content.res.Resources.NotFoundException; import an…

css 控制虚线刻度尺寸

文章目录 css效果 css <div style"width: 100%; height: 1px;background-image: linear-gradient(to right, #545454 0%, #545454 80%, transparent 5%);background-size: 15px 10px;background-repeat: repeat-x; margin: 0 auto;"></div>效果

W外链如何实现长链接转短链接教程

要实现微信外链的长链接转短连接&#xff0c;可以借助专门的工具来简化流程并增加链接的安全性和稳定性。 以下是一个具体方案&#xff1a; 使用W外链工具 W外链是一款集成了多种功能的微信外链生成器&#xff0c;包括但不限于短链制作、活码生成、微信外链制作等。以下是使用…

设置PDF打开密码

为PDF文件设置打开密码是一种有效的保护措施&#xff0c;它能防止未经授权的用户访问文件内容。以下是一份专业指南&#xff0c;详细介绍如何为PDF文件设置打开密码。 打开pdf编辑器&#xff0c;我们点击工具栏中的【文件】功能&#xff0c;选择里面的【属性】 然后在属性设置…

英飞凌PSoC4000T的GPIO中断示例工程

关于PSoC4000T的初步介绍见:英飞凌MCU第五代高性能CAPSENSE技术PSoC4000T_psoc 4000t-CSDN博客 下面这个工程,在modustoolbox中可编译、下载到开发板、debug调试。 编译时会用到mtb_shared这个库: 已经pdl这个periperal driver library库:

SMS over IP原理

目录 1. 短消息业务的实现方式 2. 传统 CS 短消息业务中的发送与送达报告 3. MAP/CAP 信令常见消息 4. SMS over IP 特点概述 5. SMS over IP 中的主要流程 5.1 短消息注册流程(NR 或 LTE 接入) 5.2 短消息发送(MO)流程(NR 或 LTE 接入) 5.3 短消息接收(MT)流程(NR 或…

国际知名度最高的华人改名大师颜廷利:当代最牛的易经姓名学泰斗

国际知名度最高的华人改名大师颜廷利&#xff1a;当代最牛的易经姓名学泰斗 颜廷利教授&#xff0c;一位在姓名学领域享有盛誉的专家&#xff0c;其声誉根植于齐鲁大地&#xff0c;山东济南历城区唐王镇&#xff08;现升级为历城区唐王街道办事处&#xff09;。他的工作基地不仅…

YOLOv8改进系列,YOLOv8的Neck替换成AFPN(CVPR 2023)

摘要 多尺度特征在物体检测任务中对编码具有尺度变化的物体非常重要。多尺度特征提取的常见策略是采用经典的自上而下和自下而上的特征金字塔网络。然而,这些方法存在特征信息丢失或退化的问题,影响了非相邻层次的融合效果。一种渐进式特征金字塔网络(AFPN),以支持非相邻…

【Git原理与使用】版本管理与分支管理(1)

目录 一、基本操作 1、初识Git 2、Git安装[Linux-centos] 3、Git安装[ Linnx-ubuntu] 4、创建git本地仓库 5、配置Git 6、认识工作区、暂存区、版本库 7、添加文件 8、查看历史提交记录 9、查看.git文件目录结构 10、查看版本库对象的内容 11、小结&#xff08;在本地的.git仓库…

计算机毕业设计 服装生产管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

什么是安全漏洞?最全的漏洞分类!

01 — “ 什么是漏洞**”** 漏洞是指一个系统存在的弱点或缺陷&#xff0c;系统对特定威胁攻击或危险事件的敏感性&#xff0c;或进行攻击的威胁作用的可能性。漏洞可能来自应用软件或操作系统设计时的缺陷或编码时产生的错误&#xff0c;也可能来自业务在交互处理过程中的设…

想要精益生产管理体系早落地,这些工作不能少!

精益生产管理体系是当代社会将企业管理的各种工具方法和理论、技术以及企业文化融为一体的产物。 推行精益生产管理体系时&#xff0c;企业一定要做好以下3个方面的工作&#xff1a; 1.改变观念&#xff0c;从管理层到员工层都必须深入的贯彻实施精益化生产的思想&#xff0c;…

【分享】“可恶”的运算放大器电容负载

他们说如果使用放大器驱动电容负载(图 1、CLOAD)&#xff0c;一个不错的经验是采用一个 50 或 100 欧的电阻器 (RISO) 将放大器与电容器隔开。这个附加电阻器可能会阻止运算放大器振荡。 图 1.支持电容负载的放大器可能需要在放大器输出与负载电容器之间连接一个电阻器。 使用…

Gitlab runner的使用示例(二):Maven + Docker 自动化构建与部署

Gitlab runner的使用示例&#xff08;二&#xff09;&#xff1a;Maven Docker 自动化构建与部署 在本篇文章中&#xff0c;我们将详细解析一个典型的 GitLab CI/CD 配置文件&#xff08;gitlab-ci.yml&#xff09;&#xff0c;该文件主要用于通过 Maven 构建 Java 应用&…

电脑明明切换到了中文输入法,却无法打字出汉字?

现象&#xff1a; 自己电脑桌面右下角的电脑输入法&#xff0c;已经是中文了 解决办法&#xff1a; 按一下键盘最左边的【Caps Lock】键&#xff0c; 电脑左上角会出现如下弹窗&#xff0c; 调整为&#xff1a;CAPS LOCK OFF 即可&#xff08;OFF时&#xff0c;才能打出汉字…

EW内网穿透详解!

EW EW又叫earthworm&#xff0c;是一套便捷式的网络穿透工具&#xff0c;具有socks5服务架构和端口转发两大核心功能&#xff0c;可以在复杂的网络环境下完成网络穿透。该工具能以"正向"&#xff0c;"反向"&#xff0c;"多级级联"等方式打通一条…