Как мне продемонстрировать SQL-инъекцию второго порядка?

Поэтому я пытался повторить SQL-инъекцию второго порядка. Вот пример шаблона двух сайтов на основе php, который я подготовил. Давайте просто назовем это формой регистрации избирателей. Пользователь может зарегистрироваться, а затем вы можете проверить, являетесь ли вы зарегистрированным избирателем или нет.

insert.php

<?php

$db_selected = mysql_select_db('canada',$conn);
if (!db_selected)
    die("can't use mysql: ". mysql_error());

$sql_statement = "INSERT into canada (UserID,FirstName,LastName,Age,State,Town)
                    values ('".mysql_real_escape_string($_REQUEST["UserID"])."',
                    '".mysql_real_escape_string($_REQUEST["FirstName"])."',
                    '".mysql_real_escape_string($_REQUEST["LastName"])."',
                    ".intval($_REQUEST["Age"]).",
                    '".mysql_real_escape_string($_REQUEST["State"])."',
                    '".mysql_real_escape_string($_REQUEST["Town"])."')";

echo "You ran the sql query=".$sql_statement."<br/>";
$qry = mysql_query($sql_statement,$conn) || die (mysql_error());
mysql_close($conn);
Echo "Data inserted successfully";
}
?>

select.php

<?php


$db_selected = mysql_select_db('canada', $conn);
if(!db_selected)
    die('Can\'t use mysql:' . mysql_error());
$sql = "SELECT * FROM canada WHERE UserID='".addslashes($_POST["UserID"])."'";
echo "You ran the sql query=".$sql."<br/>";
$result = mysql_query($sql,$conn);
$row=mysql_fetch_row($result);

$sql1 = "SELECT * FROM canada WHERE FirstName = '".$row[1]."'";
echo "The web application ran the sql query internally=" .$sql1. "<br/>";
$result1 = mysql_query($sql1, $conn);
$row1 = mysql_fetch_row($result1);

mysql_close($conn);
echo "<br><b><center>Database Output</center></b><br><br>";

echo "<br>$row1[1] $row1[2] , you are a voter! <br>";

echo "<b>VoterID: $row[0]</b><br>First Name: $row[1]<br>Last Name: $row[2]
    <br>Age: $row[3]<br>Town: $row[4]<br>State: $row[5]<br><hr><br>";
}
?>

Поэтому я намеренно сделал это уязвимым, чтобы показать, как работает SQL-инъекция второго порядка. Пользователь может ввести код в раздел имени (где я сейчас застрял, я пробовал много разных способов, но, похоже, не могу получить это делать что угодно). Затем, когда человек хочет активировать код, который он вставил в первый раздел имени, все, что ему нужно сделать, это просто ввести идентификатор пользователя, и код будет вставлен.

Например: я буду печатать на странице insert.php как: userid = 17

firstname = (мне нужно ввести что-то здесь)

фамилия = ..

возраст = ..

город = ..

состояние = ..

Затем, когда я проверю свои данные и введу 17, введенный сценарий SQL будет активирован. Могу ли я получить несколько примеров того, какие уязвимости я могу показать через это?

 yoshifish18 окт. 2012 г., 12:25
Я основал свой пример с этого сайта. но у меня это тоже не сработало, так как я не мог отобразить вывод так, как он показывался в этом примере
 Dr. Dan18 окт. 2012 г., 12:12
3. Размещайте только соответствующий код
 PyQL18 окт. 2012 г., 12:21
Попробуйте эту демонстрацию, и если вы не поняли или не смогли ее применить, вернитесь к нам.esecforte.com/blog/second-order-sql-injection

Ответы на вопрос(2)

SQL-инъекция второго порядка - это не более чем SQL-инъекция, но небезопасный код - не первая строка.

Итак, чтобы продемонстрировать:

1) Создайте строку SQL-инъекции, которая будет выполнять что-то нежелательное при выполнении без экранирования.

2) Храните эту строку безопасно в вашей БД (с экранированием).

3) Позвольте какой-то другой части вашего кода ПОЛУЧИТЬ эту строку, и использовать его в другом месте, не экранируя.

