极客大挑战2019_BuyFlag

[极客大挑战 2019]BuyFlag

0x00 过程

进到页面发现右上角一个菜单,发现二级页面buyflag,直奔主题。

根据提示发现买flag需要两个条件,一个是用户必须是CUIT,然后密码输对,最后要有足够的钱。这里只需要把cookie里的user=0改成user=1即可绕过用户限制。

查看源码发现密码提交的php代码:

1
2
3
4
5
6
7
8
//post money and password
if (isset($_POST['password'])) {
$password = $_POST['password'];
if (is_numeric($password)) {
echo "password can't be number</br>";
}elseif ($password == 404) {
echo "Password Right!</br>";
}

发现用到了is_numeric,这里判断password是否为数字,如果为数字则返回密码不能是数字,如果不是数字则会判断是否等于404,相等才会告知密码正确。

这就出现了矛盾点,首先不能是数字,而且密码还必须是404。不过我们可以通过在参数值前后加非数字值进行绕过,例如is_numeric(404%00),则会判断为字符串而不是数字。而双等号在php是弱比较,即404abcd==404为真。就可以绕过限制了。

但是我们还需要提交金钱,后面再加一个&money=100000000,发现做了限制:

还能通过常用绕过strcmp方法:money[]=1,这是因为strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,即在面对数组类型时会报错返回0来达到漏洞绕过。

这里也可以使用科学计数法,money=1e16来绕过。


极客大挑战2019_BuyFlag
https://k1nm0.com/2022/10/23/BuyYourFlag/
作者
K1nm0
发布于
2022年10月23日
许可协议