sql注入之查询方法和报错盲注 (16)

文章讲述了在SQL注入中遇到无回显情况的原因,主要是由于SQL查询方式或结果处理不当。在这种情况下,需要利用报错注入或盲注技术来获取信息。盲注分为布尔型、时间型和报错型,每种方法各有优劣,根据网站特性选择合适的方式。文章通过示例展示了如何进行报错盲注,并提供了相关工具和方法来判断和提取数据。

 当我们进行注入的时候,有很多注入会出现无回显得情况,就在注入的时候没有报错信息和一些东西给予提示的,这种情况是无回显,在前期的注入就没办法执行,我们需要他报出相关的数字,便于我们查询一些参数,如果出现无回显的情况就没变过进行了。

出现这个无回显的原因,可能是sql查询方式有问题所导致的, 第二个原因是对方在sql语句执行之后这个结果显示它有一些显示上面的代码,他这个显示代码写的不当,不好,或者直接没写,也会导致这种无回显。

这个时候我们就需要报错和盲注进行后续操作,同时作为手工诸如的时候,提取了解或者预知了其sql语句的大概写法也能更好的选择对应的sql语句。

补充上节课 access暴力拆解不出的问题

对应的查询语句

select   查询数据

在网站数据库中进行显示查询数

insert   插入数据

在网站应用中进行用户注册添加等操作

delete  删除数据

后台管理里面删除文章删除用户等操作

update  更新数据

会员或后台数据同步或缓存操作

order by 排序数据

一般结合表名和列名进行数据排序操作。

演示一下学习这个原因

 比如这样的网站,就是我们注册一个账户,就可以登陆这个网站,相对于的我们的注册账号就是写在对方的数据库里面,这个操作就是添加和插入的做的,明显就用到insert这种语法做为注入语句,相对应的写法就是类似插入的sql语句,这个地方能产生注入点的话,我们测试的就相当于insert这种查询方式下的注入,对应语句查询方式也会不同,

,我们在注入网站的时候先看看网站的页面,看到相应的功能,在这个功能上测试注入点要提前知道可能涉及到那种方法,哪一种写法,查询方法是查询还是插入或者删除,理解了之后,后续操作的时候要注意什么事情,每个查询方法写法上面都有所不同,

比如这个insert,news是表名,里面的是固定的字段名,后面的是我们传递的参数,我们可以修改的值,我们注入语句也写在哪里,但是看到了有单引号,括号等干扰符合,不用说有什么特点,但从这一点要先过滤掉干扰符号。之前讲的注入语点都是select的因为他是最常见的也是最多见的形式。

为什么要把它拿出来单独讲呢,就是因为他的注入语句不同,打开皮卡出靶场

 现在就开始在这个注册这里对他进行注入,测试insert注入方式,用burp抓一下数据包,

 在参数那里注入,写一些东西,

按照我们正常后面就写order by 数字  开始去猜他的的数字,但是在这里会发现不管order by语句是对的还是错的,或者语句正常的或错,都报的正常或者提示性错误, 这里改了一下靶场的源码方便理解,把执行语句复制下来看看怎么执行的,

 执行的时候直接就有问题,执行不了,所以我们为什么没有注入出来的的原因就在这里,还有一个问题,对方是没有回写错误的,对方是没有显示的,之前的话都有数字报错,这里没有,我们在注册时候要么是注册成功,要么就是注册报错,完了,什么都没有。

这种情况就是什么说的无回显,报错相应数字或者其他什么,因为这个语句决定了就是这样的,这时候该怎么注入,就会使用到盲注,盲注在注入过程中,获取数据不能回显至前端页面,这个时候我们就需要用到一些方法判断,或者尝试,这个过程就是盲注,盲注分为以下三类

基于布尔sql盲注--逻辑判断

regexp,like,ascii,left,ord,mid

基于时间的sql盲注--延时判断

if,sleep

基于报错的sql盲注,报错判断

floor,updatexml,extractvalue

