web安全之命令执行

简介: 应用未对用户输入做严格得检查过滤,导致用户输入得参数被当成命令来执行。

命令执行漏洞简介

  • 原因

应用未对用户输入做严格得检查过滤,导致用户输入得参数被当成命令来执行。

  • 危害

1. 继承Web服务程序的权限去执行系统命令或读写文件

2. 反弹shell,获得目标服务器的权限

3. 进一步内网渗透

  • 远程代码执行

因为业务需求,在PHP中有时需要调用一些执行命令的函数,如: eval()assert() preg_replace() create_function() 等,如果存在一个使用这些

函数且未对可被用户控制的参数进行检查过滤的页面,那么这个页面就可能存在远程代码执行漏洞。

PHP代码执行函数

1. eval

eval ( string $code )

把字符串 code 作为PHP代码执行

示例:

<?php @eval($_POST['cmd']);?>

注意:eval() 函数传入的参数必须为PHP代码,即要以分号结尾;函数eval()语言结构是非常危险的, 因为它允许执行任意 PHP 代码。不要允许传入任何由用户提供的、未经完整验证过的数据 。

2. assert

assert ( mixed $assertion [, string $description ] )

如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

示例:

<?php @assert($_POST['cmd'])?>

注意assert()函数是直接讲传入的参数当成PHP代码执行,不需要以分号结尾

3. preg_replace

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed

执行一个正则表达式的搜索和替换,搜索 subject 中匹配 pattern 的部分, 以replacement 进行替换。

示例:

<?php
preg_replace("/test/e",$_POST["cmd"],"just test");
//preg_replace('正则规则','替换字符','目标字符')
//PCRE修饰符 e :preg_replace()在进行了对替换字符串的后向引用替换之后, 
//将替换后的字符串作为php代码评估执行(eval函数方式), 并使用执行结果作为实
际参与替换的字符串。
?>

链接:PHP正则表达式

4. create_function

create_function( string $args , string $code )

从传递的参数创建一个匿名函数,并为其返回唯一的名称。

通常这些参数将作为单引号分隔的字符串传递。使用单引号的原因是为了保护变量名不被解析,否则,如果使用双引号,就需要转义变量名,例如$avar

示例:

<?php 
$func = create_function('',$_POST['cmd']);$func();
//创建匿名函数执行代码
?>

5. call_user_func

call_user_func ( callable $callback [, mixed $parameter [, mixed $... ]] )

把第一个参数作为回调函数调用。

第一个参数 callback 是被调用的回调函数,其余参数是回调函数的参数。

示例:

<?php
call_user_func("assert",$_POST['cmd']);
//传入的参数作为assert函数的参数
//cmd=system(whoami)
?>

系统命令执行

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后后台会对IP地址进行一次ping测试,并返回测试结果。 而,如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交恶意命令,让后台进行执行,从而获得后台服务器权限。


PHP系统命令执行函数

利用PHP 的系统命令执行函数来调用系统命令并执行,这类函数有 system()、exec()shell_exec()passthru()penti_exec()popen()proc_pen()等,此外还有反引号命令执行,这种方式实际上是调用 shell_exec()函数来执行。


system():执行外部程序,并且显示输出;

exec():执行一个外部程序

shell_exec():通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

passthru():执行unix系统命令并且显示原始输出

pcntl_exec():在当前进程空间执行指定程序

popen():打开进程文件指针

proc_open():执行一个命令,并且打开用来输入/输出的文件指针。


PHP提供4个专门的执行外部命令的函数:

exec()

system()

passthru()

shell_exec()

1. exec

exec ( string $command [, array &$output [, int &$return_var ]] )

执行一个外部程序,exec() 执行 command 参数所指定的命令。

exec执行系统外部命令时不会输出结果,而是返回结果的最后一行。如果想得到结果,可以使用第二个参数,让其输出到指定的数组。此数组一个记录代表输出的一行。即如果输出结果有20行,则这个数组就有20条记录,所以如果需要反复输出调用不同系统外部命令的结果,最好在输出每一条系统外部命令结果时清空这个数组unset($output) ,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

示例:

<?php
// 输出运行中的 php/httpd 进程的创建者用户名
// (在可以执行 "whoami" 命令的系统上)
// echo exec('whoami');
// exec('ls -la', $return);
// var_dump($return);
$cmd=$_POST['cmd'];
@exec($cmd, $return);
var_dump($return)
?>

2. system

system ( string $command [, int &$return_var ] )

函数执行 command 参数所指定的命令, 并且输出执行结果。

systemexec的区别在于,system在执行系统外部命令时,直接将结果输出到浏览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。

示例:

<?php
echo '<pre>';
// 输出 shell 命令 "ls" 的返回结果
// 并且将输出的最后一样内容返回到 $last_line。
// 将命令的返回值保存到 $retval。
$last_line = system('ls', $retval);
?>

3. passthru

passthru ( string $command [, int &$return_var ] )

执行外部程序并且显示原始输出

exec()函数类似,passthru() 函数 也是用来执行外部命令(command)的,如果要获取一个命令未经任何处理的原始输出, 请使用 passthru() 函数。

当所执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数来替代 exec() system() 函数。

passthrusystem的区别:passthru直接将结果输出到浏览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。

示例:

<?php
$output = passthru("ls -la");
echo "<pre>$output</pre>";
?>

4. shell_exec

shell_exec ( string $cmd ) 

通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

