当前位置: 首页 > news >正文

命令执行讲解和函数

命令执行漏洞简介

命令执行漏洞产生原因

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

命令执行漏洞的危害

1.继承Web服务程序的权限去执行系统命会或读写文件
2.反弹shell,获得目标服务器的权限
3.进一步内网渗透

远程代码执行

因为业务需求,在PHP中有时需要调用一些执行命令的函数·如:eval0、assert0、preg_replace0、create_function0等,如果存在一个使用这些函数且未对可被用户控制的参数进行检查过滤的页面,那么这个页面就可能存在远程代码执行漏洞。

远程代码执行-eval函数

eval ( string $code )
把字符串 code 作为PHP代码执行

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

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

远程代码执行-assert函数

assert ( mixed $assertion [ string $description ])
检查一个断言是否为 FALSE,如果 assertion 是字符串,它将会被 assert0 当做 PHP 代码来执行

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

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

远程代码执行-preg_replace函数

preg_replace ( mixed $pattern , mixed $replacement , mixed $subject l int KaTeX parse error: Expected 'EOF', got '&' at position 19: …it = -1 l, int &̲count ]] )
执行一个正则表达式的搜索和替换,搜索subiect中匹配pattern的部分,以replacement进行替换

<?php preg_replace("/test/e",$_POST["cmd"],"just test"),?>

preg_replace(‘正则规则’,‘替换字符’, ‘目标字符’)
在这里插入图片描述
PCRE修饰符 e: preg_replace0在进行了对替换字符串的后向引用替换之后,将替换后的字符串作为php代码
评估执行(eval函数方式),并使用执行结果作为实际参与替换的字符串。
在这里插入图片描述
在这里插入图片描述

远程代码执行-array_map函数

array_map ( callable $callback , array $array1 [, array $…])
array_map0: 返回数组,是为 array1每个元素应用 callback函数之后的数组·callback 函数形参的数量和传给 array_map0 数组数量,两者必须一样·为数组的每个元素应用回调函数

<?php
$func=$_GET['func];
$cmd=$_POSTIcmd];
$array[0]=$cmd;
$new_array=array_map($func,$array):
echo Snew_array;
?>

远程代码执行-create_function函数

create_function ( string $args , string $code )
从传递的参数创建一个匿名函数,并为其返回唯一的名称。
通常这些参数将作为单引号分隔的字符串传递·使用单引号的原因是为了保护变量名不被解析,否则,如果
使用双引号,就需要转义变量名,例如 $avar

<?php
$func = create function(”,$_POST['cmd']):
$func();
?>

远程代码执行-call_user_func函数

call user_func ( callable $callback [, mixed $parameter [, mixed $… ]])
第一个参数 calback 是被调用的回调函数,其余参数是回调函数的参数·把第一个参数作为回调函数调

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

远程代码执行-array_filter函数

array_filter ( array $array [ callable $callback [, int $flag = 0 ]1)
用回调函数过滤数组中的单元依次将 array 数组中的每个值传递到 callback 函数

<?php
$cmd=$_POSTI'cmd];
$array1=array($cmd);
$func =$ GETI'func'l;
array_filter($array1,$func),
//用回调函数过滤数组中的元素 : array_filter(数组,函数)
//?func=system //cmd=whoami
?>

远程代码执行-双引号

<?php // echo "phpinfo()"; echo "{$(phpinfo()}}"; ?>

在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果单引号中的变量不会被处理,双引号中的函数不会被执行和替换

远程系统命令执行

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

远程系统命令执行

system(): 执行外部程序,并且显示输出
exec(): 执行一个外部程序
shell_exec(): 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回
passthru(): 执行unix乳统命令并且显示原始输出
pcntl_exec(): 在当前进程空间执行指定程序
popen(): 打开进程文件指针
proc_open(): 执行一个命令,并且打开用来输入/输出的文件指针。

远程系统命令执行-exec函数

exec ( string KaTeX parse error: Expected 'EOF', got '&' at position 17: …ommand l array &̲output [, int &$return var ]])
执行一个外部程序,exec( 执行 command 参数所指定的命令。
exec执行系统外部命令时不会输出结果,而是返回结果的最后一行·如果想得到结果,可以使用第二个参数,让其输出到指定的数组·此数组一个记录代表输出的一行。

远程系统命令执行-system函数

system ( string $command [, int &return_var ] )
函数执行 command 参数所指定的命令,并且输出执行结果
system在执行系统外部命令时,直接将结果输出到浏览器,如果执行命令成功则派回system和exec的区别在于,true,否则返回false。

远程系统命令执行-passthru函数

passthru ( string KaTeX parse error: Expected 'EOF', got '&' at position 16: command l, int &̲return var ])
执行外部程序并且显示原始输出,同exec0函数类似,passthru0 函数 也是用来执行外部命令(command)的
当所执行的 Unix 命令输出二进制数据 ,并且需要直接传送到浏览器的时候,需要用此函数来替代 exec0 或system0 函数。
passthru与system的区别: passthru直接将结果输出到浏览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。

