Deyim sonra daha fazla tablo seçin?

3 Cevap php

Bu bir security audition parçasıdır, yani "değişim" sorgu için hiçbir yolu yoktur.

Temelde, ne buldum deyimi manipülasyon sağlar, böylece temelde gibi gider bir kusur:

$query = "DELETE FROM `products` WHERE `products`.`whatever` = $variable";

Bu yüzden bildiğim kadarıyla birden fazla sorguları yürütmek için hiçbir yolu yoktur bildiğiniz gibi, PHP. Bu SQL Injection kullanarak, ben "= 1 # 0 OR 1" çalıştırarak "açık" bu tablo başardı.

Bu gayet güzel çalışıyor, ama bana silmek için daha fazla tablo seçmek için izin vermez.

Bu benim yapmak istediğim pseudocode olduğunu:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1, FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1**

Bu zaten akla yatkın mı?

Bu güvenilir değilse, ben bu kullanabilirsiniz başka bir yolu var mı?

3 Cevap

Aynı DELETE deyim için maddelerinde birden sahip olamaz, bu yüzden size istediğimiz tam olarak nasıl bu konuda gidemez. MySQL db açık 'ifadesinin başına birden fazla sorgu izin' olsaydı böyle bakmak istiyorum, böylece, bir ucunda başka bir sorguyu ve ardından yapışkanlık SİL sonlandırmak için deneyebilirsiniz:

DELETE FROM `products` WHERE `products`.`whatever` = **0 OR 1=1; DELETE FROM `othertable` WHERE `othertable`.`othercolumn` = 0 OR 1=1**

Ama bu konuda.

Belki tam olarak soruyu anlıyorum, ama ne götürmek bir dize olarak bir SQL komutu bina ve bir MySQL veritabanı karşı doğrudan o dizeyi koşuyoruz olduğunu bilmiyorum.

(';' Genellikle), bu yüzden hemen hemen this comic uygun bir şekilde göstermektedir gibi istediğiniz komutu çalıştırabilir komut ayırıcı kullanarak çoklu komutları ayırabilirsiniz.

(Birisi bugünün ayarını değiştirirse gelecekte ya kudretini) veritabanı yapılandırma birden komutlarını destekliyorsa, size giriş parçası olarak bir komut ayırıcı yok sağlamak istiyoruz. Bu tür saldırıları önlemek için giriş hijyen konusunda tavsiye için this article bakın.

Eğer belirtildiği gibi, birden fazla sorgu, normal MySQL sürücü modülü tarafından desteklenmez. Dan the manual for mysql_query:

mysql_query() sends a unique query (multiple queries are not supported) to the currently active database on the server that's associated with the specified link_identifier .

Maalesef enjeksiyon çabaları için, DELETE sözdizimi sadece birden fazla tablo FROM fıkrasında bunları belirterek siler destekler. Sizin enjekte değişken WHERE parçasıdır, bu yüzden yapabileceğiniz en çok hasar, tek belirtilen tabloya olduğunu.

Sanılanın aksine, aslında PHP birden fazla MySQL çalıştırabilirsiniz deyimleri, sadece böyle MySQLi gibi farklı bir veritabanı sürücüsü modülü kullanılarak gerekir. Bkz MySQLi::multi_query().