<?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 "<p>Logged in! Key: ntcf{**************} </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
首先讲一下strcasecmp()函数
说明
int strcasecmp ( string $str1
, string $str2
)
二进制安全比较字符串(不区分大小写)。
参数
str1
第一个字符串。
str2
第二个字符串。
返回值
如果 str1
小于 str2
返回 < 0; 如果 str1
大于 str2
返回 > 0;如果两者相等,返回 0。
从以上代码知道要得到flag有两个条件,其一 pw字段值必须可以查到,其二经过用户输入的密码经过md5加密必须和数据库中查询到的密码一致
在本地可以测试以下语句:
从结果中,我们看到。如果sql语句中 " select username from user where username = 'sda' union select md5(3);"的前面的一个查询不正确,后面一个查询结果将会在前面一个查询字段里.
本题可以用此特性绕过判断,得到flag