2021-06-06 · 4

LOS #1 gremlin write-up

securitypwnable

この記事は公開から2年以上経過しています。


LOS とは..?

この LOS(Lord Of SQLInjection)は SQLInjection を実習できる Web ハッキング実習サイトです。

SQL Injection については [ハッキング/Web ハッキング] - SQL Injection この記事を読んでください〜ㅎ

解法の過程

最初なので一つひとつ解釈すると、1〜4 までは特に必要なく、5〜6 行目から解釈すると...

if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");

私たちが知らない "preg_match" というものが目に入りますが、これは何でしょう?

preg_match とは?

PHP では preg_match 関数を使って正規表現を書きます。

第 1 引数:正規表現の記述、

第 2 引数:検索対象の文字列、

第 3 引数:配列変数を返す。パターンマッチでマッチした値を配列として保存するものです。

正規表現とは?

[ハッキング/Web ハッキング] - 正規表現 / よく使う正規表現 を読んでください!

これにより、ユーザーが入力した id 値に 'prob'、''、'.'、'\' という値が存在するとき "No Hack ~~" という画面が出ます。

そして上の PHP 文を見ると、入力値を GET 方式で受け取っているのが分かります。GET 方式で受け取ると、パラメータ(URL)に入力値がそのまま露出します。

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

7 行目は、とてもよく見た SQL 構文です。データベースから入力された id と pw に対する値を探して $query に保存するクエリ文です。

echo "<hr>query : <strong>{$query}</strong><hr><br>";

8 行目は、そのクエリ文を私たちに見せる役割ですね!

$result = @mysqli_fetch_array(mysqli_query($db,$query));

9 行目は、入力された $query 値を配列として $result に保存するクエリ文です。

if($result['id']) solve("gremlin");

10 行目は、$result ['id'] に値が入っていれば solve("gremlin") が実行されるようです。

解法の過程

もう一度文を見ると、$result ['id'] が真になれば解ける問題です!値を入れる方法は、URL の末尾に "? id=値&pw=値" のように書けばよいです。

では先ほど学んだとおり SQL Injection を試してみましょうか?人によって非常に多様な答えが出て、どの方法を使っても Clear さえすれば正しい方法でしょう。いろいろな方法で試してみてください!

$query = "select id from prob_gremlin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";

このクエリ文を見ると、もし私たちが id=1234 pw=1234 を入力すると select id from prob_gremlin where id='1234' and pw='1234'

このように入力されます。では ' or 1=1 %23 と書き入れると?

select id from prob_gremlin where id='' or 1=1 #' and pw=''

上のように id が真になり、この問題はクリアされます。

%23 とは?

%23 を書いたとき出力されるカレー文…もといクエリ文はどう出ましたか?

このように # で出たはずです。これは URL encoding といいます。

URL エンコーディングとは?

URL エンコーディング(Encoding)

  1. 文字や特殊文字を、Web サーバーとブラウザで普遍的に許容されるものに変換するメカニズムです。
  2. URL は ASCII 文字集合を使ってのみインターネット上で送信できます。
  3. URL はしばしば ASCII セット外の文字を含むため、URL は有効な ASCII 形式に変換される必要があります。
  4. URL エンコーディングは、安全でない ASCII 文字を "%" の後に 2 つの 16 進数で置き換えます。
  5. URL は空白を含められません。URL エンコーディングでは一般的に空白を (+ 記号) または %20 で置き換えます。

上のように %23# を表します。# を使う理由は、私の SQL Injection ブログを見た方なら分かるでしょうが、後ろの部分を全部コメント処理するためです。

「"--" これがコメントでは?」と聞かれるかもしれませんが〜それも私のブログに〜 これは MYSQL を使うためコメントが # なのです。-- は Oracle、MSSQL で作動します。

こうして 1 段階 gremlin をクリアしました!!!お疲れさまでした〜

+他の解法、ヒント

単純に id と pw 値を両方とも真にしてしまえば解けます。

  1. id=' or '1'='1&pw=' or '1'='1
  2. pw=' or 1=1%23
  3. id=' or id='1' and pw='1' or 1=1%23

上のようにいくつかの解法が出せます!

URL Encoding 値はインターネットの表やコーディングで一つひとつ確認することもできますが、サイトを通じて得ることもできます。

例えば https://meyerweb.com/eric/tools/dencoder/ のようなサイトで得られます。

参考:

https://choseongho93.tistory.com/131

https://webkid.tistory.com/2


原文(韓国語): tistory — 2021-06-06 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。

コメント

コメントを削除しますか?

関連記事

LOS #1 gremlin write-up · 나봄하랑