9、预防常见注入类问题的安全设计

2024-05-09 631 0

1、常见问题

1.1、sql注入

也称SQL注入或SQL注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的SQL指令而执行,因此遭到破坏或是入侵。

1.2、NoSql注入

NoSQL是一个广义术语,用于指代不使用 SQL 查询语言的非关系数据库/数据存储系统。一些示例包括 MongoDB、Cassandra DB、CouchDB 和 Riak。将恶意负载注入非 SQL 数据库(例如 MongoDB)的网络攻击称为 NoSQL 注入。
SQL 注入是在查询(尤其是来自用户的查询)未经过清理时引起的,允许攻击者修改数据库引擎以包含在数据库中执行命令的恶意输入。但是,SQLi 不能在非 SQL 数据库上执行,因为它们没有特定的语言。它们具有特定于产品的语法和查询语法,这些语法和查询语法是用应用程序语言本身编写的。NoSQL 数据库不仅可以被攻击者破坏,而且恶意代码/未经验证的输入可以在应用程序本身中执行。因此,DDoS 攻击可以被精心策划,或者服务器被接管或攻击者利用非 SQL 注入漏洞泄露机密用户信息。
MongoDB Server 支持 JavaScript,这使得在数据引擎进行复杂事务和查询成为可能,但是传递恶意的用户输入到这些查询中可以注入任意的 JavaScript 代码,导致非法的数据获取或篡改。其他Nosql数据也存在相同的情况

1.3、xss

任何未能对包含脚本代码(通常是JavaScript)的用户输入进行清理的web应用程序都可能容易受到跨站脚本攻击(XSS)。要利用XSS漏洞,攻击者提供一个包含恶意代码的文本字符串,例如将其作为用户ID参数放在URL中。攻击有效负载随后由受害者的浏览器执行,而不是作为常规参数值处理。
XSS攻击可能会产生严重的后果,从将用户重定向到恶意站点,到窃取会话cookie和劫持用户会话。虽然用户输入过滤可以在一定程度上降低成功攻击的风险,但有许多方法可以规避XSS过滤器,因此编写安全代码比较稳妥。

1.4、命令注入

Web 应用程序有时可能需要在底层操作系统中执行系统命令。如果应用程序存在命令注入漏洞,攻击者可以在用户输入中提供自己的操作系统命令。成功的命令注入(又名 shell 注入)可能非常危险,因为它可以让攻击者获取有关操作系统和服务器配置的信息,升级他们的权限,甚至执行任意系统命令以完全破坏系统。
防范胜于治疗,因此最好避免从 Web 应用程序调用系统命令。当需要执行系统命令时,仔细验证用户输入并通过白名单严格进行限制。

1.5、XXE注入

最后一个是XML外部实体 (XXE) 注入。如果应用程序接受XML输入并配置为支持具有弱XML解析器安全性的遗留文档类型定义 (DTD),则攻击者可以向其发送特制的 XML文档,以执行从路径遍历到服务器端请求伪造 (SSRF)和远程代码执行。
该注入攻击不会利用未经验证的用户输入,而是利用 XML 解析器中固有的不安全遗留功能,因此可能特别危险。如果应用程序处理XML文档,避免此漏洞的方法是禁用对dtd的支持,或者至少禁用对外部实体的支持。

2、安全设计

2.1、预编译解决sql注入

SQL注入是因为解释器将传入的数据当成命令执行而导致的,预编译是用于解决这个问题的一种方法。和普通的执行流程不同,预编译将一次查询通过两次交互完成,第一次交互发送查询语句的模板,由后端的SQL引擎进行解析为AST或Opcode,第二次交互发送数据,代入AST或Opcode中执行。因为此时语法解析已经完成,所以不会再出现混淆数据和代码的过程。

为了防止低版本数据库不支持预编译的情况,模拟预编译会在客户端内部模拟参数绑定的过程,进行自定义的转义。

预编译只是使用占位符替代的字段值的部分,如果第一次交互传入的命令使用了字符串拼接,使得命令是攻击者可控的,那么预编译不会生效。

在有的情况下,数据库处理引擎会检查数据表和数据列是否存在,因此数据表名和列名不能被占位符所替代。这种情况下如果表名和列名可控,则可能引入漏洞。

部分语言引擎在实现上存在一定问题,可能会存在绕过漏洞。

==Myabtis==

  • #{}对应的内容会作为 SQL 参数的一部分通过 PreparedStatement.setXXX装入请求;

  • ${}对应的内容会直接作为 SQL 模板的一部分,而不会视为独立的请求参数;

Mybatis用 #{}而不是 ${}可以防止 SQL 注入。