远程系统命令执行-system函数

system ( string KaTeX parse error: Expected 'EOF', got '&' at position 15: command [ int &̲return_var ])
函数执行 command 参数所指定的命令·并且输出执行结果·
system和exec的区别在于·system在执行系统外部命令时·直接将结果输出到浏览器·如果执行命令成功则返回 true·否则返回false

远程系统命令执行

命令执行常用特殊字符

cmd1cmd2: 无论cmd1是否执行成功,cmd2将被执行
cmd1;cmd2: 无论cmd1是否执行成功,cmd2将被执行
cmd1llcmd2: 仅在cmd1执行失败时才执行cmd2
cmd1&&cmd2:仅在cmd1执行成功后时才执行
cmd2$(cmd) : echo $(whoami) 或者 $(touch test.sh; echo 'ls' > test.sh)
'cmd': 用于执行特定命令,如 whoami
>(cmd) : <(ls)
<(cmd) : >(ls)

相关文章:

  • 突破编程_C++_面试(基础知识(13))
  • Java 学习和实践笔记(11)
  • 【从Python基础到深度学习】4. Linux 常用命令
  • HarmonyOS鸿蒙学习基础篇 - Column/Row 组件
  • Vi 和 Vim 编辑器
  • 不等式的证明之一
  • 2023年哪个前端框架用的最多?
  • C++delete的使用/指针操作/内存/delete后该指针是否为空
  • vue-进阶语法(四)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第四天-ARM Linux编程之IIC与uart (物联技术666)
  • 蔚来面试解答
  • 【CV论文精读】【BEV感知】BEVFormer:通过时空Transformer学习多摄像机图像的鸟瞰图表示
  • 倒计时59天
  • C/C++中的max函数如何使用?哪个头文件?多个数字可以用max吗?
  • 【蓝桥杯单片机入门记录】LED灯(附多个例程)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Bytom交易说明(账户管理模式)
  • C++类的相互关联
  • GitUp, 你不可错过的秀外慧中的git工具
  • HTML中设置input等文本框为不可操作
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Laravel 菜鸟晋级之路
  • Linux下的乱码问题
  • Python进阶细节
  • Shell编程
  • vue总结
  • 百度地图API标注+时间轴组件
  • 测试如何在敏捷团队中工作?
  • 从零开始学习部署
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 反思总结然后整装待发
  • 力扣(LeetCode)21
  • 前端工程化(Gulp、Webpack)-webpack
  • 提醒我喝水chrome插件开发指南
  • 写代码的正确姿势
  • linux 淘宝开源监控工具tsar
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​​​​​​​​Γ函数
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $NOIp2018$劝退记
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (多级缓存)多级缓存
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • .NET Framework .NET Core与 .NET 的区别
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net6 Api Swagger配置
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .net中我喜欢的两种验证码
  • :O)修改linux硬件时间
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • @WebService和@WebMethod注解的用法
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [04] Android逐帧动画(一)
  • [2016.7.test1] T2 偷天换日 [codevs 1163 访问艺术馆(类似)]