PHP代码审计学习-PHP-Audit-Labs-day4

前言

这篇主要介绍了strpos函数,说明了php中弱类型比较导致的安全隐患

strpos()函数

strpos — 查找字符串首次出现的位置
作用:主要是用来查找字符在字符串中首次出现的位置
False Beard题目中就存在一个判断问题
看下面代码

class Login {
  public function __construct($user, $pass) {
    $this->loginViaXml($user, $pass);
  }

  public function loginViaXml($user, $pass) {
    if (
      (!strpos($user, '<') || !strpos($user, '>')) &&
      (!strpos($pass, '<') || !strpos($pass, '>'))
    ) {
      $format = '<?xml version="1.0"?>' .
        '<user v="%s"/><pass v="%s"/>';
      $xml = sprintf($format, $user, $pass);
      $xmlElement = new SimpleXMLElement($xml);
      // Perform the actual login.
      $this->login($xmlElement);
    }
  }
}

new Login($_POST['username'], $_POST['password']);

因为strpos函数在判断时匹配到会返回下标0,没匹配到就返回false。根据上面代码,只要两个都为ture就能进入到下面格式化字符串部分。
所以!strpos($user, '<') || !strpos($user, '>')只要有一个为真即可,原本这里做了过滤不能出现<>符号,但由于strpos返回0,比较时会转换成false,从而造成XML注入。
payload:user=<"><injected-tag%20property="&pass=<injected-tag>

CTF练习题

这次题目采用的是Web-lottery这个题目,原题可以在攻防世界里面找到

function buy($req){  
    require_registered();  
    require_min_money(2);  
    $money = $_SESSION['money'];  
    $numbers = $req['numbers'];  
    $win_numbers = random_win_nums();  
    $same_count = 0;  
    for($i=0; $i<7; $i++){  
        if($numbers[$i] == $win_numbers[$i]){  
            $same_count++;  
        }  
    }

主要逻辑如上,这里因为用的是==号,所以比较可以绕过。

所以题解也很简单,只需要将输入的字符全部改为True即可。
payload:{"action":"buy","numbers":[true,true,true,true,true,true,true]}

小结

在php的弱类型比较很容易产生问题,在CTF比赛中比较常见,平时代码审计时也可以直接搜索比较判断处代码来找逻辑漏洞

posted @ 2021-01-17 22:39  kidicc  阅读(75)  评论(0编辑  收藏  举报