逻辑和延时是不要回显信息就能判断,报错回显是对方不回显我强制性对方报错回显,所以盲注是分为这三类,我们选择哪一类是根据网站选择的,报错回显是最简单的,不行在用逻辑判断,最后再用延时判断,因为效率来讲,报错是最快的,逻辑比较复杂一点 ,延时太慢了,他根据一个网站的回显的延时时间来判断,所以说优先推荐报错回显,其实在mysql里面是有多种的,其他的数据库的话,大约也有这么几种,只是每个数据库写法不一样而已。

强制报错回显,参考链接12种报错注入+万能语句_报错注入语句_煎饼果子配咖啡的博客-CSDN博客

floor,updatexml,extractvalue。

这是最常用的,让他强制性报错。前三个最常用  博主演示一下floor

 想查别的就修够一下database(),就号,比如想查询版本多少,sersion()

 extractvalue,无回显报错判断注入演示

这里补充一下,上面的语句是网站正常执行注册用户时候的语句,他只会提示你成功还是失败,这也是为什么回显,就是因为sql语句它的特性决定的,他的回显就是系统上面的你是否执行成功,你是否执行失败,有没有错误就这两种情况,没有其他,这种注入他没有回显 ,而select就有,这种就需要我刚刚说的盲注,刚刚演示的是报错盲注。

在演示一下extractvalue

 都差不多,上面那个链接注入不了,就去百度搜索报错语句用,修改成直接需要的的语法就行。

这两个字符是用来干嘛的,筛选字符串的,筛选出中间的字符串。为了一些开发者,在工具里面通过代码去寻找,通过这个关键字,正则表达式去筛选来,这就是他三种的一种报错注入。

补充一下能注入的对方是可以修改并且提交到数据库的值才可以,固定值不可以作为注入语句。

 做一下update测试,登陆进入后更改信息就是运用update

这个也是无回显的,跟insert一样,只会告诉你语句有没有正常执行。

 这列因为开头是get,所以把空格换成了+号,换成你%20也可以,因为这是数据包里面如果是空格的话,他可能会把后面hhtp也无认为是sql语句里面的就很麻烦。

通过这三个方式,select,update,delect,简要的演示,第一个我们要做的,我们要进入手工注入或者注入分析的时候,要清楚他可能是什么类型的查询方式的注入,另外还要知道怎么注入,就是我们说的盲注,盲注分为三种报错,逻辑,演示,我们演示了报错的12钟里面的三种,其他的也都集合在sqlmap工具里面了。

延时判断,if,sleep

 正常执行是0.00秒,但我们在sleep里面加上值就变成了1秒,里面数字是几个,就有几秒延迟。

if全部数据库都有只是写法不一样,或者名字不一样而已

if(条件,a值,b值)

如果条件是对的就输出a的值,如果条件是错的就输出b的值。

这个意思就是如果数据库名等于a,就输出123,如果不是就输出456.因为没有所以输出456

这个图是用法意思就是查询数据库,sleep里面,如果数据库名等于皮卡出就里面就是五,如果不等于就是0。结果是延迟五秒了在执行就证=证明数据库名等于piakchu,通过判断这个延迟时间来判定输入的信息是否是正确的,这个地方就能实现一个数据库名字的猜解,他不需要回写,就只要判断一下加载时间。

来到sqli-labs靶场 2

输入好代码来判断延迟的时间来判断数据库是否正确,我这数据库名正确延迟为10秒,缓存了10才显示出来,所以这个数据库名是对的。但是我们在实战的时候是不可能知道数据库名,数据库密名也是千奇百怪,几十位组成的也有,我们就要先去获取数据库名字的长度如何一个一个测试,不过也就0-9,a-j,数据库名不能有特殊符号,不过正常还是用工具去跑,我们还是演示一下判断数据库长度吧

参考

like ‘ro%’                        判断ro或ro...是否成立

regexp ‘xiaodi[a-z]’        匹配xiaodi及xiaodi...等

