[极客大挑战 2019]BuyFlag 1

[极客大挑战 2019]BuyFlag 1

这里我讲解以下php的两个函数吧:

  • is_numberic():就是判断括号里面的变量是不是数值
    漏洞绕过:is_numeric函数对于空字符%00,无论是%00放在前后都可以判断为非数值,而%20空格字符只能放在数值后。
    
  • int strcmp ( string $str1 , string $str2 )
    
    参数 str1第一个字符串。str2第二个字符串。如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。
    
    可知,传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 ,
    也就是虽然报了错,但却判定其相等
    
    
    strcmp函数漏洞:strcmp比较的是字符串类型,如果强行传入其他类型参数,会出错,出错后返回值0,正是利用这点进行绕过。
    比如:
    如下这段代码
    define('FLAG','pwnhub{this_is_flag}');
    if(strcmp($_GET['flag'],FLAG) == 0){
         echo "success,flag:".FLAG;
    }
    
    脚本意思是get到的flag和FLAG的值相等,就可以得到FLAG,但我们都不知道flag值是什么,利用strcmp函数特点尝试使用数组绕过。令flag[]=xxx
    
    flag[]=xxx 》》 strcmp比较出错 》》返回null 》》null==0 》》条件成立得到flag
    

    下面来个例题吧:

    实验环境:https://buuoj.cn/challenges#[极客大挑战 2019]BuyFlag

    我们打开这个页面会发现一段源代码

<!--
	~~~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>";
	}
}
-->

大概意思就是:将得到的password数据赋值给$password变量,然后判断$password不是纯数字,并且得$password==404

但是在php中“==”是弱类型比较
具体可以参考这个:https://www.cnblogs.com/mrsm1th/p/6745532.html
大致举个例子吧 404xxx == 404 就是只要前面是相等的后面接什么都一样,他会自动转成相同类型

然后就是我们在burpsuite里面抓包,将user=0改为user=1,这个应该是判别你是不是CUIT用户吧,一个身份辨别。然后下面传入post参数:password=404abc&money[]=1

然后就得到我们的flag了!!


posted @ 2021-07-07 10:11  胖三斤1  阅读(416)  评论(0编辑  收藏  举报
Live2D