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,一般出现漏洞需要注意:
-
是否禁止dtd或者entity
-
参数是否可控
-
传入参数格式为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(#换成@)