Мне задали вопрос, но я даже не могу начать отвечать, так может кто-нибудь дать мне представление о том, чтобы начать с того, как, возможно, ответить на него,
Я не ищу ответа только на некоторые учения о том, как ответить на него
здесь идет:
Предполагая, что "regsister_globals" и "magic_quotes_gpc" включены, что не так с этим фрагментом кода? Документируйте возможные отверстия, затем исправьте их, чтобы создать безопасную версию (есть 4 ошибки)
$p = $_GET["p"];
if ($sp == "index.php") {
if ($_get["id"] == 345)
$filter - addslashes($_get["id"]);
$sql = "SELECT * FROM users WHERE id = {$filter}";
$row - mydql_fetch_assoc(mysql_query($sql));
echo <<< HTML
<html>
...... user details .....
</html>
HTML.
} else
include ($p);
Это должно помочь вам:
Отверстие 1: register_globals должны быть отключены - это катастрофа безопасности.
$p = $_GET["p"];
// Where does $sp come from?
if ($sp == "index.php") {
// What the hell? So much wrong with these two lines
// 1. if id == 345 you don't need to addslashes
// 2. "-" should be "="
// 3. addslashes should be mysql_real_escape_string
// 4. the if() should be removed so it runs every time
if ($_get["id"] == 345)
$filter - addslashes($_get["id"]);
// SQL injection
$sql = "SELECT * FROM users WHERE id = {$filter}";
// Again with the "-" instead of "="
// Typo in the function name
// No error checking
$row - mydql_fetch_assoc(mysql_query($sql));
// No escaping of database input - vulnerable to XSS attacks
echo <<< HTML
<html>
...... user details .....
</html>
HTML. // Should be ; not .
} else
{
// I can include /etc/passwd by manipulating the URL
include ($p);
}
Чтобы запустить запуск Google для "SQL-инъекций" и "Проверка ввода", выполните следующие действия.
Учитывая среду,
"Если предположить," regsister_globals "а также" magic_quotes_gpc "включены"
Я считаю, что этот случай предназначен для того, чтобы научить вас рисковать обоими этими настройками.
В коде, который был обрезан, есть 4 ошибки, связанные с "Никогда не доверяйте ЛЮБОЙ информации, происходящей извне вашего script", в сочетании с вышеупомянутыми php-директивами.
(Существует намного больше ошибок, чем только 4 ошибки: существует пара "-
", которая должна быть "=
" и нижний регистр "_get
", который должен быть в верхнем регистре и т.д., но я предполагаю, что это просто опечатки.)
<?php
$allow_includes = array(
'some1', 'some2'
);
$p = $_GET["p"];
if ($p == "index.php") {
if ($_GET["id"] == 345) {
$filter = mysql_real_escape_string($_GET["id"]);
}
$sql = "SELECT * FROM users WHERE id = '{$filter}'";
$row = mysql_fetch_assoc(mysql_query($sql));
?>
HTML.
<?php
}
elseif ( in_array($p, $allow_includes) ) {
include ($p);
}
else {
echo "Error 404";
}
?>
Код уязвим для SQL-инъекций, потому что пользовательские данные не экранируются. Используйте mysql_real_escape_string
Попробуйте следующее:
<?php
$p = $_GET["p"];
if ($p == "index.php" && $_get["id"] == 345) {
$filter = mysql_real_escape_string($_get["id"]);
$sql = "SELECT * FROM users WHERE id = {$filter}";
$row = mysql_fetch_assoc(mysql_query($sql));
?>
<html>
...... user details .....
</html>
<?php
}
else if (strpos($p, '../')===false && file_exists($p)) {
include $p;
}
?>
mydql_fetch_assoc должен быть mysql_fetch_assoc