命令注入和代码执行的原理是相似的,它们都涉及到攻击者通过向应用程序提供恶意输入来控制应用程序执行系统命令或代码的能力。以下是它们的基本原理:
**1.**命令注入(Command Injection):命令注入是一种攻击技术,攻击者通过向应用程序提供恶意输入,以控制应用程序执行系统命令的能力。攻击者可以利用这种能力来执行任意命令,包括破坏系统、窃取数据或提升权限等。
** 原理:**当应用程序接收到用户输入并将其作为命令的一部分执行时,攻击者可以通过插入特殊字符或字符串来改变原始命令的意图。例如,攻击者可能输入 "; rm -rf /",这将导致服务器上的文件被删除。这是因为分号(;)用于分隔多个命令,而 "rm -rf /" 是一个危险的命令,可以删除整个文件系统。
2. 代码执行(Code Execution):代码执行是指攻击者能够执行恶意代码的能力。这通常发生在应用程序存在漏洞时,攻击者可以通过这些漏洞注入并执行恶意代码。
原理:当应用程序接收到用户输入并将其作为代码的一部分执行时,攻击者可以通过插入恶意代码来控制应用程序的行为。例如,攻击者可能尝试注入JavaScript代码,当其他用户浏览包含恶意代码的页面时,恶意代码将在他们的浏览器上执行。这是因为浏览器会解析并执行嵌入在网页中的JavaScript代码。
为了防止这些攻击,开发人员应该采取适当的预防措施,如对用户输入进行验证和过滤、使用参数化查询或预编译语句、实施内容安全策略(CSP)等。定期更新和维护应用程序也是确保安全性的重要步骤。
命令注入:
通常,当应用程序与操作系统进行交互以执行系统命令时,如果没有对用户输入进行充分的验证、过滤和消毒,就可能会出现漏洞。攻击者会寻找那些接受用户输入并将其直接用于构建系统命令的点,然后精心构造包含恶意命令的输入数据。
例如,如果一个 Web 应用程序接受用户输入来执行文件搜索操作,代码可能类似于:
import os
user_input = input("请输入要搜索的文件名:")
os.system("find / -name " + user_input)
如果用户输入的不是正常的文件名,而是类似 test.txt; rm -rf / 这样的内容,那么系统在执行查找 test.txt 文件的命令同时,还会执行危险的删除根目录的命令 rm -rf / ,这就造成了严重的破坏。
以下是一些常用的命令注入绕过编码方式:
1. 空格代替:在 Linux 的 Bash 中,可以使用以下字符来代替空格:
• < 或 <>:重定向符,可起到空格的分隔作用。
• %20:表示空格的 URL 编码。
• %09:制表符(Tab)。
• $IFS$9、${IFS} 或 $IFS:$IFS 在 Linux 下表示分隔符,通过添加 {} 或 $9 等可以起到固定变量名或截断的作用,从而实现空格的替代。例如,cat${IFS}2 可替代 cat 2。
2. 截断符号:可以利用一些截断符号来绕过对命令的限制或连接多个命令。常见的截断符号包括:$、;、|、-、(、)、反引号、||、&&、&、}、{ 等。例如,ip=127.0.0.1;cat /home/flag.txt 中,通过 ; 截断了原命令,并在后面添加了执行读取 flag.txt 文件的命令。
3. 利用 base64 编码绕过:当系统过滤敏感字符时,可以先将敏感命令进行 base64 编码,然后在执行时进行解码。例如,被过滤的命令是 cat,可在终端执行 echo 'cat' | base64 得到编码后的字符串 Y2F0Cg== ,然后执行 echo 'Y2F0Cg==' | base64 -d | command ,其中 command 为要执行的具体命令,如查看文件 test.txt 的内容,即 echo 'Y2F0Cg==' | base64 -d | test.txt 。
4. 花括号的别样用法:在 Linux Bash 中,还可以使用 {OS_COMMAND,ARGUMENT} 来执行系统命令。例如,{echo,"Hello"} 等同于直接执行 echo "Hello" 。
5. 黑名单绕过:
• 拼接绕过:将命令或字符串拆分成多个部分,然后在目标环境中进行拼接。例如,a=l;b=s;$a$b 拼接后等同于 ls 命令。
• 编码绕过:除了 base64 编码,还可以使用十六进制(hex)、八进制(oct)等编码方式。例如,通过 echo "636174202f666c6167" | xxd -r -p|bash 可实现 cat /flag 的效果,其中 636174 是 cat 的十六进制编码,2f666c6167 是 /flag 的十六进制编码。
• 单引号和双引号绕过:例如,ca''t flag 或 ca""t flag 可能会绕过对特定命令的限制。
• 反斜线绕过:如果命令太长,可以使用 \ 进行换行输入,实现命令的绕过。例如,ca\t fl\ag 。
• 利用 Shell 特殊变量绕过:Linux shell 中的 $n 表示传递给脚本或函数的参数,n 是一个数字,表示第几个参数,参数不存在时其值为空;$@ 表示所有参数。例如,ca$@t fla$@g 或 ca$1t fla$2g 。
6. 通配符:合理运用通配符有时可以达到意想不到的效果。常用的 Linux shell 通配符包括:* 匹配任意字符(包括零个字符);? 匹配任意单个字符;[...] 匹配方括号之中的任意一个字符;{...} 匹配大括号里面的所有模式,模式之间使用逗号分隔;{start...end} 匹配连续字符。例如,cat fla* 可以匹配以 fla 开头的文件,cat${IFS}fl* 则使用 $IFS 绕过了空格限制并匹配以 fl 开头的文件。
需要注意的是,命令注入绕过的具体方法会受到目标系统的环境、应用程序的实现以及所施加的安全限制等多种因素的影响。同时,系统开发者和管理员应该采取适当的安全措施来预防和减轻命令注入漏洞,如输入验证、参数化查询、最小权限原则等。
代码执行:
产生 PHP 代码执行漏洞的常见原因包括:
不安全的用户输入处理:当 PHP 应用程序直接使用用户输入来动态包含文件、执行函数或操作变量,而没有进行充分的验证和过滤时,攻击者可以通过构造恶意输入来执行任意代码。
危险函数的不当使用:一些 PHP 函数如 eval() 、 assert() 、 preg_replace() (使用 /e 修饰符)等,如果使用不当,可能导致代码执行漏洞。例如,使用 eval() 函数直接执行用户输入的字符串。
文件包含漏洞:include() 、 require() 等文件包含函数,如果使用用户可控的输入来指定要包含的文件路径,而没有进行适当的验证,攻击者可以通过指定恶意的文件路径来执行任意代码。
反序列化漏洞:当 PHP 应用程序对不可信的序列化数据进行反序列化操作时,如果类的魔术方法(如 __wakeup() 、 __destruct() )存在安全问题,可能导致代码执行。
以下是一些在 PHP 中可能导致代码执行漏洞的函数及使用场景:
- eval() 函数:它将传入的字符串作为 PHP 代码进行执行。
示例:
eval('echo "Hello World!";')
风险:如果用户能够控制输入到 eval() 中的字符串,就可能执行任意恶意代码。
- assert() 函数:在断言为假时通常会产生错误,但当 assert_options(ASSERT_ACTIVE, 1) 且 assert_options(ASSERT_CALLBACK, 'callback_function') 被设置时,如果断言的表达式是字符串,会将其作为代码执行。
示例:
assert('echo "Dangerous!";')
风险:用户可控的输入传递给 assert() 可能导致代码执行。
- preg_replace() 函数(使用 /e 修饰符):用于执行正则表达式的搜索和替换,当使用 /e 修饰符时,替换部分可以作为 PHP 代码执行。
示例:
preg_replace('/(.*)/e', 'trtoupper($1)', 'hello')
风险:如果正则表达式的匹配部分或替换部分由用户控制,可能执行恶意代码。
- create_function() 函数:用于动态创建匿名函数。
示例:
$func = create_function('$x', 'echo $x;'); $func(5);
风险:函数体由用户输入构建时,可能带来风险。
在实际开发中,应尽量避免使用这些函数,或者在使用时确保输入的可控性和安全性,以防止代码执行漏洞的出现。
版权归原作者 2301_76964281 所有, 如有侵权,请联系我们删除。