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)?