南邮 sql注入2

<?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函数

第一个字符串。测试

str2fetch

第二个字符串。加密

返回值code

若是 str1 小于 str2 返回 < 0; 若是 str1 大于 str2 返回 > 0;若是二者相等,返回 0。


从以上代码知道要获得flag有两个条件,其一 pw字段值必须能够查到,其二通过用户输入的密码通过md5加密必须和数据库中查询到的密码一致

在本地能够测试如下语句:

从结果中,咱们看到。若是sql语句中 " select username from user where username = 'sda' union select md5(3);"的前面的一个查询不正确,后面一个查询结果将会在前面一个查询字段里.

本题能够用此特性绕过判断,获得flag