>  기사  >  백엔드 개발  >  PHP 약한 유형에 대한 자세한 설명

PHP 약한 유형에 대한 자세한 설명

小云云
小云云원래의
2018-02-26 13:12:433168검색

최근 ctf 질문을 하다 보면 PHP 약한 유형에 대한 질문을 자주 접하게 됩니다. 이 글에서는 주로 PHP 약한 유형에 대한 요약을 공유하여 모든 사람에게 도움이 되기를 바랍니다.

지식 소개:

PHP에는 두 개의 비교 기호 == 및 ===

<?php$a = $b ;$a===$b ;
?>

===가 있습니다. 비교할 때 먼저 두 문자열의 유형이 같은지 확인한 다음 비교합니다.
== 비교할 때 문자열 유형을 먼저 동일한 유형으로 변환한 후 비교합니다. 숫자와 문자열을 비교하거나 숫자 내용이 포함된 문자열을 비교하면 문자열이 숫자 값으로 변환되어 비교됩니다. 숫자에 따라 진행하세요

php에서는 전달된 변수의 타입을 엄격하게 확인하지 않으며, 변수 타입을 자유롭게 변환할 수도 있습니다.

예를 들어 $a == $b

$a = null; $b = false; //为真  
$a = ''; $b = 0; //同样为真
의 비교에서 또한 값을 문자열과 비교하면 문자열이 값으로 변환됩니다

<?phpvar_dump("admin"==0);  //truevar_dump("1admin"==1); //truevar_dump("admin1"==1) //falsevar_dump("admin1"==0) //truevar_dump("0e123456"=="0e4456789"); //true ?>
1. 위의 코드 "admin. "== 0을 비교하면 admin을 숫자값으로 변환하여 강제 변환합니다. admin은 문자열이므로 변환 결과는 0이 되며 이는 당연히 0과 같습니다.

2, "1admin"==1 비교하면 1admin은 숫자로 변환되어 결과는 1이 되지만, "admin1"==1은 오류와 동일합니다. 즉, "admin1"이 로 변환됩니다. 0.

3 、"0e123456"=="0e456789"相互比较的时候,会将0e这类字符串识别为科学技术法的数字,0的无论多少次方都是零,所以相等。
应当注意的是: 当一个字符串欸当作一个数值来取值,其结果和类型如下:如果该字符串没有包含 '.' ,'e' , 'E',并且其数值值在整形的范围之内 该字符串被当作int来取值,其他所有情况下都被作为float来取值,该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

绕过类型
md5绕过(Hash比较缺陷)

<?php  if (isset($_GET[&#39;Username&#39;]) && isset($_GET[&#39;password&#39;])) {      $logined = true;      $Username = $_GET[&#39;Username&#39;];      $password = $_GET[&#39;password&#39;];
  
       if (!ctype_alpha($Username)) {$logined = false;}
       if (!is_numeric($password) ) {$logined = false;}
       if (md5($Username) != md5($password)) {$logined = false;}
       if ($logined){
     echo "successful";
       }else{
            echo "login failed!";
         }
     }
 ?>

题目大意是要输入一个字符串和数字类型,并且他们的md5值相等,就可以成功执行下一步语句

介绍一批md5开头是0e的字符串 上文提到过,0e在比较的时候会将其视作为科学计数法,所以无论0e后面是什么,0的多少次方还是0。md5('240610708') == md5('QNKCDZO')成功绕过!
==南邮ctf bypass again==
打开后看到代码:

if (isset($_GET['a']) and isset($_GET['b'])) {if ($_GET['a'] != $_GET['b'])if (md5($_GET['a']) == md5($_GET['b']))die('Flag: '.$flag);elseprint 'Wrong.';
}

源码要求提交两个不相等的值使他们的md5值严格相等。md5()函数要求接收一个字符串,若传递进去一个数组,则会返回null,即var_dump(md5(array(2))===null);值为bool(true)

可以向$_GET数组传入两个名为a、b的不相等的数组,从而导致md5()均返回空,于是得到flag。 构造url:http://chinalover.sinaapp.com/web17/index.php?a[]=0&b[]=1 json绕过

<?phpif (isset($_POST[&#39;message&#39;])) {    $message = json_decode($_POST[&#39;message&#39;]);    $key ="*********";
    if ($message->key == $key) {
        echo "flag";
    } 
    else {
        echo "fail";
    }
 } else{
     echo "~~~~";
 }
?>

输入一个json类型的字符串,json_decode函数解密成一个数组,判断数组中key的值是否等于 $key的值,但是$key的值我们不知道,但是可以利用0=="admin"这种形式绕过

最终payload message={"key":0}。

strcmp漏洞绕过

<?php
     $password="***************"
      if(isset($_POST[&#39;password&#39;])){ 
         if (strcmp($_POST[&#39;password&#39;], $password) == 0) {             echo "Right!!!login success";n             exit();
         } else {             echo "Wrong password..";
         } ?>

strcmp是比较两个字符串,如果str10 如果两者相等 返回0

我们是不知道$password的值的,题目要求strcmp判断的接受的值和$password必需相等,strcmp传入的期望类型是字符串类型,如果传入的是个数组会怎么样呢

我们传入 password[]=xxx 可以绕过 是因为函数接受到了不符合的类型,将发生错误,但是还是判断其相等

payload: password[]=xxx

相关推荐:

php弱类型语言中关于类型判断的实例分析

PHP弱类型安全问题总结

PHP弱类型变量是如何实现的

위 내용은 PHP 약한 유형에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.