Description

Category: Misc/Secure Coding

Source: TAMUctf 2019

Points: 454

Description:

https://gitlab.tamuctf.com/root/sql

Write-up

PWN 문제와 비슷하게 Secure Coding을 확인하면 된다.

주어진 Project를 fork해서 코드를 살펴보자. (PWN 문제와 마찬가지로 팀 계정으로 로그인 할 수 있다.)

Project 코드를 fork 한 후, 문제 코드를 살펴보자. 봐야할 것 같은 코드는 login.php 하나 밖에 없다.

<?php
  ini_set('display_errors', 'On');
  error_reporting(E_ALL | E_STRICT);
  echo "<html>";
  if (isset($_POST["username"]) && isset($_POST["password"])) {
    $servername = "localhost";
    $username = "sqli-user";
    $password = 'AxU3a9w-azMC7LKzxrVJ^tu5qnM_98Eb';
    $dbname = "SqliDB";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error)
        die("Connection failed: " . $conn->connect_error);
    $user = $_POST['username'];
    $pass = $_POST['password'];
    $sql = "SELECT * FROM login WHERE User='$user' AND Password='$pass'";
    if ($result = $conn->query($sql))
    {
      if ($result->num_rows >= 1)
      {
        $row = $result->fetch_assoc(); 
        echo "You logged in as " . $row["User"];
        $row = $result->fetch_assoc();
        echo "<html>You logged in as " . $row["User"] . "</html>\n";
      }
      else {
        echo "Sorry to say, that's invalid login info!";
      }
    }
    $conn->close();
  }
  else
    echo "Must supply username and password...";
  echo "</html>";
?>

위와 같은 코드가 주어지는데, 가만 보면 sql문에서 입력받은 문자열을 그대로 query에 집어넣기 때문에 sql injection이 가능하다는 취약점이 있다.

이 부분을 prepared statement를 이용해서 안전하게 수정해보자.

<?php
  ini_set('display_errors', 'On');
  error_reporting(E_ALL | E_STRICT);
  echo "<html>";
  if (isset($_POST["username"]) && isset($_POST["password"])) {
    $servername = "localhost";
    $username = "sqli-user";
    $password = 'AxU3a9w-azMC7LKzxrVJ^tu5qnM_98Eb';
    $dbname = "SqliDB";
    $conn = new mysqli($servername, $username, $password, $dbname);
    if ($conn->connect_error)
        die("Connection failed: " . $conn->connect_error);
    $user = $_POST['username'];
    $pass = $_POST['password'];
    $stmt = $conn->prepare("SELECT User FROM login WHERE User = ? AND Password = ?");
    $stmt->bind_param("ss", $user, $pass);
    $stmt->execute();
    $stmt->store_result();
    $stmt->bind_result($username);
    if ($stmt->fetch())
    {
      echo "You logged in as " . $username;
      echo "<html>You logged in as " . $username . "</html>\n";
    }
    else {
      echo "Sorry to say, that's invalid login info!";
    }
    $stmt->close();
    $conn->close();
  }
  else
    echo "Must supply username and password...";
  echo "</html>";
?>

원래의 코드와 동일한 동작을 수행하도록 위와 같이 코드를 수정해서 commint 하면 CI/CD 메뉴에서 flag를 확인할 수 있다.

Flag : gigem{the_best_damn_sql_anywhere}

'writeups > Coding|misc.' 카테고리의 다른 글

Project Eulernt  (0) 2019.11.26
Who do I trust?  (0) 2019.11.25
plz variable  (0) 2019.11.25
input  (0) 2019.11.25
algo-auth  (0) 2019.11.25

+ Recent posts