从一道CTF题目谈PHP中的命令执行(php 命令执行)
qihemm 2025-08-03 08:02 4 浏览 0 评论
原创 Xenny 合天智汇
快睡的时候,打开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中的<?=xxx?>就可以将一个变量输出,那么如果使用它呢,你只需要构造如下的payload
valid = "1234567890!@$%^*(){}[];\'\",.<>/?-=_`~ "answer = "phpinfo"tmp1,tmp2 = '',''for c in answer: for i in valid: for j in valid: if (ord(i)^ord(j) == ord(c)): tmp1 += i tmp2 += j break else: continue breakprint(tmp1,tmp2)
这样就可以将变量$_里面的内容打印到屏幕上,而且关键的是这个输出方式默认是开启的,管理员很容易就忽视这个选项。所以在做题时不妨一试。
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,可点击“
http://www.hetianlab.com/pages/CTFLaboratory.jsp”,进入CTF实验室学习,里面涵盖了6个题目类型系统的学习路径和实操环境。
声明:笔者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关!
相关推荐
- VLOOKUP的18种高阶用法大公开!99%的人都不知道的神操作!
-
作为被头条用户催更的Excel课代表,今天带来让HR追着要模板、让老板主动加薪的VLOOKUP终极指南!从基础到高阶一网打尽,文末送36个行业专用模板!一、为什么你的VLOOKUP总报错?血泪大数据...
- Vlooup公式,2种模糊查找匹配,1分钟学会
-
工作中,VLOOKUP公式使用频率是很高的,用来各种查找匹配问题今天我们分享两种模糊查找匹配问题,一种是文本的模糊查找匹配,一种是数字的模糊查找匹配问题1、文本模糊查找匹配使用模拟数据举个例子,原始数...
- 与vlookup功能相似的函数,照样搞定表格数据查询,简单还实用
-
在日常表格数据处理工作,说到数据查询,很多小伙伴首先想到的是Vlookup函数,老师的教程中也多次讲到Vlookup函数的用法和实例。其实在Excel中还有其他的数据查询函数公式或技巧,今天我们先来学...
- 别再折腾VLOOKUP了!DGET逆向查找10秒通关,小白必看
-
今天要掀翻一个“过气网红”——VLOOKUP!你是不是也经历过这些崩溃瞬间:逆向查找要交换列顺序,复制粘贴到手软!多条件查找要嵌套MATCH,公式长到怀疑人生!别忍了!今天教你用DGET函数一键封...
- 职场新人必学!VLOOKUP函数10分钟速成指南
-
正文:"今天来讲解办公人入职期初函数VLOOKUP,这是所有职场人最重要也是最基础的技能。掌握它,90%的数据查找再不用求人!特别献给刚入职场的你——别让Excel成为加班理由。"——...
- 巧用Vlookup函数揪出“第三者”(vlookup第三个参数是什么)
-
在一张Excel表格的重复记录中,让你快速列出每种不同物品第2次或第n次出现的记录,你会怎么做?Vlookup函数就有这个本事。举例来说,产品或者物流表格中往往会记录有同一货物的多笔数据(如下图的今日...
- 分享12个VLOOKUP超经典用法(vlookup通俗易懂)
-
刚毕业那会,面试的时候经常会被问到会不会用Excel?我就理直气壮地回答:“会啊。”毕竟,简历上可是写着熟练。接着面试官扔出一句“那你会VLOOKUP吗?”我还是会一口咬定:“我会。“其实,我都没用过...
- 查找匹配别只知道Vlookup,Sumifs也可以!
-
工作中遇到查找匹配问题的时候,大家第一反应是不是都想到的Vlookup公式呢,有没有小伙伴们给Sumifs一点点机会的呢,有时候Sumifs比Vlookup更好用1、Vlookup公式举个例子,左边是...
- Excel函数讲解:VLOOKUP函数,轻松玩转数据查找
-
常用函数系列教学:VLOOKUP函数讲解(46)。不懂VLOOKUP函数怎么高效查找数据?闲话少叙直接开讲。基本含义:VLOOKUP函数用于在表格按垂直方向(到)上查找返回行数据。如何使用及注意事项?...
- CHOOSEROWS+CHOOSECOLS原来是一个超级查找函数组合!
-
场景一:要在学生名册中,抽查一名学生成绩。公式:=CHOOSEROWS(A1:D5,2)解析:第一参数A1:D5为数据区域,第二参数2表示提取第2行数据。把数据区域改为A2:D5,结合RANDBETW...
- 数据查询不止有vlookup函数,自定义zlookup函数查询操作更高效
-
Excel数据查询,相信大家首先会想到vlookup函数。毋庸置疑vlookup函数在Excel数据查询中作用是非常的强大。但是它也有一些不能实现的数据查询。如上图所示,我们需要根据人员的出现次数,提...
- 「EXCEL进阶」VLOOKUP函数怎么查询一个值返回多个结果
-
前言:VLOOKUP函数一般一次只能返回一个结果,本例介绍通过辅助列的方法使VLOOKUP函数查询一个值,返回这个值对应的多个结果。使用场景举例:根据表格中同一数值,返回对应值的多个结果。比如这张数据...
- WPS查找能手VLOOKUP函数使用方法讲解
-
各位同学好!今天我们来深度剖析WPS最实用的查找工具——VLOOKUP函数。这个函数能帮你在表格中快速定位并提取所需数据,可以帮你快速核对两批数据差异,还可以合并多个表格的关联信息,甚至可以帮你制作动...
- Excel常用10个函数:跨表查找Vlookup,适用于大数据中查找精确值
-
Hello大家好,我是Office米,今天,我们将和大家一起分享交流,常用的10个函数之一:查找引用函数VLOOKUP。在说VLOOKUP函数之前,我们要先了解,平时Excel日常工作中会遇到哪些问题...
- 掌握了这个套路,无论用 Excel vlookup 函数查找第几次结果都很轻松
-
用vlookup查找默认情况下是一对一出结果,如果要一对多查找,就需要用到各种技巧,具体方法我写过非常多了,可以搜索一下历史记录。只要掌握了今天这个套路,无论你想查找第几次重复值,都易如反掌。案例...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- VLOOKUP的18种高阶用法大公开!99%的人都不知道的神操作!
- Vlooup公式,2种模糊查找匹配,1分钟学会
- 与vlookup功能相似的函数,照样搞定表格数据查询,简单还实用
- 别再折腾VLOOKUP了!DGET逆向查找10秒通关,小白必看
- 职场新人必学!VLOOKUP函数10分钟速成指南
- 巧用Vlookup函数揪出“第三者”(vlookup第三个参数是什么)
- 分享12个VLOOKUP超经典用法(vlookup通俗易懂)
- 查找匹配别只知道Vlookup,Sumifs也可以!
- Excel函数讲解:VLOOKUP函数,轻松玩转数据查找
- CHOOSEROWS+CHOOSECOLS原来是一个超级查找函数组合!
- 标签列表
-
- 正版织梦模板 (30)
- 单片机c语言入门基础知识 (32)
- 手机编程游戏 (29)
- 优秀企业网站模板 (34)
- python编程入门自学书籍 (34)
- phpcms安装 (30)
- 自学excel免费视频教程全集 (36)
- php加密系统源码 (29)
- vlookup函数查找 (30)
- 电脑怎么下载java (32)
- vba编程实例速成150例 (30)
- 函数subtotal的用法 (31)
- java教程txt (32)
- java软件开发面试题 (30)
- sql数据库备份与还原方法 (33)
- 后台管理系统网站模板 (30)
- html表单属性有哪些 (31)
- 初中数学三角函数公式 (32)
- python爬虫教程 (30)
- 三角函数值对照表0到360度 (33)
- oracle数据库下载教程 (31)
- index函数什么意思 (34)
- indirect函数的详细用法 (31)
- excel函数round用法 (32)
- vlookup一对多查询并提取 (35)