命令注入和代码实行的原理是相似的,它们都涉及到攻击者通过向应用程序提供恶意输入来控制应用程序实行系统命令或代码的本领。以下是它们的基本原理:
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 代码实行漏洞的常见原因包括:
1. 不安全的用户输入处理:当 PHP 应用程序直接使用用户输入来动态包罗文件、实行函数或操纵变量,而没有举行充实的验证和过滤时,攻击者可以通过构造恶意输入来实行任意代码。
2. 危险函数的不当使用:一些 PHP 函数如 eval() 、 assert() 、 preg_replace() (使用 /e 修饰符)等,如果使用不当,大概导致代码实行漏洞。比方,使用 eval() 函数直接实行用户输入的字符串。
3. 文件包罗漏洞:include() 、 require() 等文件包罗函数,如果使用用户可控的输入来指定要包罗的文件路径,而没有举行适当的验证,攻击者可以通过指定恶意的文件路径来实行任意代码。
4. 反序列化漏洞:当 PHP 应用程序对不可信的序列化数据举行反序列化操纵时,如果类的把戏方法(如 __wakeup() 、 __destruct() )存在安全题目,大概导致代码实行。
以下是一些在 PHP 中大概导致代码实行漏洞的函数及使用场景:
1. eval() 函数:它将传入的字符串作为 PHP 代码举行实行。
示例:
- eval('echo "Hello World!";')
复制代码 风险:如果用户能够控制输入到 eval() 中的字符串,就大概实行任意恶意代码。
2. assert() 函数:在断言为假时通常会产生错误,但当 assert_options(ASSERT_ACTIVE, 1) 且 assert_options(ASSERT_CALLBACK, 'callback_function') 被设置时,如果断言的表达式是字符串,会将其作为代码实行。
示例:
- assert('echo "Dangerous!";')
复制代码 风险:用户可控的输入通报给 assert() 大概导致代码实行。
3. preg_replace() 函数(使用 /e 修饰符):用于实行正则表达式的搜刮和更换,当使用 /e 修饰符时,更换部分可以作为 PHP 代码实行。
示例:
- preg_replace('/(.*)/e', 'trtoupper($1)', 'hello')
复制代码 风险:如果正则表达式的匹配部分或更换部分由用户控制,大概实行恶意代码。
4. create_function() 函数:用于动态创建匿名函数。
示例:
- $func = create_function('$x', 'echo $x;'); $func(5);
复制代码 风险:函数体由用户输入构建时,大概带来风险。
在实际开发中,应只管克制使用这些函数,大概在使用时确保输入的可控性和安全性,以防止代码实行漏洞的出现。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |