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

escapeshellarg参数绕过和注入的问题

escapeshellcmd

escapeshellcmd(string $command): string

command--要转义的命令。

escapeshellcmd() 对字符串中可能会欺骗 shell 命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec() 或 system() 函数,或者 执行操作符 之前进行转义。

反斜线(\)会在以下字符之前插入:&#;`|*?~<>^()[]{}$\\x0A\xFF'" 仅在不配对儿的时候被转义。在 Windows 平台上,所有这些字符以及 %! 字符前面都有一个插入符号(^)。

escapeshellarg

escapeshellarg(string $arg): string

arg--需要被转义的参数

escapeshellarg() 把字符串转义为可以在 shell 命令里使用的参数

escapeshellarg() 将给字符串增加一个单引号并且能引用或者转义任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的。对于用户输入的部分参数就应该使用这个函数。shell 函数包含exec()、system() 和执行运算符 。

在 Windows 上,escapeshellarg() 用空格替换了百分号、感叹号(延迟变量替换)和双引号,并在字符串两边加上双引号。此外,每条连续的反斜线(\)都会被一个额外的反斜线所转义。

shell函数

 shell 函数包含exec()、system() 和执行运算符

system()

在windows系统中,system函数直接在控制台调用一个command命令。

执行运算符:

PHP 支持一个执行运算符:反引号(` `)

PHP 将尝试将反引号中的内容作为 shell 命令来执行,并将其输出信息返回。使用反引号运算符“`”的效果与函数 shell_exec() 相同

exec():

exec() 执行 command 参数所指定的命令。

exec(string $command, array &$output = null, int &$result_code = null): string|false

 command

要执行的命令。

 output

如果提供了 output 参数, 那么会用命令执行的输出填充此数组

 result_code

如果同时提供 outputresult_code 参数,命令执行后的返回状态会被写入到此变量

参数注入

  基本用法:
<?phpecho escapeshellarg('Hello');
// 输出值为:'Hello'echo escapeshellarg('Hello\'');
// 输出值为:'Hello'\'''(在命令行使用 echo 'Hello'\''',只会输出 Hello')
关键的话

引用自谈escapeshellarg绕过与参数注入漏洞 | 离别歌

  • 这个字符串应该出现在“参数值”的位置,而不是出现在参数选项(option)中。
  • 单引号并不是区分一个字符串是“参数值”或“选项”的标准

 接下来我们好好理解一下这句话

参数和参数选项的区别
参数:参数值是在命令行或函数调用中,用来传递具体数据或信息给程序或函数的部分。它是某个参数的实际取值
参数选项:参数选项是用来配置程序或函数行为的标志或开关。它不包含具体的数值,而是用于启用或禁用某些功能
实例:

Linux 中通常使用 - 或者 -- 来作为选项(Option)的标识符

而如果没有name,cat就变成了参数

也可以取消这种差异,我们在中间加--即可

总结

在了解“参数”和“选项”后,我们可知在命令后使用 escapeshellarg 并不能阻止命令执行(参数和选项并不依靠单引号)

gitlist 0.6.0远程命令执行漏洞,下面是该项目在执行过程中生成的命令:

git grep -i --line-number -e '--open-files-in-pager=id;' master
# 其中 --open-files-in-pager 的参数会被执行。

escapeshellarg 可以逃逸并达到执行命令的关键:

  • 函数参数可控
  • 执行的命令中有执行命令的选项(类似 “–open-files-in-pager=id;” 的等号形式)

逃逸字符

例题:

<?php$payload = '';
$code = urldecode($payload);function filter($str)
{if (preg_match("/system|exec|passthru|shell_exec|pcntl_exec|bin2hex|popen|scandir|hex2bin|[~$.^_`]|\'[a-z]|\"[a-z0-9]/i", $str)) {return false;} else {return true;}
}if (filter($code) == 1) {eval($code . ";");
} else {die("18cm30p !! :< ");
}

在题目中过滤了很多命令执行的函数。还有两段比较关键的正则\'[a-z]和\"[a-z0-9],也就是字母无法和引号接触。

通常这种正则的绕过,都是采用编码转义的方式来绕过的。

    1.不可见字符又可以让 preg _match 函数中的正则检测失效
    2.escapeshellcmd又可以将不可见字符消除
    3.最终 eval 能执行正常的字符串。
 

文章内容参考见:

谈escapeshellarg绕过与参数注入漏洞 | 离别歌

浅谈CTF中escapeshellarg的利用_escapeshellarg 绕过-CSDN博客

PHP: escapeshellarg - Manual

http://www.lryc.cn/news/260505.html

相关文章:

  • CSS——标准流、浮动、Flex布局
  • P21 类神经网络训练不起来怎么办- 自动调整学习率 Adapative learning rate
  • [Linformer]论文实现:Linformer: Self-Attention with Linear Complexity
  • 【Jeecg Boot 3 - 第二天】1.1、后端 docker-compose 部署 JEECGBOOT3
  • Centos单用户模式修改root密码
  • [Unity]关于Unity接入Appsflyer并且打点支付
  • AICore 带来了 Android 专属的 AI 能力,它要解决什么?采用什么架构思路?
  • python学习1
  • 【SpringBoot】Spring Boot 单体应用升级 Spring Cloud 微服务
  • el-tree搜索的使用
  • Java使用Microsoft Entra微软 SSO 认证接入
  • “华为杯”研究生数学建模竞赛2016年-【华为杯】A题:无人机在抢险救灾中的优化运用(附获奖论文及MATLAB代码实现)
  • 17--异常处理
  • 数据结构 | c++编程实现求二叉树的叶节点的个数。(递归非递归)
  • python读取csv文件
  • 租一台服务器多少钱决定服务器的价格因素有哪些
  • 深度学习(生成式模型)——ADM:Diffusion Models Beat GANs on Image Synthesis
  • Ubuntu无法解析域名DNS指向127.0.0.53问题处理
  • Intewell-Hyper I_V2.0.0_release版本正式发布
  • Mysql mybatis 语法示例
  • 第77讲:二进制方式搭建MySQL数据库5.7版本以及错误日志管理
  • R语言,table()函数实现统计每个元素出现的频数+并将最终统计频数结果转换成dataframe数据框形式
  • 微信小程序uniapp记住密码
  • 喜报!Coremail荣获2023信创“大比武”优秀生态融合奖
  • 知识库SEO:提升网站内容质量与搜索引擎排名的策略
  • GPIO复用时5个调试接口引脚要注意
  • 华为云CodeArts Check常见问答汇总
  • linux 应用开发笔记---【信号:基础】
  • 区块链:改变世界的技术
  • 防御升级!SMC2助力企业高效应对邮箱安全挑战