web-dev-qa-db-ja.com

追加スラッシュによるSQLインジェクション

PHPおよびMySQLを教育目的で使用する場合にaddslashesを使用してWebサイトをハッキングする方法を理解しようとしています。

このトピックこのトピック を読んだ後、0xbf27のようなものを使用して0xbf5c27に変換してバイパスする方法を理解しようとしていますaddslashes

そこで、文字セットを設定するクエリを手動で実行します。

set character set 'gbk'; 

この目的の文字は、つまりbf27である必要があります。上記のトピックで彼らが言うとおり、bf5c27のようなものに変換する必要がありますが、ラボでテストするとPHPこのようなコード:

$query  = "SELECT first_name, last_name FROM users WHERE user_id = '".addslashes($id)."';";
echo $query;
$result = mysql_query($query) or die( '<pre>' . mysql_error() . '</pre>' );

そして、テキストフィールドにを挿入すると、実行される正確なクエリは次のようになります。

SELECT first_name, last_name FROM users WHERE user_id = '뼧';

だから特に何も起こらなかったようです!

この後、私は別のPHPスクリプトを作成して何が起こっているのかを理解するために、MySQLを実行せずに単純なスクリプト(test.php)を作成します:

 <html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <?php 
$command = $_REQUEST[ 'id' ];;
$output = addslashes($command);
echo "<pre>$output</pre>"; ?> 
 </body>
</html>

次に、次のようなURLでファイルを実行します。

http://127.0.0.1/test.php?id=뼧

上記のPHPコードが表示されている場合は、次のように表示されます。

뼧 

上記の3文字の16進コードは次のとおりです。

eb bc a7

さて、私は何が起こったかについて考えます、

私の質問は:

  1. 表示された뼧とは何ですか?(5c27などのものが何も含まれていないため、異常な感じがしました。

  2. 最初のスクリプトでecho $query;に3文字以上の文字が表示されないのはなぜですか?

  3. 彼らが説明するように本当にそれを実行するにはどうすればよいですか(上記の2つのトピックで)?

更新1:おかげで Goktay Kaykusuz は、エンコーディングに問題があることを理解しています。それのためのPOCは私がターミナルでそれをテストすることであり、それは再ルートします:

<html>
 <head>
  <title>PHP Test</title>
 </head>
 <body>
 <pre>뼧</pre> </body>
</html>

だから私はそれが結果をUTF8(Chromeで)に変換することを理解していますが、ターミナルでは正常に動作します。

しかし、問題は素晴らしく迂回することなく機能するため、まだ問題はありません(単純な文字列が本来あるべきものです)。

おかしいことに、私はオンラインエンコーディングコンバーターで実験しました。クライアント側でエンコーディングの問題があると思います。

文字列をPHPコード内に埋め込んだところ、うまくいきました。

$test_var = chr(0xbf) . chr(0x27);
echo(bin2dex(addslashes($test_var)));

結果:bf5c27

問題は、URLから変数を取得するときです。

の後にaddlashes()を実行するとebbca7になります

¿'の後にaddlashes()を実行するとbf5c27になります

しかし オンラインエンコーディングコンバーター は、bf27の場合はを、bf 27の場合は¿'を示しています。

PHP構成のエンコーディングをphp.iniでGBKおよびUTF-8に設定してから、もう一度¿'文字で試してみることはできますか?リンクの例与えられた出力を直接エコーしないので、私が言及したように、クライアント側でスクランブルされている可能性があります。

2
Goktay Kaykusuz