GCCISC的三个WP

-------白茶、李泽邦

1.矛盾的要求呢

观察描述:robots php,思考可能和robots协议有关

进入网页看到如下:

image-20201126175506524

这段文字分成两部分,上半部分就是robots.txt之后的结果,我们可以尝试进入get_flag.php的页面,发现 Let's get the flag这句话。结合一开始看到的代码界面,就可以得出下半部分的php代码就是get_flag.php的代码。即我们需要通过GET方法传递a,b两个参数。

看到对于a参数的条件就是$a==0就行了,关键问题在于$b的判断条件【具体函数用法百度】。我们既要使b这个参数不是纯数字,又要让它大于6666,所以这就引出了PHP中的比较运算符的陷阱

这里贴一个官方手册https://www.php.net/manual/zh/language.operators.comparison.php,可以查询到字符串和数值比较的时候具体怎么转换的,然后我们根据条件构造出playload:b=20030107Breeze就可以

具体playload:image-20201126184804641

得到flag:gccisc{asfasigbiodwsgh}

2.2048

这题简单,直接干就完事

half

麻了,中道崩殂。

所以肝帝最后不打算干了,鼠标光标放在数字0处,右键然后选择“检查”,就可以发现HTML代码,修改得分:

image-20201126185254993

改就完事了:

image-20201126185358254

然后我们再移动一下方向键,就会弹出一个框:

complected

一眼就得出是base64编码,借用工具解码就可以得出:gccisc{baiusgasfasfasfbhouais}

3.绕过

进去又是直接代码,题目提示的很明显了:代码审计,说人话就是_看代码_。

image-20201126190204167

一些重要的点在图中已经标注出来了。

我们先看到下面的if判断,可以知道我们必须要noother_says_correct($_GET['key'])这个值为true,才可以echo $flag,所以我们就是要从函数入手。

看到函数中有两个返回的地方,而满足返回true的地方只有return $number == '54975581388';这就是告诉我们$number在最后的时候只能等于54975581388,而不能是其他的任何东西。

但是我们再回到return语句的上面,发现在函数中的一个if条件判断卡死了我们,最后我们得出了整个题目的关键就在于这个判断。只要我们能够通过各种奇淫技巧来绕过这个判断,就可以完美的得出flag了!!!!

总结一下:我们需要通过GET方法传递一个key参数,且参数必须得通过一定的变形,最后让它进入代码的return那行的时候为54975581388。

那么方法在哪里呢,有什么东西可以帮助我们这样子呢。

那就是进制转换。

在php中,在转码时会把16进制转化为十进制.

所以我们只需要将54975581388这串数字改成16进制,并且在前面加上0x,最后的playload就是:0xccccccccc

将它输入到框里面就可以爆出flag:gccisc{asfjga8gag8ga9r}