安全研究所 | 突破语义分析的黑魔法

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 当下,语义分析算法因其轻规则、低误漏报、更贴合业务场景等优势被广泛应用于各类型的安全防护产品中,并取得了较好的效果,但现阶段依旧存在一些方法能够有效突破传统语义分析防护,本文会介绍部分SQL注入场景下突破语义分析算法的黑魔法。

引言

当下,语义分析算法因其轻规则、低误漏报、更贴合业务场景等优势被广泛应用于各类型的安全防护产品中,并取得了较好的效果,但现阶段依旧存在一些方法能够有效突破传统语义分析防护,本文会介绍部分SQL注入场景下突破语义分析算法的黑魔法。

语义\词法分析概述

词法分析

现阶段,SQL注入的词法分析主流分为两类:

基于弱规则词法黑名单

基于词法Token变化

其中基于弱规则词法黑名单的算法被用于大家熟知的Libinjection,主要通过将用户的输入进行Token化,然后再去匹配一份维护好了的SQL注入黑名单规则库,从而有效发现SQL注入问题。

其中各种输入对应词法如下:

7ea0b3a71481403af61ea458debdeed7.png

检测SQL注入的流程如下:

e1fefdb676845170ee69e1f8f0c83f38.png

而基于Token变化的检测算法,规则比上述算法更弱,只需计算用户的输入是否横跨了多个Token,如果横跨了多个Token则判断为存在SQL注入。

706ce6fb10f53736ee6160c04ef8bc91.png

语义分析

和词法分析相比,语义分析会做的更加细致,它不仅仅关注SQL的Token,更会去关注用户的输入对具体的SQL结构造成了怎样的改变,这样能够更大程度的解决词法分析仅仅基于Token造成的误报问题。

c56e3c1386e171cf4b86539ede7a484b.png

当用户输入会导致SQL整体语义发生变化,往往会被语义分析判定为SQL注入。

b9ef26d74b9c651dae5378d137ad4f17.png

对于一些运行时安全防护产品而言,由于运行在应用中,可以直接获取到完整的SQL语句,语义分析的准确率往往较高,而对于传统流量型安全防护产品而言,由于只能获取到流量中的用户输入参数,无法知道真实运行的SQL语句是什么样的,就需要额外的工作,大体分为两类:

SQL片段分析:

需要基于 Context Free Grammer ,最大的挑战是时间复杂度和准确率。

构造完整的SQL语句:

主流安全产品会假设用户输入参数为数字型、字符型两种场景,将参数拼接到简化的SQL语句中构成完整的SQL语句,进而进行语义分析。但很多时候会出现关键字拼接参数(如IN、GROUP BY、ORDER BY等)的场景,这种情况下语义分析准确率就会下降,而如果尽可能的穷举了用户参数的拼接场景,则会造成性能的不可控。

绕过思路

预期外的SQL特性

原理

语义分析会面临的一个最大的难题就是:虽然大部分的数据库语法都比较相似,但不同数据库之间又都有自己独有的一些特性在里面,这样如果攻击者对某一款数据库足够了解,就可能通过一些特殊的SQL特性进行SQL注入,而语义分析之前又未能兼容该特性,从而导致语义分析引擎报错,失去检测能力。

巧用ODBC

ODBC是一个大部分SQL都支持的特性,官方介绍如下:

{identifier expr} is ODBC escape syntax and is accepted for ODBC compatibility. The value is expr. The { and } curly braces in the syntax should be written literally; they are not metasyntax as used elsewhere in syntax descriptions.

由于ODBC本身的自由性,可以构造出很多非常复杂的SQL语句,从而导致语义分析很难进行识别。

627080b7bc11179728a2ec7f3dd37c00.png

psql并不认识转义字符

几乎大部分主流语义分析引擎、主流数据库都将 \ 理解为转义字符,但PSQL并不这么理解,对 \ 理解上的差异使得绕过PSQL变得十分容易。

4adf4debd8e3c230b7cddc6b35b2c2c5.png

神奇的科学计数法

科学符号,特别是 e 符号,已被集成到包括 SQL 在内的许多编程语言中。目前还不清楚这是否是所有 SQL 实现的一部分,但它是 MySQL/MariaDB 实现的一部分。当e符号在无效的上下文中使用的时候,并不会导致SQL报错,而是会被SQL自行忽略,这就导致了SQL注入时的Payload可以通过大量无效科学符号来影响语义分析引擎对SQL语句的解析。

select last_name from students where student_id = '1' union select concat 5.e(1.e(flag 10.2e)3.e,'*'6.e) from test 1.e.flag--

注释欺骗的艺术

原理

