0x0 宽字节注入
注入原理
- 宽字节SQL注入是一种SQL注入攻击的变种,利用应用程序在处理Unicode编码字符时的漏洞来执行恶意的SQL查询。在传统的SQL注入攻击中,黑客试图通过向应用程序提交恶意构造的SQL语句来利用应用程序的漏洞,从而获取敏感信息或对数据库进行修改。而宽字节SQL注入则利用Unicode编码字符的特性,可以更有效地绕过输入验证和过滤,对数据库进行攻击。
- 在Unicode编码下,一个字符可以由多个字节组成,与ASCII编码每个字符一个字节的不同。
对于UTF-8编码来说,常见的汉字或特殊符号可能会使用多个字节表示 。攻击者利用这个特性,在向应用程序提交数据时,插入特殊构造的Unicode字符,比如%00(空字节字符),它的ASCII编码为0x00。因为数据库解释这种宽字节字符的方式与普通ASCII字符不同,攻击者可以通过插入这些特殊的宽字节字符来混淆和修改SQL查询的结构,绕过应用程序过滤机制,而实施恶意操作 。 - 防止宽字节SQL注入的方法包括:合适的输入验证和过滤,避免直接拼接用户输入到SQL查询语句中;使用参数化查询和预编译语句来构造SQL查询,这样数据库会将输入的参数视为数据而非代码,避免恶意注入攻击。对于开发者和系统管理员来说,了解并及时修复这种漏洞是确保应用程序和数据库安全的重要步骤。
注入方法
- 一个字符占1个字节,两个字节以上叫宽字节
- 设置“set character_set_client:=gbk”(gbk编码设置),通常导致编码转换的注入问题,尤其是使用php连接mysql数据库的时候
- 一个gbk汉字占两个字节,取值范围是(编码位数):第一个字节为129-254,第二个字节为64-254
当设置gbk编码后,遇到连续两个字节,都符合gbk取值范围,会自动解析为一个汉字
黑盒
- 在注入点后键入%df,然后按照正常的注入流程开始注入
- 注意:前一个字符的ascii码要大于128,两个字符才能组合成汉字
白盒
- 查看MySSQL 编码是否为GBK格式
- 是否使用了 preg_replace() 函数把单引号替换成’
- 是否使用了 addslashes() 函数进行转义
- 是否使用了 mysql_real_escape_string() 函数进行转义
0x1 HTTP 头注入
HTTP头注入是一种攻击技术,可以利用未正确过滤或验证的用户输入来在HTTP请求或响应的头部中注入恶意内容,从而导致安全漏洞。这种攻击通常涉及修改HTTP头部中的字段值,比如Cookie、User-Agent、Referer等,以误导服务器或客户端执行意外或恶意的操作。详细原理包括:
- 识别注入点:攻击者首先需要确定哪些地方可以注入恶意内容。通常是在HTTP请求或响应中的头部字段,如User-Agent、Referer、Cookie等。
- 构造恶意注入:攻击者通过在可以注入的头部字段中插入特殊字符、换行符或其他无效控制字符来构造恶意内容。这可能包括恶意脚本、重定向指令或其他恶意指令。
- 利用漏洞:一旦恶意内容成功注入到HTTP头部中,服务器端或客户端在处理该HTTP头部时可能会误解原始数据或执行意外操作。这可能导致信息泄露、跨站脚本(XSS)攻击、HTTP劫持等安全问题。
- 攻击手段:利用HTTP头注入,攻击者可以实施多种攻击,如篡改Cookie实现会话劫持、重定向用户到恶意网站、欺骗用户信息、执行恶意脚本等。
- 防范措施:防范HTTP头注入的关键是加强输入验证和过滤,确保用户输入不会对HTTP头部产生任何意外影响。此外,开发人员应该遵循安全编程实践,避免直接使用用户输入构造HTTP头部,而是通过安全的方式处理和输出用户数据。应用安全的HTTP头设置和严格的内容安全策略也是确保应用程序免受HTTP头注入攻击的重要措施。
0x2 二次编码注入
URL 编码
- URL编码是一种将URL中的特殊字符转换为特殊格式的编码方式。在URL编码中,特殊字符被替换为一种特定格式的字符串,以便它们
在URL中能够被正确传输和处理,避免与URL中的控制字符或保留字符冲突 。 - 在URL编码中,特殊字符通常被替换为百分号(%)后跟两个十六进制数字表示的编码值。例如,空格字符在URL编码中通常被替换为%20,而其他特殊字符也有相应的编码形式。
- URL编码的主要原因是避免URL中的特殊字符被错误解释或截断,确保 URL 中传输的数据能够被正确处理。URL中的一些特殊字符(比如空格、&、?、=等)在不经过编码处理时,可能会与URL的结构发生冲突,导致不正确的解析或操作。
- URL编码的作用:
- 避免歧义: URL编码能够确保URL中的特殊字符不会被错误解释,避免造成歧义或错误操作。
- 安全性: URL编码有助于防止恶意字符被插入URL中,从而避免可能的安全漏洞,如SQL注入、跨站脚本等攻击。
- 传输数据: 通过URL编码,可以在URL中安全传输包含特殊字符的数据,确保数据传输的完整性和准确性。
- 兼容性: URL编码使得URL能够在不同系统和网络环境下正确解析和处理,增强了URL的兼容性和稳定性。
原理
二次编码注入是一种高级的SQL注入攻击技术,利用对用户输入的多次解码和编码操作来绕过应用程序的输入过滤和安全控制,最终执行恶意的SQL查询。这种攻击技术利用了应用程序在处理用户输入时的解码和编码方式的漏洞,通过在用户输入中插入多次编码的特殊字符,欺骗应用程序,最终执行恶意的SQL语句。
详细的二次编码SQL注入原理如下:
- 初始注入: 攻击者向应用程序输入经过编码的恶意数据,可能使用URL编码、Base64编码等方式对特殊字符进行转换。应用程序接收到这些编码后的数据后会进行解码操作,还原成原始数据。
- 第一次解码: 应用程序对接收到的编码数据进行解码,还原为原始数据,通常是根据规定的编码方式对数据进行解码操作,用于后续的处理。
- 二次注入: 攻击者在应用程序对输入进行解码后,再次对数据进行特定的编码,但这次是利用应用程序本身的解码机制。攻击者可能会利用应用程序的特定解码方式,将带有特殊编码的字符插入到数据中。
- 第二次编码解析:
应用程序根据自身的解码机制再次对数据进行解码操作,但这次解码受到攻击者操纵数据的影响,导致应用程序错误地解析恶意输入,构造出含有恶意SQL语句的查 询。 - 利用漏洞: 一旦恶意数据成功通过二次编码注入到应用程序中并成功解码,攻击者就能够执行针对数据库的恶意SQL查询,比如查询敏感信息、修改数据或执行其他恶意操作。
防范二次编码SQL注入的关键在于加强输入验证和过滤,确保应用程序在解码操作时能够正确识别和处理编码字符,避免多次解码操作,同时遵循安全编程实践,防止恶意输入绕过安全控制。应用程序开发者应严格处理用户输入数据,对输入参数进行转义和参数化,使用预编译语句等安全措施,以减少二次编码SQL注入攻击的风险。
2. urldecode() 函数是对已编码的URL进行解码,但是PHP会在处理提交的数据之前先进行一次解码,因此造成了二次编码注入。
0x3 BASE64注入
base64 编码概述
Base64编码是一种将二进制数据转换为文本字符串的编码方式,通常用于在网络传输中表示和传输二进制数据。Base64编码使用64个不同的ASCII字符(包括字母、数字和特殊字符)来表示二进制数据,从而避免了在传输过程中出现不可见字符或特殊字符对数据的影响。
Base64编码的特点和用途包括:
- 编码原理:Base64编码基于对每三个字节的数据进行编码,将其转换成四个ASCII字符。因为Base64是使用64个字符表进行编码,所以称之为Base64。
- 可打印字符:Base64编码产生的结果是由A-Z、a-z、0-9和两个特殊字符+/组成,这些字符在大多数计算机系统中都是可以正常显示和传输的可打印字符。
- 传输二进制数据:Base64经常用于在文本协议中传输二进制数据,如在电子邮件、XML文件、JSON数据中表示图像、音频等二进制内容。
- 数据格式化:在某些情况下,Base64编码也用于简单的数据格式化,将二进制数据转换为文本形式。这在需要以文本形式表示二进制数据时很有用。
- 数据加密:虽然Base64编码并非加密算法,但它可以对数据进行简单的伪装,使得原始数据在一定程度上不容易被直接理解。
- URL传输:在URL中传递参数时,为了避免特殊字符的干扰,有时会使用Base64编码对参数进行处理。
总之,Base64编码是一种常用的数据编码方式,用于将二进制数据转换为文本字符串,以便在文本协议中传输和处理。其简单、有效的特性使得它在许多场景下都有着广泛的应用。
base64注入原理
- 针对传递的参数被
base64加密后的注入点进行注入 ,这种方式常用来绕过一些WAF的检测。
base64注入方法
- 需要先将原本的参数进行解密,然后结合之前的****注入手法(如联合注入,报错注入等)进行加密,再作为参数进行注入
- base64在线加解密:http://tool.oschina.net/encrypt?type=3
- 其他编码注入的注入方法一样,举一反三。
0x4 二次注入
- 什么是二次注入?
- 简单的说二次注入是指
已存储(数据库、文件)的用户输入被读取后,再次进入到SQL査询语句中 导致的注入。
- 简单的说二次注入是指
- 原理
- 有些网站当用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又 被还原并存储在数据库中,当web程序调用存储在数据库中的恶意数据并执行SQL査询时,就发生了SQL二次注入
- 注意:可能毎一次注入都不构成漏洞,但是如果一起用就可能造成注入。
二次注入思路
- 攻击者通过构造数据的形式,在浏览器或其他软件中提交HTTP数据报文请求到服务端进行处理,提交的数据报文请求中可能包含了攻击者构造的SQL语句或者命令。
- 服务端应用程序会将攻击者提交的数据信息进行存储,通常是保存在数据库中,保存的数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做岀响应。
- 攻击者向服务端发送第二个与第一次不相同的请求数据信息。
- 服务端接收到黑客提交的第二个请求信息后,为了处理该请求,服务端会査询数据库中已经存储的数据信息并处理,从而导致攻击者在第一次请求中构造的SQL语句或者命令在服务端环境中执行。
- 服务端返回执行的处理结果数据信息,攻击者可以通过返回的结果数据信息判断是否成功利用二次注入漏洞。
0x5 堆叠注入
- 什么是堆叠查询?
- 在SQL语句中,分号(;)用来表示一条sql语句的结束。
所以可以在以分号(;)结束一个sql语句后,继续构造一下条语句,可以一起执行 。 - 堆叠查询和联合查询的区别
- 联合查询: union或者 union all执行的语句类型有限,可以用来执行查询语句
- 堆叠査询:堆叠查询可以执行的是任意的语句
- 如用户输入:Select from products where pro=1;DELETE FROM products
- 当执行查询后,第一条显示查询信息,第二条则将整个表进行删除
堆叠注入原理
- 堆叠注入,就是将
许多sql语句叠加在一起执行 。将原来的语句构造完成后加上分号,代表该语句结束,后面再输入的就是个全新的sql语句,这时我们使用的语句将毫无限制。 - 如:
[1';show tables();#]
利用条件
- 可能受到
API或者数据库引擎 不支持的限制- mysqli_multi_query支持 / mysql_query不支持
- MySQL+PHP支持
- SQL Server+ Any API支持
- Oracle+ Any API不支持
- 注意
- 由于在web系统中,代码通常只返回一个査询结果,所以在读取数据时,建议使用联合注入
- 使用堆叠注入之前,需要知道数据库的相关信息,如表名,列名等
暂无评论内容