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