本函数同 执行操作符(`)。

示例:

<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>

命令执行常用特殊字符


cmd1|cmd2:无论cmd1是否执行成功,cmd2将被执行

cmd1;cmd2:无论cmd1是否执行成功,cmd2将被执行

cmd1||cmd2:仅在cmd1执行失败时才执行cmd2

cmd1&&cmd2:仅在cmd1执行成功后时才执行

cmd2$(cmd) echo $(whoami) 或者 $(touch test.sh; echo 'ls' > test.sh)

'cmd':用于执行特定命令,如 'whoami'

>(cmd)<(ls)

<(cmd):>(ls)

目录
相关文章
|
19天前
|
缓存 安全 JavaScript
掌握JAMstack:构建更快、更安全的Web应用
JAMstack 是一种现代 Web 开发架构,结合 JavaScript、APIs 和 Markup,创建更快、更安全的 Web 应用。其核心优势包括高性能、安全性、可扩展性和易维护性。JAMstack 通过预构建静态页面和 API 实现高效渲染,利用静态站点生成器如 Gatsby 和 Next.js,并借助 CDN 和缓存策略提升全球访问速度。尽管面临复杂交互、SEO 和数据更新等挑战,但通过 Serverless Functions、预渲染和实时 API 更新等方案,这些挑战正逐步得到解决。
|
1月前
|
SQL 安全 数据库
惊!Python Web安全黑洞大曝光:SQL注入、XSS、CSRF,你中招了吗?
在数字化时代,Web应用的安全性至关重要。许多Python开发者在追求功能时,常忽视SQL注入、XSS和CSRF等安全威胁。本文将深入剖析这些风险并提供最佳实践:使用参数化查询预防SQL注入;通过HTML转义阻止XSS攻击;在表单中加入CSRF令牌增强安全性。遵循这些方法,可有效提升Web应用的安全防护水平,保护用户数据与隐私。安全需持续关注与改进,每个细节都至关重要。
92 5
|
1月前
|
JSON 安全 JavaScript
Web安全-JQuery框架XSS漏洞浅析
Web安全-JQuery框架XSS漏洞浅析
203 2
|
1月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,却也面临着SQL注入、XSS与CSRF等安全威胁。本文将剖析这些常见攻击手段,并提供示例代码,展示如何利用参数化查询、HTML转义及CSRF令牌等技术构建坚固防线,确保Python Web应用的安全性。安全之路永无止境,唯有不断改进方能应对挑战。
53 5
|
1月前
|
SQL 安全 数据安全/隐私保护
Python Web安全大挑战:面对SQL注入、XSS、CSRF,你准备好了吗?
在构建Python Web应用时,安全性至关重要。本文通过三个真实案例,探讨了如何防范SQL注入、XSS和CSRF攻击。首先,通过参数化查询替代字符串拼接,防止SQL注入;其次,利用HTML转义机制,避免XSS攻击;最后,采用CSRF令牌验证,保护用户免受CSRF攻击。这些策略能显著增强应用的安全性,帮助开发者应对复杂的网络威胁。安全是一个持续的过程,需不断学习新知识以抵御不断变化的威胁。
80 1
|
1月前
|
SQL 安全 数据库
深度揭秘:Python Web安全攻防战,SQL注入、XSS、CSRF一网打尽!
在Web开发领域,Python虽强大灵活,但安全挑战不容小觑。本文剖析Python Web应用中的三大安全威胁:SQL注入、XSS及CSRF,并提供防御策略。通过示例代码展示如何利用参数化查询、HTML转义与CSRF令牌构建安全防线,助您打造更安全的应用。安全是一场持久战,需不断改进优化。
35 3
|
15天前
|
监控 安全 Apache
构建安全的URL重定向策略:确保从Web到App平滑过渡的最佳实践
【10月更文挑战第2天】URL重定向是Web开发中常见的操作,它允许服务器根据请求的URL将用户重定向到另一个URL。然而,如果重定向过程没有得到妥善处理,可能会导致安全漏洞,如开放重定向攻击。因此,确保重定向过程的安全性至关重要。
27 0
|
16天前
|
云安全 SQL 安全
数字时代下的Web应用程序安全:漏洞扫描服务的功能与优势
在当今这个数字化时代,Web应用程序不仅是企业与用户之间互动的桥梁,更是企业展示服务、传递价值的核心平台。然而,随着技术的不断进步,Web应用程序的复杂性也在不断增加,这为恶意攻击者提供了可乘之机。安全漏洞的频发,如SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)等,严重威胁着企业的数据安全、服务稳定性乃至经济利益。在这样的背景下,漏洞扫描服务作为一道重要的安全防线,显得尤为重要。本文将深入探讨漏洞扫描服务在面对Web应用程序安全问题时,所具备的功能优势。
|
1月前
|
SQL 安全 数据库
从入门到精通:Python Web安全守护指南,SQL注入、XSS、CSRF全防御!
【9月更文挑战第13天】在开发Python Web应用时,安全性至关重要。本文通过问答形式,详细介绍如何防范SQL注入、XSS及CSRF等常见威胁。通过使用参数化查询、HTML转义和CSRF令牌等技术,确保应用安全。附带示例代码,帮助读者从入门到精通Python Web安全。
66 6
|
1月前
|
SQL 安全 JavaScript
告别Web安全小白!Python实战指南:抵御SQL注入、XSS、CSRF的秘密武器!
【9月更文挑战第12天】在Web开发中,安全漏洞如同暗礁,尤其对初学者而言,SQL注入、跨站脚本(XSS)和跨站请求伪造(CSRF)是常见挑战。本文通过实战案例,展示如何利用Python应对这些威胁。首先,通过参数化查询防止SQL注入;其次,借助Jinja2模板引擎自动转义机制抵御XSS攻击;最后,使用Flask-WTF库生成和验证CSRF令牌,确保转账功能安全。掌握这些技巧,助你构建更安全的Web应用。
33 5