千家信息网

如何从一道CTF题目谈PHP中的命令执行

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章给大家介绍如何从一道CTF题目谈PHP中的命令执行,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。快睡的时候,打开B站发现有位用户留言,大意就是让我帮忙看一道题,正好当时有
千家信息网最后更新 2026年10月31日如何从一道CTF题目谈PHP中的命令执行

这篇文章给大家介绍如何从一道CTF题目谈PHP中的命令执行,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

快睡的时候,打开B站发现有位用户留言,大意就是让我帮忙看一道题,正好当时有空,于是就打开了他发的链接,代码如下

很明显是一道PHP代码审计的题目,而且只需要绕过第三行的if即可进行任意命令执行。

解决思路

看了代码之后觉得是道普通的题目,对于/a-zA-Z/这个正则表达式,我们可以利用PHP动态函数的特性,构造出字符串即可。

对于想要的字符串,我们可以通过以下三种方式来构造:

1. 异或

对于PHP中的字符串,两个字符串异或的结果是将两个字符串逐位异或,返回一个新字符串。那么我们便可以使用此特性进行构造。

例如我们需要构造phpinfo,则可以用脚本得到('0302181', '@[@[_^^')这两个字符串,脚本如下:

其中valid是可用的字符,answer是我们需要构造的字符串。那么我们得到了这个字符串,又该如何去执行呢。我们可以通过一个变量存储两字符串异或后的值,再让这个变量进行动态函数执行即可,而变量的话因为PHP的变量命名规则和C语言相同,可以使用下划线进行命名,如下:

2. 取反构造

和第一种类似,都是基于PHP字符串位运算的特点(会逐位进行位运算)。而取反构造某些情况比异或构造要方便,因为异或的情况某些字符是无法直接通过其他字符进行异或构造的,而取反却可以利用汉字或者其他特殊字符进行构造(不会有题目会限制某个汉字吧)。比如字母s我们可以通过~('和'{2})得到。而这个时候如果要用异或去构造的话,你得找到两个异或值为s的特殊字符。

取反构造的脚本和异或构造类似,在此不再给出。

3. 自增构造

`++'a' == 'b'`

这个特点是利用了PHP是弱类型语言的特性,在对变量进行操作的时候,PHP会隐式的转换其变量类型,很多代码审计的题目也是利用了这一特性。

遇到障碍

有了上面的思路后,而且也成功执行了phpinfo(),下一步是不是就可以直接构造命令执行函数去进行读取文件,当时我也是这么想的,于是我构造了passthru(), system(), shell_exec(), exec()等函数,都受到了阻碍,没有回显,通过进一步的调试之后发现是禁用了这些函数(通过在函数后面加一个打印函数观察是否执行)。

在这里我停留了很久,试过打印$GLOBALS等都没有任何有用的信息。最后通过使用glob()函数进行目录扫描,发现了flag.php文件,以及file_get_contents()进行获取,最终的payload如下

?mess=$_="`0123"^"?`~``";${$_}[_](${$_}[__]);&_=assert&__=print_r(base64_encode(file_put_contents("flag.php")))

最后再将其界面就可以得到最终的flag了。在最终的payload中我没有去一个一个的构造字符串异或,因为那太长了,而是构造了一个$_POST[_]($_POST[__])的动态函数,这样就可以在其他参数位置直接写函数了。

深入分析

题目到这里就结束了,其实并没有多难,首先是通过特性去构造动态函数,然后发现了命令执行被禁用之后,能够知道使用其他函数去进行获取信息就行了。但是做完这道题后,不仅引发了我的思考,PHP中的命令执行就只有这些方式了吗,肯定不是。于是,我总结了几种新的命令执行技巧供大家参考。

1. 当打印函数被禁用时

如果没有了打印函数,意味着你无法看到回显,这时候即使命令执行成功了你也无法得到信息,这个时候你就得利用其他方式去获取回显了。

首先是网上很多blog使用的方式,phpinfo如果发现开启了curl,或者其他文件传输扩展的的话,可以自建一个靶机,将所有访问信息存入数据库或是文件,然后将回显信息发送到你的靶机地址,这样你去看日志就可以了,这种方式不是很方便而且有一定的局限性。这里我要介绍的是一种新的方式。

如果你使用过Django或者jsp开发web的话,你肯定知道输出一个变量可以使用{{xxx}}或是<%=xxx%>的方式,那么在PHP中是否也有这种方式呢,答案是肯定的,PHP中的就可以将一个变量输出,那么如果使用它呢,你只需要构造如下的payload

$_="xxx";?>

这样就可以将变量$_里面的内容打印到屏幕上,而且关键的是这个输出方式默认是开启的,管理员很容易就忽视这个选项。所以在做题时不妨一试。

2. 其他的命令执行方式

当system,passthru等不能用时,网上会告诉你可以使用popen,proc_open这些管道命令去进行执行命令,当然这没有问题,而这里我向你介绍一种新方式,使用反引号,在PHP中,被两个反引号括起来的内容将会作为shell命令执行,并将输出信息返回,所以你可以构造下面的payload进行命令执行

$_=`ls`;

3. 不能使用数字字母的命令执行

当不能使用字母数字时,当然你可以使用上述的方式构造字符串进行执行,但是这里提供一些新东西,对于linux中的shell是支持正则表达式的,当你忘记某些字符时可以通过? % *来代替,经过测试,这里的匹配方式也是按照顺序进行匹配,所以你可以查看你的linux中/bin目录下面的顺序,来获取一些可以使用的命令,比如

=> /bin/cat

那么这样的话,如果要获取/var/www/html/index.php(你得感谢apache默认目录如此之深),则可以直接使用来获取

这篇文章只是针对这道题而延展出的一些东西,在真正做题时,情况可能更加复杂,例如限制长度,限制参数等等情况,而我们的做法也不可能千篇一律,可能某些时候我们甚至会用到一些CVE漏洞。而本篇文章只是告诉读者一些可能以前没有见过的新东西。

关于如何从一道CTF题目谈PHP中的命令执行就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

字符 命令 函数 字符串 方式 变量 题目 信息 两个 时候 特性 一道 代码 内容 动态 可以通过 情况 文件 输出 东西 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 亿人帮互联网科技有限公司 互联网佳科技有限公司 重生之互联网科技帝国 金融科技 互联网金融 互联网金融公司科技 致骋互联网科技 苏州大垚互联网科技 互联网科技视频素材 深圳卡尔迅互联网科技有限公司怎么样 湖南洣水互联网科技有限公司扣款 宁夏科技产业互联网案例 互联网还是高科技吗 阿大互联网科技有限公司 互联网金融科技名词解释 银行科技岗属于互联网吗 皮皮虾互联网科技有限公司 四川互联网展示科技馆设计 西安左小互联网科技有限公司 同城互联网络科技 数字互联网科技有限公司 互联网与未来科技 卓越科技(互联网 ) 奔汉互联网科技 互联网养老 桔豆科技 以后互联网后是啥科技 成都铂石互联网科技做什么的 互联网为啥属于高科技 开一家科技互联网公司需要多少钱 易租星互联网科技有限公司 华人运通互联网科技公司
0