SQL注入必知必会

文章发布时间:

最后更新时间:

文章总字数:
1.4k

预计阅读时间:
5 分钟

1、注释方法

单行注释:可以使用#--

注意:使用 -- 时,最后一定要有一个空格

GET注入时 # 要写成 %23

多行注释:使用 /* xxx */

内联注释:使用 /*! *//* */在mysql中是多行注释 但是如果里面加了! 那么后面的内容会被执行

常用于Waf绕过

image-20230818185350332

/*!50000*/ mysql 5通用 带版本内联注释

根据MySql不同的版本,数字会不同


2、常用SQL语句

只能在SQL命令行中执行,在SQL注入中不能使用

use [database]:使用指定的数据库

show databases:显示所有的数据库

show tables:显示指定数据库中所有的表

show global variables:显示全局的配置信息

show variables like '%secure%':模糊查询显示相关的配置信息


3、数据库

information_schema :元数据库,存储数据库相关信息的数据库

mysql:存储数据库相关的信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
information_schema->schemata
schema_name:所有数据库名

information_schema->tables
table_schema:表所属的数据库
table_name:表名

information_schema->columns
table_schema:表所属的数据库
table_name:表名
column_name:列名

mysql->user(mysql 5.6 and below)
Host:主机
User:用户名
Password:密码

mysql->user:(mysql 5.7 and above)
host
user
authentication_string

查询所有的数据库名:

1
select schema_name from information_schema.schemata

查询'security'数据库中所有的表名:
1
select table_name from information_schema.tables where table_schema='security'

查询'security'数据库下'users'表的列名:
1
select column_name from information_schema.columns where table_schema='security' and table_name='users'

查询'security'数据库下'users'表中指定列的内容:
1
2
3
4
5
select * from users
select id,username,password from users

select * from security.users
select id,username,password from security.users

4、常用函数

如果函数要在SQL命名行中执行,前面需要加select

user():获取当前连接到数据库的用户的用户名和主机名

1
2
select user()
-- root@192.168.66.1

current_user():当前通过哪个规则连接数据库的用户

1
2
3
4
5
6
7
select current_user()
/*
结果:root@%
root:用户名
@:用于分隔用户名和主机名
%:规则,%指通配符,表示可以从任何主机连接。
/*

@@basedir:mysql安装的路径

1
2
select @@basedir
-- C:/phpStudy/PHPTutorial/MySQL/

@@datadir:数据库的路径

1
2
select @@datadir
-- C:\phpStudy\PHPTutorial\MySQL\data\

@@version_compile_os:获取当前操作系统版本

1
2
select @@version_compile_os
-- Win32

@@version_compile_machine:操作系统的体系结构

1
2
select @@version_compile_machine
-- AMD64

database():当前数据库

1
2
select database()
-- security

version():数据库的版本

1
2
select version()
-- 5.5.53
1
select database(),version(),@@datadir,user()

concat()concat_ws:将多列数据合并到一列

group_concat:将多列数据的多行值合并到一列一行

1
2
3
4
5
6
7
8
9
select concat(id,'|',username,'@',password) test from users
-- 2|Angelina@I-like-you

select concat_ws('|',id,username,password) from users
-- 2|Angelina|I-like-you

select group_concat(username,0x7e,password) from users
-- 0x7e:~
-- Dumb~5d41402abc4b2a76b9719d911017c592,Angelina~I-like-you

substr()mid():字符串截取

1
2
3
4
5
select substr('abcde',2,1)
select mid('abcde',2,1)
-- b

select substr(username,1,2) from users

limit:限制查询结果的数量

1
2
select * from users limit 0,1
-- 从第0行开始,截取一行

locate():返回字符串出现的位置

1
2
select locate('abcd','abcabcde') 
-- 4

asciiord:获取字符的 ASCII 码值

1
2
3
select ascii('a')
select ord('a')
-- 97

char():返回ASCII码值对应的字符

1
2
3
4
5
6
select char(97)
select char('97')
-- a

select char(77,121,83,81,76)
-- MySQL

length():返回长度

1
2
3
4
5
select length(database())
-- 8:security

select length(username),username from users
-- 4,Dumb

count():查询数量

1
2
3
4
select count(*) from users
select count(1) from users
select count(id) from users
-- 尽量查询主键,其他键有可能为空

sleep():休眠

1
2
select sleep(2)
-- 休眠2s

if():判断

1
2
3
4
5
select if(length(database())>5,'>5','<5')
-- >5:判断数据库长度是否大于5,成立输出>5,否则输出<5

select if(substr(database(),1,1)='a',sleep(2),'!=a')
-- !=a,常用于猜解数据库名

5、SQL注入分类

  • 传参方式:GET、Post
  • 参数类型:整数型、字符型
  • 注入方式
    • 联合查询注入:union select 联合查询
    • 报错注入:页面显示报错信息,对数据库进行注入使报错,根据报错信息获取有用的信息
    • 堆叠注入:一次执行多个SQL语句
    • 布尔盲注:判断条件是否成立,根据页面变化来确认想要的信息
    • 时间盲注(延时盲注):判断条件是否成立,根据响应时间获取信息

6、判断是否有SQL注入

核心问题是,可控参数的修改,是否可以影响sql逻辑,如果可以影响,就证明有注入点,剩下的问题无非是能否利用,如何利用的问题.


手工判断:

  • 判断是否是注入点:找到客户端向服务器端传参,并且该参数可能会被发送到数据库执行的页面或url,(该参数称为可控参数)

    1. 修改可控参数,查看请求的返回内容是否有变化,判断和数据库是否有交互.

    2. 修改可控参数,加上单引号或者双引号或and 0或id=n-m 等字符,查看是否能报错,判断传入的参数是否能够影响原有sql执行逻辑

    3. 如果b步骤报错,则修改可控参数,尝试闭合sql语句,再使sql语句不报错,这样就可以拼接要执行的sql语句.

  • 判断注入方式

    1. 是否可以使用union select语句页面有明确的回显内容

    2. 是否可以使用布尔盲注 通过and 0及and 1注入,返回内容只有两种变化

    3. 是否可以使用时间盲注,如果页面没有任何变化,可以尝试使用sleep函数通过延时判断是否有注入点

    4. 是否可以使用报错注入,如果页面有报错信息,则可以尝试此种方式


sqlmap自动判断