20201027 PHP文件包含弱类型比较(CTF)

20201027 PHP文件包含弱类型比较(CTF)

十一月 14, 2020

20201027 PHP文件包含弱类型比较(CTF)

出去游荡莫名奇妙的开始了ctf 写下本文做一个记录

image.png
猫猫挺可爱的

简单的页面浏览寻找到了文件包涵点(参数可控)
尝试包涵了本地文件均为失败

利用php伪协议 读取到源代码:
page=php://filter/read=convert.base64-encode/resource=flag

上面试了多个伪协议就这一个可以用,
获取到flag页面的源代码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$flag = file_get_contents('/flag');
//将整个文件读入一个字符串(读取文件的内容信息到字符串)
if (isset($_POST['flag'])) {
//isset检查法flag参数是否设置(检测变量是否已设置并且非 NULL)
if (!@strcmp($_POST['flag'], $flag)) {
//字符串内容比较 用@符号抑制了错误信息
echo 'okok, this is flag:' . $flag;
} else
echo ("你还是看猫去吧");
}
?>

唉,这题我属石是卡了半天,最后被某个dalao点通了

从开头看起:
取一个文件的flag的值,这个文件在根目录,然后先前各种读取操作发现根本无法实现(其实关键点也不再这个地方)
if(isset) 检测变量是否已设置并且非 NULL (这个函数是这道题的关键点)
strcmp — 二进制安全字符串比较 (改函数区分大小写,只接受字符串内容) @抑制函数错误信息(这里的if用上了一个!号)

解题流程:
绕过第一个if (isset) 这里是用的 flag[] 将变量设置为了一个数组 ,通过这个方式来报错绕过第二个函数,同时isset也成功绕过
(在php中(弱类型语言)里 flag[] 和flag 应该是一个介等于的关系 )

在第二函数报错的情况下返回数值应该为0 加上前面的! 即可反回1到if
​ #补充自己实验了 并未返回一个0 而是一个警告 <b>Warning</b>: strcmp() expects parameter 1 to be string, array given in <b>/var/www/html/test/1.php</b> on line <b>4</b><br />
​ if接受到错误信息就为假了(空信息)我已经思考不出来更好的答案了(确实也如此)
image.png
image.png
image.png

关于strcmp函数详情可了解:
https://www.php.net/manual/zh/function.strcmp.php