2021-09-09 · 2분
バッファオーバーフロー(BOF)
バッファオーバーフロー脆弱性の入門:それが何か、HackCTF #1 の fgets(s, 45, ...) がサイズ 40 のバッファへの入力で s[40] を超えて v5 を制御する仕組み、そして境界のない scanf("%s") で SFP と戻りアドレスを上書きできること。
2021-06-06 · 4분
この記事は公開から2年以上経過しています。
この 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" というものが目に入りますが、これは何でしょう?
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 を書いたとき出力されるカレー文…もといクエリ文はどう出ましたか?

このように # で出たはずです。これは URL encoding といいます。
URL エンコーディング(Encoding)
上のように %23 は # を表します。# を使う理由は、私の SQL Injection ブログを見た方なら分かるでしょうが、後ろの部分を全部コメント処理するためです。
「"--" これがコメントでは?」と聞かれるかもしれませんが〜それも私のブログに〜 これは MYSQL を使うためコメントが # なのです。-- は Oracle、MSSQL で作動します。

こうして 1 段階 gremlin をクリアしました!!!お疲れさまでした〜
+他の解法、ヒント
単純に id と pw 値を両方とも真にしてしまえば解けます。
上のようにいくつかの解法が出せます!
URL Encoding 値はインターネットの表やコーディングで一つひとつ確認することもできますが、サイトを通じて得ることもできます。
例えば https://meyerweb.com/eric/tools/dencoder/ のようなサイトで得られます。
参考:
https://choseongho93.tistory.com/131
原文(韓国語): tistory — 2021-06-06 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。
…