大部分语义分析往往都是能够识别出注释,并在分析时省略注释后面语句的分析,从而实现更好的性能,那么如果攻击者能够成功构造出语义分析引擎认为是注释而实际数据库并不认为是注释的特殊关键字,再把攻击的Payload隐藏在注释之后,就能成功欺骗语义分析,光明正大的进行SQL注入。

万能注释 //

存在不少语义分析引擎,在解析数据流的时候,会将 // 作为注释处理,忽视后面的内容,而大部分主流数据库,并不将 // 作为注释。

54fc329fe9701f5252a11ef7555b07d2.png

注释结束符的差别

语义分析引擎 往往认为 \r \n 都是注释的结束符,但很多数据库(MYSQL\ORACLE等)只认 为 \n 是注释结束符,利用注释结束符理解的差异可以构造绕过。

bdfb58baf2221beb868e311903f5e062.png

mybatis眼中的#

JAVA的mybatis框架会对用户输入的参数做一些特殊的处理,尤其针对形如 #{param} 这种写法的数据的额外处理,会对语义分析造 成极强的欺骗性。

9bba4e6c148ae20c23f25c0fdd354db2.png

b042865bcdaf8c523854556c39b47e20.png

巧用特殊关键字

原理

除去让很多开发、安全人员熟知的关键字外,不少数据库也拥有一些较为冷门的关键字,这些关键字在语义分析或词法分析时很可能未能兼容,从而导致防护失效。因此,寻找冷门且有效的关键字也是绕过语义分析引擎的一种有效手段,尤其是针对新版本的数据库,往往会出现一些新的关键字,这些关键字极有可能未被兼容。

handle替代select

MySQL 除了可以使用 select 查询表中的数据,也可使用 handler 语句,这条语句使我们能够一行一行的浏览一个表中的数据。它是 MySQL专用的语句,并没有包含到SQL标准中。handler 语句由于可以查询数据,因此也是SQL注入中一个十分方便且鲜为人知的关键字。

SELECT * FROM students WHERE stuname = 'glassy';Handler flag OPEN;Handler flag read first;Handler flag close;#

MEMBER OF函数

MEMBER OF()是一个MySQL8高版本特性,官方定义它是一个函数,但是这个函数的函数名中间还包含空格,十分具有欺骗性,虽然它对于注出数据并没有什么帮助,但是放在注入Payload的前段以促使语义分析引擎解析失败报错却是一个很不错的选择。

SELECT last_name FROM students WHERE student_id = '1' and (select substr((SELECT flag from flag), 1, 1) MEMBER OF('["a","b","t"]'))=1;

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
7
分享
相关文章
陶哲轩神预言!Transformer破解百年三体难题,凭数学直觉找到李雅普诺夫函数
在AI领域,语言模型处理复杂数学问题的能力一直受限。最近,由François Charton领导的团队利用Transformer模型成功解决了寻找李雅普诺夫函数这一百年难题,显著提升了动态系统的全局稳定性分析能力。该方法通过生成随机动态系统及其李雅普诺夫函数作为训练数据,使模型学会了从系统到函数的映射,不仅超越了传统算法和人类数学家的表现,还为解决其他数学难题开辟了新路径。
95 3
|
9月前
|
代码的诗意:从技术感悟到生活哲学
【8月更文挑战第30天】在数字世界的编织中,每一行代码都是诗行的缩影,承载着逻辑与情感的双重奏。本文将带领读者穿梭于技术的细节与生活的广阔之间,探索编程之美如何映照人生的哲理。从简单的算法到复杂的系统设计,我们将发现,代码不仅仅是冷冰冰的指令集合,它也能如诗般流淌,讲述着创造与和谐的故事。让我们一起走进代码的世界,解锁那些隐藏在键盘敲击声中的深刻启示。
|
11月前
|
Java关键字:不只是简单的词汇,更是编程的“魔法咒语”!
【6月更文挑战第15天】Java关键字是编程的基石,如"class"定义类,"new"创建对象,"if/else"控制流程,"for/while"实现循环,"public/private"设置访问权限。示例展示了如何使用这些关键字来定义类、条件判断和循环,强调掌握关键字对提升代码效率至关重要。
109 14
NASA揭示迄今为止太阳系中最遥远天体,形似“雪人”的密接双星体
NASA揭示迄今为止太阳系中最遥远天体,形似“雪人”的密接双星体
222 0
《数学与泛型编程:高效编程的奥秘》一3.5 毕达哥拉斯学派的构想
本节书摘来自华章出版社《数学与泛型编程:高效编程的奥秘》一 书中的第3章,第3.5节,作者:丹尼尔E.罗斯(Daniel E. Rose),更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1203 0

云原生

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等