浅谈 escapeshellarg 的利用
0 前言
escapeshellarg 的作用是把字符串转码为可以在 shell 命令里使用的参数。(escapeshellarg 和 escapeshellcmd 相似,主要看是否有引号)
在 CTF 可能被用于:
- 参数注入(开发人员错误的使用
escapeshellarg函数) - 逃逸字符(该函数非二进制安全)
1 参数注入
基本用法:
<?php
echo escapeshellarg('Hello');
// 输出值为:'Hello'
echo escapeshellarg('Hello\'');
// 输出值为:'Hello'\'''(在命令行使用 echo 'Hello'\''',只会输出 Hello')
即前言所说,会把字符串转码为 shell 中的参数。
这里摘录p牛的文章《谈escapeshellarg绕过与参数注入漏洞》中的几句关键的话
- 这个字符串应该出现在“参数值”的位置,而不是出现在参数选项(option)中。
- 单引号并不是区分一个字符串是“参数值”或“选项”的标准。
我们需要先理解一下“参数值”和“参数选项”。下面:
21:42:46 ubuntu @ VM-0-12-ubuntu in ~/document on git:(master) ✗
➜ cat -name
cat: invalid option -- 'a'
Try 'cat --help' for more information.
# 注意上面是 -- 'a',因为命令行在进行分析的时候,-n 被识别为 option
21:44:00 ubuntu @ VM-0-12-ubuntu in ~/document on git:(master) ✗
➜ cat --name
cat: unrecognized option '--name'
Try 'cat --help' for more information.
21:44:07 ubuntu @ VM-0-12-ubuntu in ~/document on git:(master) ✗
➜ cat name
cat: name: No such file or directory
-----------------------------------------------------------------
21:44:10 ubuntu @ VM-0-12-ubuntu

本文主要探讨了escapeshellarg函数的利用。该函数可将字符串转码为shell命令参数,在CTF中可能用于参数注入和逃逸字符。参数注入需函数参数可控且命令有执行选项;逃逸字符利用该函数非二进制安全的特性,通过不可见字符绕过正则检测,最终实现代码执行。
最低0.47元/天 解锁文章
802

被折叠的 条评论
为什么被折叠?



