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 |