==mysql==
当我们通过 JDBC 使用 PreparedStatement执行预编译 SQL 的时候,此处的预编译实际上是假的预编译,PreparedStatement只是在设置参数的时候自动做了一层转义,最终提交给数据库执行的 SQL 仍然是单条的非预编译 SQL。

而当我们通过在驱动 url 上开启 useServerPrepStmts配置后,预编译就会真正的生效,驱动包发往数据库的请求就会分成带占位符的 SQL 模板和参数,到了数据库再由数据库完成格式化并执行。

2.2、XSS工具

==HTML过滤工具==
使用一些白名单或者黑名单来过滤用户输入的HTML,以实现过滤的效果。例如DOMPurify等工具都是用该方式实现了XSS的保护。

==X-Frame-Options 响应头有三个可选的值==

  • DENY:页面不能被嵌入到任何iframe或frame中

  • SAMEORIGIN:页面只能被本站页面嵌入到iframe或者frame中

  • ALLOW-FROM:页面允许frame或frame加载

==xss头==
基于 Webkit 内核的浏览器(比如Chrome)在特定版本范围内有一个名为XSS auditor的防护机制,如果浏览器检测到了含有恶意代码的输入被呈现在HTML文档中,那么这段呈现的恶意代码要么被删除,要么被转义,恶意代码不会被正常的渲染出来。

而浏览器是否要拦截这段恶意代码取决于浏览器的XSS防护设置。

要设置浏览器的防护机制,则可使用X-XSS-Protection字段 该字段有三个可选的值

  • 0: 表示关闭浏览器的XSS防护机制

  • 1: 删除检测到的恶意代码, 如果响应报文中没有看到 X-XSS-Protection 字段,那么浏览器就认为X-XSS-Protection配置为1,这是浏览器的默认设置

  • 1; mode=block: 如果检测到恶意代码,在不渲染恶意代码

2.3、命令注入

  • 不使用时禁用相应函数

  • 尽量不要执行外部的应用程序或命令

  • 转义命令中的所有shell元字符

    • shell元字符包括 #&;`,|*?~<>^()[]{}$\

2.4、XXE防御

Java XXE漏洞的修复或预防主要在设置禁止dtd,一般出现漏洞需要注意:

  1. 是否禁止dtd或者entity

  2. 参数是否可控

  3. 传入参数格式为REST XML格式,X-RequestEntity-ContentType: application/xml
    支持的协议列表

libxml2 PHP Java .NET
file
http
ftp
file
http
ftp
php
compress.zlib
compress.bzlip2
data
glob
phar
file
http
https
ftp
jar
netdoc
mailto
gopher
file
http
https
ftp

3、校验伪代码

MyBatis

select user_id,user_name from t_user where user_id = #{user_id}

MyBaits会首先对其进行预编译,将#{user_ids}替换成?占位符,然后在执行时替换成实际传入的user_id值,并在两边加上单引号,以字符串方式处理。下面是MyBatis执行日志:

10:27:20.247 [main] DEBUG william.mybatis.quickstart.mapper.UserMapper.selectById - ==>  Preparing: select id, user_name from t_user where id = ? 
10:27:20.285 [main] DEBUG william.mybatis.quickstart.mapper.UserMapper.selectById - ==> Parameters: 1(Long)

因为"#{}"会在传入的值两端加上单引号,所以可以很大程度上防止SQL注入。有关SQL注入的知识会在后文进行说明。因此在大多数情况下,建议使用"#{}"。

XSS

<script type="text/javascript" src="https://www.freebuf.com/articles/web/dist/purify.min.js"></script>

可以通过执行以下代码来清理字符串:

const clean = DOMPurify.sanitize(dirty);

详见
https://github.com/cure53/DOMPurify

命令注入

Java执行系统命令有两个方式,ProcessBuilder和Runtime exec。

这两种执行命令方式基本使用情况如下

ProcessBuilder builder = new ProcessBuilder(cmdList);
builder.redirectErrorStream(true);
Process process = builder.start();
Runtime.getRuntime().exec(cmdList);

避免使用相关函数

XXE注入

DocumentBuilderFactory dbf =DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
.setFeature("http://apache.org/xml/features/disallow-doctype-decl",true);
.setFeature("http://xml.org/sax/features/external-general-entities",false)
.setFeature("http://xml.org/sax/features/external-parameter-entities",false);

过滤关键词:

<!DOCTYPE、<!ENTITY SYSTEM、PUBLIC

4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

webpack打包站点,js文件名批量获取思路
加密对抗靶场enctypt——labs通关
【论文速读】| 注意力是实现基于大语言模型的代码漏洞定位的关键
蓝队技术——Sysmon识别检测宏病毒
内网渗透学习|powershell上线cs
LLM attack中的API调用安全问题及靶场实践

发布评论