2014-10-29 7 views
-3

Я работаю над проектом с несколькими друзьями. Наша задача в том, чтобы найти имя и пароль учетных данных, чтобы войти в фальшивой базеИмя пользователя SQL-запроса и пароль

Вот исходный код:

<?php 
include "config.php"; 
$con = mysqli_connect("localhost", "sql1", "sql1", "sql1"); 
$username = $_POST["username"]; 
$password = $_POST["password"]; 
$debug = $_POST["debug"]; 
$query = "SELECT * FROM users WHERE username='$username' AND password='$password'"; 
$result = mysqli_query($con, $query); 

if (intval($debug)) { 
    echo "<pre>"; 
    echo "username: ", htmlspecialchars($username), "\n"; 
    echo "password: ", htmlspecialchars($password), "\n"; 
    echo "SQL query: ", htmlspecialchars($query), "\n"; 
if (mysqli_errno($con) !== 0) { 
echo "SQL error: ", htmlspecialchars(mysqli_error($con)), "\n"; 
    } 
    echo "</pre>"; 
} 

if (mysqli_num_rows($result) !== 1) { 
    echo "<h1>Login failed.</h1>"; 
} else { 
    echo "<h1>Logged in!</h1>"; 
    echo "<p>Your flag is: $FLAG</p>"; 
} 

?> 

Проктор дал нам подсказку с просьбой «Что произойдет, если имя пользователя или пароль содержит апостроф '?

Я перепробовал все от ' or 1=1--

к вещам как ' OR a=1--

Если бы кто-нибудь мог помочь, я был бы очень признателен!

+0

А что случилось? Возможно, вы захотите добавить 'LIMIT 1', поскольку вы только проверяете, есть ли только одна строка, полученная – kero

+0

. Сначала вы должны проверить полученный контент, убедиться, что вы получили действительное имя пользователя и HASH PASSWORDS !! Тогда вы могли бы использовать функцию экранирования, такую ​​как addslashes(), но есть лучшие способы в зависимости от lib (здесь mysqli) – Loenix

+0

, то что вы предлагаете мне сделать, чтобы проверить содержание – TylerRutherford

ответ

0

ваша проблема находится в операторе отбора:

SELECT * FROM users WHERE username='$username' AND password='$password' 

Imagine пользователя указав имя ' OR 1=1 LIMIT 1 -- (обратите внимание на пробел после --) Он всегда будет точно возвращать один результат строки - так Логин действительно, причина запрос выполнен бы:

SELECT * FROM users WHERE username='' OR 1=1 LIMIT 1 -- ' AND password='$password' 

MySQL будет игнорировать комментарий, поэтому запрос:

SELECT * FROM users WHERE username='' OR 1=1 LIMIT 1 

Вы должны избежать значения перед их использованием:

$username = mysqli_real_escape_string($link, $_POST["username"]); 

Смотрите эту скрипку, как, например: http://sqlfiddle.com/#!2/fd8be/1 (One resultrow -> Ваша логика говорит: «авторизованы!» - даже не зная, любое имя пользователя и/или пароль.)

+1

Вы должны переписать это с помощью Подготовленных заявлений, и вы должны поговорить о Хэшировании пароля, иначе это не плохой ответ. – DampeS8N

+0

Эти учетные данные все еще недействительны. Что бы вы порекомендовали мне? – TylerRutherford

+1

@TylerRutherford. Первый шаг: просто повторить запрос, а не выполнять его, и проверить его на любые искаженные вещи. Затем вы можете * реконструировать * необходимую инъекцию. Но так как я не знаю, если вы попытаетесь внедрить свою собственную систему или что-то еще, я не стану выполнять эту задачу для вас :) – dognose

Смежные вопросы