前言
各位大佬们,今天更新一篇关于盲注非常基础的文,以方便那些还在入门阶段的老铁们更快速的理解上手盲注的手工注入基本方法。由于本人水平有限,欢迎各位大佬们批评指正哈!
sqli-Labs Less-8 心路历程
http://127.0.0.1/sqli-labs/Less-8
接下来,我们尝试Less-8
按照页面的提示传递id参数,页面如下图所示的显示,那么我们可以直接确定一点:就是这道题用联合查询的方式是不行的喽
先根据上面几道题的思路,判断一下闭合方式:测试之后发现是单引号闭合方式
那么现在怎么处理呢?根据页面的回显情况来看,这道题是肯定不能使用常规的联合查询注入方式获取到数据库的相关信息了,那我们一共目前就接触了两种注入方法:联合查询注入和报错注入。。。。那接下来,我们用报错注入的payload查看一下页面效果,看看能否获取到报错信息:
通过测试发现,无论是使用什么报错注入语句,页面都没有报错信息显示出来,,,
呜呜呜,,又遇到难题了!这怎么办呢?没有信息回显出来,怎么去进行注入呢?
接下来,就要引入另外一种注入方法了,那就是盲注(其实根据字面意思理解,所谓盲注就是在看不见任何页面信息的情况进行注入,换句话说就是盲人摸象),哈哈哈
盲注
盲注定义理解
盲注是sql注入的其中一种方式,之所以称之为盲注的原因是因为我们在对某站点进行sql注入的时候,页面并不会返回我们所希望看到的报错信息,那么这时候就需要盲注登场了。。。
盲注分类
时间盲注:当界面返回值只有True或False的时候,无论输入任何值,都会按照正常的方式来处理,这时候使用时间函数来增加页面相应条件下的响应时间,通过查看web页面返回的时间差来判断注入的语句是否正确,说白了就是将if()条件语句和sleep()延迟函数结合起来进行注入,然后根据语句执行时间的长短来判断
布尔盲注:当一个页面不会回显数据位置,也不会显示报错信息时,通过页面的”真”和”假”来识别我们需要判断的各种信息,从而进行注入的一种注入手段。
那么,这个页面的”真”或”假”该怎么判断呢?
答:可以从返回页面,数据包长度,返回码等信息判断
盲注常用的函数:
length():返回字符串的长度
select length(databse())–:返回数据库名的长度
substring()函数可以截取字符串,可指定开始的位置和截取的长度
select substring(database(),1,1)
substr():截取字符串
mid():截取字符串
ord():返单个字符的Ascii码
select ord(substring(database(),1,1))
ascii():返回字符的ascii码
char():函数可以将Ascii码转换成对应的字符
select char(116);
sleep(n):将程序挂起一段时间n为n秒
if(expr1,expr2,expr3):判断语句,如果第一个语句正确就执行第二个语句,如果错误就执行第三个语句
布尔盲注
好了盲注该用到的常用函数的作用,我也解释的差不多了。。。那么,我们就接着上面的Less-8题吧!
根据sql注入获取数据库相关信息的步骤,利用布尔盲注的方式,我们第一步还是获取数据库名称:
payload:and (select ord(substr(database(),1,1))) > 120
(此步骤利用字符串截取函数substr一个一个截取数据库名称的每个字符,然后用ord函数将每个字符转换成ascii值的形式,通过使用二分法判断出数据库名称的每个字符,从而得到数据库名)
页面返回正常,说明数据库名称第一个字符的ascii码值在110~120之间,那就猜中间的115尝试一下。。。
页面返回正确,说明数据库名称的第一个字符的Ascii码是115,查看ASCII码对照表,可发现数据库名称的第一个字符是s
以此类推,剩余的字符仍按照上面的方式判断。即可得到数据库的名称是:security
获取数据表名称:
payload:and (select ord(substr((select table_name from information_schema.tables where table_schema=database()),1,1)))>100
根据页面是否正常显示判断,数据表名的每个字符
根据上面两张图,不难看出,该数据表的第一个字符的asscii码是在100~120之间的,接着利用二分法猜测:
根据页面的反应,很明显,security数据库中的第一个表的第一个字母是e
以此类推,第一个表的名称是emails
其余数据库中的表信息分别是:referers、uagents、users。请大家根据上面的payload自行去测试吧。。。
获取数据表中的列信息
payload:and (select ord(substr((select column_name from information_schema.columns where table_name=’users’ and table_schema = database() limit 0,1),1,1)))>100
一顿简单粗暴的操作,发现该users表第一列的第一个字母asscii码是u
按照上面的操作下来,我们会发现users数据表中有username和password两列,请大家自行实验验证。
接下来就是获取username和password两列的信息:
payload:and(select (ord(substr((select username from 'users'),1,1)))) > 100
我就不操作了,大家下去一点点实验去吧。
由于手工注入是在是太消耗时间了,万分建议大家一定要学会写一个自动化小脚本自己去跑,不然,真的实战中遇到大型的数据库,怕是要哭死。
时间盲注
注意:sleep函数是存在一个满足条件的行就会延迟指定的时间,所以当实际操作过程中,查找到两个满足条件的行,那么就会延迟10s,那么我们在实战中就可以根据返回的时长来判整个表的具体情况。
payload:and if(ascii(substr(database(),1,1))=114,sleep(5),1)
获取数据表信息:and if(ord(substr((select table_name from information_schema.tables where table_schema=database()),1,1))>110,sleep(5),1)
获取表对应的列信息:and if(ord(substr((select column_name from information_schema.columns where table_name=’users’),1,1)),sleep(5),1)
payload给大家写好了,大家自己下去实验哦。
总结
今天的文就又结束了,哈哈哈哈。我的煎熬时间也终于结束了,写文真是太考验耐心了(哈哈哈。也可能是我自己懒喽!!) 好了,还是那句话:多多练习,多多动手!!!
来源:freebuf.com 2021-06-07 10:32:30 by: whiteH
请登录后发表评论
注册