2016-03-26 16 views
1

Güvenli Kod kursunun bir parçası olarak, sorguların string concatintion kullanılarak oluşturulduğu, korunmasız bir Java sistemi verildi. Ben SQL zorunda ilgili kod satırı log-in verilerine almak için enjekte aşağıdadır:Tüm sonuç setini SQL (HSQLDB) içinde String'e dönüştürün

String comment; 
int articleID; 
//... 
stmt.executeUpdate("INSERT INTO comment (text, article_id) VALUES ('" + comment + "', " + articleId + ")"); 

comment herhangi bir metin olarak ayarlanabilir, sadece bir metin kutusu düz metin okunur. Bu nedenle, tam giriş verilerini, bir SELECT açıklamaya metin kutusu metin ayarlama okuma düşündü (tablo user sütunları login ve password vardır):

' || (SELECT login || password FROM user) || ' 

sorguda yol açmalıdır genel hangi

INSERT INTO comment (text, article_id) VALUES ('' || (SELECT login || password FROM user) || '', 4) 
kardinalite ihlal

:

henüz bu

org.hsqldb.HsqlException sonuçlanır

Soru:

Ben (SELECT login || password FROM user) tek bir dize değil çünkü bu olduğunu varsayalım, ama bir sonuç kümesi ve dolayısıyla || kullanılarak birleştirilmelidir olmayabilir.

Tüm sonuç kümesini, bu SQL enjeksiyon senaryosunda kullanılabilecek şekilde bir dizgeye dönüştürmek mümkün mü (HSQLDB'de çalışan standart SQL/SQL'de)?

cevap

1

Birden çok kullanıcı olduğundan ve SELECT'ten birden çok satır döndüğünden, haklısınız.

İlk satırı almak için SELECT'e LIMIT 1'u ekleyebilirsiniz. Ayrıca iç SELECT'ten bir dizi dizisi de oluşturabilirsiniz. Rehbere bakın.

HSQLDB'de her veritabanı kullanıcısı, tablolara ayrı erişim haklarına sahiptir. Gerçek bir dağıtımda, yorum ekleyen kullanıcı, şifreyi içeren tablonun varlığını bile görmez, hatta bundan seçmesine izin vermez.

İlgili konular