if(条件,5,0)                     条件成立则返回5,反之返回0

sleep(5)                         SQL语句延时执行5秒

mid(a,b,c)                      从位置b开始,截取a字符串的c位

substr(a,b,c)                  从b位置开始,截取字符串a的c长度

left(database(),1),database()    left(a,b)从左侧截取a的前b位

length(database())=8    判断数据库database()名的长度

ord=ascii  ascii(x)=97     判断x的ascii码是否等于97 

选用mid判断一下数据库名第几位是什么数字,

mid的语句的意思是从第一位开始截取一位的字符,第几位可以自由更改,选择获取到第一位了就可以改成从第二位开始获取,只获取一位数字,猜解第二位。

ASCII值运用,把后面的s换成对应的ASCII值来进行测试,这样会看着时更麻烦,其实有原因的其一是防止被转义,因为单引号会转义或过滤。还有一个原因你看的字符s,但是用脚本编程工具去跑的话,工具他这种字符串和115这个ASCII没什么区别,用编程去实现全部字符的对比要把所有数字都写进去,而用ASCII值就可以用for循环0-127,全部的字符数字包括特殊符号都包括了,是小迪老师猜测。推荐用ASCII值。

猜解完数据库名要开始猜解表名,但是表名很多,一个数据库下面有好几个表,猜的时候会不会猜解到别的数据库去,这时候我们就可以用到这个sql语句  select * from users where id=1 and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=101,sleep(3),0);

 0是第一个表名,1是第二个表名,limit后面第二个数字1是选择一个表的意思,不是选择第几位。1就是选择一个表。查询表的时候就改一些参数,把记录表名的表改成记录列名的表,把表名换成列名运用sql注入必懂知识点就对了。

布尔判断就是逻辑判断,在演示一下   /sqli-labs  第五关

正确的返回结果

这个靶场也是没有回显得我们就用逻辑判断注入语句试一下

这里加上后面--+是为了过滤干扰符合,前面id=1后面也加上单引号,避免干扰符合,同样查databases数据库名也是一样的测试数据库名,着一种情况成为布尔类型,就是一种逻辑判断。

我们施展的时候就要先判断长度,然后再去测试每一位对应的字符是什么,后面这些思路和演示判断几乎是一样的,刚刚是因为老师演示为了时间长度,所以没有判断长度直接就去猜解的数据库名。

补充上节课 access暴力拆解不出的问题

猜解不到有两种情况一种是表名猜解不到,一种是列名猜解不到

access偏移注入:解决列名猜解不到方法,对表名没有效果

打开asp的测试靶场开始注入

 猜接字节 order by

 发现是22位,再看显示那个字符

 显示的数字是3和15就从这两给对方做文章,假如现在我猜不到,password,user,username都不正确,开始演示偏移注入

 在数字末尾加上一个*号,然后访问网站报错就往前缩减一位在访问之后,报错就在缩减一位,直到它正确为止,*号的意思是可代替的字符串,22-16就是个6给字符串,6就代表要猜的表里面的列名个数六个

 那么6猜出来之后就加上一个语句,规定就是这样写的

 因为后面跟上的aid和bid等于两个*号就是6+6就是12位,之前网站显示最多到12位,所以前面要在10后面就开始*号10+12=22还是22位,查看源码,就可能随即爆出来一些数据,密码和账号都i有可能

如果报不出来,就在用二级偏移语句,再报。

表名不知道怎么办呢,通过登录框的源代码,表单值和观察url的特征,针对性的去拆解,比如xiaodi的网站,不知道表名,不过我们直到网站后台地址,通过扫描工具啊扫出来了,

这个网站url怎么有给zb_system,观察这个网站的特征,有一些cms,有一些网站的前缀以这种命名去,猜解不到是因为有表名前缀,把前缀加上去猜,admin这些常见的表名字,看后台

 也可以看表单值,这是一种方法并不是百分比,这些方法还是猜不到就没辙了,只能靠字典乱搞了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值