1. 命令注入的本质与符号艺术命令注入是CTF比赛中Web安全方向的经典题型它的核心在于利用系统对用户输入过滤不严的漏洞通过精心构造的输入让服务器执行非预期的命令。在ACTF2020新生赛的Exec题目中我们遇到的就是这样一个典型的场景一个看似简单的ping功能背后却隐藏着命令执行的陷阱。我第一次做这道题时发现它表面上就是个ping测试工具输入IP地址就会返回ping的结果。但经验告诉我这种功能往往存在命令注入的风险。于是我开始尝试在IP地址后面添加各种特殊符号看看能否突破限制执行额外命令。这里的关键在于理解不同符号在Linux命令中的特殊含义分号(;)这是最简单的命令分隔符相当于告诉系统前面的命令执行完了现在开始执行后面的管道符(|)这个符号会把前一个命令的输出作为后一个命令的输入逻辑运算符(和||)这两个符号会根据前一个命令的执行结果决定是否执行后面的命令在实际渗透测试中我们常常会遇到各种过滤机制。有些题目会过滤空格有些会过滤分号这时候就需要我们对各种符号的用法了如指掌才能找到合适的绕过方式。2. ACTF2020 Exec题目实战分析2.1 初步探测与基础注入拿到这道题我的第一步永远是信息收集。先输入127.0.0.1测试基本功能服务器正常返回了ping的结果说明服务是正常工作的。接下来就是尝试注入最简单的命令127.0.0.1;ls这个payload的原理很简单分号前面的127.0.0.1会被当作ping命令的参数正常执行分号后面的ls命令也会被执行。如果服务器存在命令注入漏洞就会返回当前目录的文件列表。在实际测试中我发现这个payload成功执行了返回结果中除了ping的信息外还显示了当前目录下的文件。这说明注入成功了而且服务器没有对分号做任何过滤。2.2 目录遍历与文件发现知道可以执行命令后下一步就是寻找flag文件的位置。通常CTF比赛中flag可能存放在各种位置需要我们有系统地搜索127.0.0.1;ls ../ 127.0.0.1;ls ../../ 127.0.0.1;ls ../../../通过这样逐级向上查看目录内容我发现当执行到第三级时已经到达了根目录并且在根目录下发现了flag文件。这个过程展示了命令注入在实际渗透中的威力——从一个简单的ping功能我们可以逐步扩大权限最终获取系统关键信息。2.3 读取flag文件的技巧找到flag文件的位置后下一步就是读取它的内容。最直接的方法是使用cat命令127.0.0.1;cat /flag但实际比赛中情况往往没那么简单。有时候cat命令会被过滤这时候我们就需要了解更多的文件读取方法127.0.0.1;tac /flag 127.0.0.1;more /flag 127.0.0.1;less /flag 127.0.0.1;head /flag 127.0.0.1;tail /flag这些命令都可以用来读取文件内容具体使用哪个取决于系统环境和过滤规则。在ACTF2020这道题中简单的cat命令就足够获取flag了但在更复杂的场景中我们需要掌握更多变通方法。3. 命令注入的高级绕过技巧3.1 符号的替代与组合在实际的CTF比赛和渗透测试中题目往往不会这么简单。常见的防御措施包括过滤特定符号、转义特殊字符等。这时候就需要我们掌握更多的绕过技巧。比如如果分号被过滤了我们可以尝试使用其他符号127.0.0.1%0als这里%0a是换行符的URL编码形式在Linux中换行符和分号一样可以用来分隔命令。类似的我们还可以使用127.0.0.1ls 127.0.0.1$(ls)这些是利用命令替换的方式执行注入。反引号和$()都会先执行里面的命令然后将结果替换到原命令中。3.2 空格绕过技术另一个常见的过滤是对空格的限制。在Linux命令中空格用于分隔参数但如果空格被过滤了我们可以用其他方式代替127.0.0.1;cat/flag 127.0.0.1;cat${IFS}/flag 127.0.0.1;cat%09/flag这里是输入重定向${IFS}是shell中的内部字段分隔符默认就是空格%09是制表符的URL编码。这些方法都可以在不使用空格的情况下实现参数分隔。3.3 命令拼接与编码绕过更复杂的过滤可能需要我们使用命令拼接或者编码技术。比如127.0.0.1;cat /flag 127.0.0.1;c\at /fl\ag 127.0.0.1;echo Y2F0IC9mbGFn|base64 -d|bash第一种方法是通过单引号分割命令字符串第二种是通过反斜杠转义第三种则是将命令编码为base64再解码执行。这些技术在面对严格的字符过滤时非常有用。4. 防御命令注入的最佳实践4.1 安全的编码习惯作为开发者了解攻击手段的同时更应该知道如何防御。防止命令注入最根本的方法是避免直接拼接用户输入和系统命令。应该使用白名单验证所有输入对必要的特殊字符进行严格转义尽量使用安全的API替代系统命令调用4.2 输入验证与过滤如果必须使用系统命令至少要实施严格的输入验证限制输入字符集比如IP地址只允许数字和点使用正则表达式严格匹配预期格式对已知的危险字符进行过滤或转义4.3 最小权限原则运行Web服务的账户应该遵循最小权限原则不要使用root权限运行Web服务限制Web账户的文件系统访问权限使用chroot等机制限制文件系统访问范围在CTF比赛中我们学习各种攻击技术的目的不是为了实施攻击而是为了更好地防御。理解攻击者的思路才能构建更安全的系统。这道ACTF2020的Exec题目虽然简单但很好地展示了命令注入的基本原理和利用方法是Web安全学习的绝佳入门案例。
【CTF实战】从ACTF2020新生赛Exec看命令注入的符号艺术与绕过
发布时间:2026/5/22 2:52:24
1. 命令注入的本质与符号艺术命令注入是CTF比赛中Web安全方向的经典题型它的核心在于利用系统对用户输入过滤不严的漏洞通过精心构造的输入让服务器执行非预期的命令。在ACTF2020新生赛的Exec题目中我们遇到的就是这样一个典型的场景一个看似简单的ping功能背后却隐藏着命令执行的陷阱。我第一次做这道题时发现它表面上就是个ping测试工具输入IP地址就会返回ping的结果。但经验告诉我这种功能往往存在命令注入的风险。于是我开始尝试在IP地址后面添加各种特殊符号看看能否突破限制执行额外命令。这里的关键在于理解不同符号在Linux命令中的特殊含义分号(;)这是最简单的命令分隔符相当于告诉系统前面的命令执行完了现在开始执行后面的管道符(|)这个符号会把前一个命令的输出作为后一个命令的输入逻辑运算符(和||)这两个符号会根据前一个命令的执行结果决定是否执行后面的命令在实际渗透测试中我们常常会遇到各种过滤机制。有些题目会过滤空格有些会过滤分号这时候就需要我们对各种符号的用法了如指掌才能找到合适的绕过方式。2. ACTF2020 Exec题目实战分析2.1 初步探测与基础注入拿到这道题我的第一步永远是信息收集。先输入127.0.0.1测试基本功能服务器正常返回了ping的结果说明服务是正常工作的。接下来就是尝试注入最简单的命令127.0.0.1;ls这个payload的原理很简单分号前面的127.0.0.1会被当作ping命令的参数正常执行分号后面的ls命令也会被执行。如果服务器存在命令注入漏洞就会返回当前目录的文件列表。在实际测试中我发现这个payload成功执行了返回结果中除了ping的信息外还显示了当前目录下的文件。这说明注入成功了而且服务器没有对分号做任何过滤。2.2 目录遍历与文件发现知道可以执行命令后下一步就是寻找flag文件的位置。通常CTF比赛中flag可能存放在各种位置需要我们有系统地搜索127.0.0.1;ls ../ 127.0.0.1;ls ../../ 127.0.0.1;ls ../../../通过这样逐级向上查看目录内容我发现当执行到第三级时已经到达了根目录并且在根目录下发现了flag文件。这个过程展示了命令注入在实际渗透中的威力——从一个简单的ping功能我们可以逐步扩大权限最终获取系统关键信息。2.3 读取flag文件的技巧找到flag文件的位置后下一步就是读取它的内容。最直接的方法是使用cat命令127.0.0.1;cat /flag但实际比赛中情况往往没那么简单。有时候cat命令会被过滤这时候我们就需要了解更多的文件读取方法127.0.0.1;tac /flag 127.0.0.1;more /flag 127.0.0.1;less /flag 127.0.0.1;head /flag 127.0.0.1;tail /flag这些命令都可以用来读取文件内容具体使用哪个取决于系统环境和过滤规则。在ACTF2020这道题中简单的cat命令就足够获取flag了但在更复杂的场景中我们需要掌握更多变通方法。3. 命令注入的高级绕过技巧3.1 符号的替代与组合在实际的CTF比赛和渗透测试中题目往往不会这么简单。常见的防御措施包括过滤特定符号、转义特殊字符等。这时候就需要我们掌握更多的绕过技巧。比如如果分号被过滤了我们可以尝试使用其他符号127.0.0.1%0als这里%0a是换行符的URL编码形式在Linux中换行符和分号一样可以用来分隔命令。类似的我们还可以使用127.0.0.1ls 127.0.0.1$(ls)这些是利用命令替换的方式执行注入。反引号和$()都会先执行里面的命令然后将结果替换到原命令中。3.2 空格绕过技术另一个常见的过滤是对空格的限制。在Linux命令中空格用于分隔参数但如果空格被过滤了我们可以用其他方式代替127.0.0.1;cat/flag 127.0.0.1;cat${IFS}/flag 127.0.0.1;cat%09/flag这里是输入重定向${IFS}是shell中的内部字段分隔符默认就是空格%09是制表符的URL编码。这些方法都可以在不使用空格的情况下实现参数分隔。3.3 命令拼接与编码绕过更复杂的过滤可能需要我们使用命令拼接或者编码技术。比如127.0.0.1;cat /flag 127.0.0.1;c\at /fl\ag 127.0.0.1;echo Y2F0IC9mbGFn|base64 -d|bash第一种方法是通过单引号分割命令字符串第二种是通过反斜杠转义第三种则是将命令编码为base64再解码执行。这些技术在面对严格的字符过滤时非常有用。4. 防御命令注入的最佳实践4.1 安全的编码习惯作为开发者了解攻击手段的同时更应该知道如何防御。防止命令注入最根本的方法是避免直接拼接用户输入和系统命令。应该使用白名单验证所有输入对必要的特殊字符进行严格转义尽量使用安全的API替代系统命令调用4.2 输入验证与过滤如果必须使用系统命令至少要实施严格的输入验证限制输入字符集比如IP地址只允许数字和点使用正则表达式严格匹配预期格式对已知的危险字符进行过滤或转义4.3 最小权限原则运行Web服务的账户应该遵循最小权限原则不要使用root权限运行Web服务限制Web账户的文件系统访问权限使用chroot等机制限制文件系统访问范围在CTF比赛中我们学习各种攻击技术的目的不是为了实施攻击而是为了更好地防御。理解攻击者的思路才能构建更安全的系统。这道ACTF2020的Exec题目虽然简单但很好地展示了命令注入的基本原理和利用方法是Web安全学习的绝佳入门案例。