РЕДАКТИРОВАТЬ: Добавлен пример кода:

Стол:

CREATE TABLE tblUsers (
  userId serial PRIMARY KEY,
  firstName TEXT
)

Предположим, у вас есть некоторый БЕЗОПАСНЫЙ код, подобный этому, получающий имя из формы:

$firstname = someEscapeFunction($_POST["firstname"]);

$SQL = "INSERT INTO tblUsers (firstname) VALUES ('{$firstname }');";
someConnection->execute($SQL);

Пока все хорошо, если предположить, что someEscapeFunction () отлично работает. Невозможно ввести SQL.

Если бы я отправил в качестве значения для namename следующую строку, вы бы не возражали:

л '); УДАЛИТЬ ИЗ ТБЛЮЗЕРОВ; //

Теперь предположим, что кто-то в той же системе хочет перенести firstName из tblUsers в tblWh независимо и делает это следующим образом:

$userid = 42;
$SQL = "SELECT firstname FROM tblUsers WHERE (userId={$userid})";
$RS = con->fetchAll($SQL);
$firstName = $RS[0]["firstName"];

И затем вставляет его в tblWh независимо от экранирования:

$SQL = "INSERT INTO tblWhatever (firstName) VALUES ('{$firstName}');";

Теперь, если имя содержит некоторую команду удаления, она все равно будет выполнена.

 yoshifish18 окт. 2012 г., 12:20
Вот в чем проблема ... Я не уверен, как я могу сохранить и получить этот код. Один пример, например, хранение дублирующихся записей в базе данных или что-то еще. что-то более сложное, например, выборка записей из базы данных с помощью команды одним щелчком мыши?
 Erwin Moller18 окт. 2012 г., 13:01
Я добавил более конкретный пример.
Решение Вопроса

Используя имя:

' OR 1 OR '

Это создаст предложение where во втором SQL

ГДЕ FirstName = '' ИЛИ 1 ИЛИ ''

Поэтому результатом будет первая запись в таблице.

Добавив предложение LIMIT, вы можете извлечь все строки из таблицы с помощью:

'ИЛИ 1 ЗАКАЗ ПО ИДЕНТИФИКАТОРУ ASC LIMIT 0, 1 -

Очевидно, что он будет извлекать только 1 строку за раз, поэтому вам нужно будет повторить это и увеличить 0 в LIMIT. В этом примере используется комментарий-- завершить оставшийся SQL, который в противном случае вызвал бы сбой запроса, потому что он добавил бы одну кавычку после вашего LIMIT.

Выше приведен простой пример, более сложная атака будет заключаться в использовании UNION SELECT, который даст вам доступ ко всей БД с помощью information_schema.

Также вы используетеaddslashes() в одном из ваших запросов. Это не так безопасно, какmysql_real_escape_string() и в свою очередь: экранирование кавычек с использованием одного из них не так безопасно, как использование подготовленных операторов или параметризованных запросов, например, в PDO или MySQLi.

 yoshifish18 окт. 2012 г., 12:42
Спасибо, ну это просто чтобы показать уязвимую сторону сайта. Я также пытался удалить таблицу, но она не работает. Как добавить команду «удалить базу данных / удалить таблицу» из первого раздела?
 MrCode18 окт. 2012 г., 12:53
Ну, поскольку это запрос SELECT, вы можете извлекать данные только из-за неподдерживаемых нескольких запросов, вы не можете DROP, DELETE, UPDATE или что-либо еще, если только исходный запрос не был одним из них.
 yoshifish18 окт. 2012 г., 12:49
Итак, какие еще уязвимости я могу показать?
 yoshifish18 окт. 2012 г., 14:25
Можете ли вы дать мне пример того, как атака выбора профсоюза может иметь место @MrCode
 MrCode18 окт. 2012 г., 12:46
Вы не можете, потому чтоmysql_query() не поддерживает несколько запросов, поэтому добавить запрос DROP невозможно. Видеть:php.net/manual/en/function.mysql-query.php

Ваш ответ на вопрос