Über S2Dao, das gerade EOLed wurde. Ich benutze es für geschäftliche Zwecke, aber es ist gefährlich, wenn ich es falsch benutze. Notieren Sie es sich.
S2Dao bietet eingebettete Variablen. Wenn Sie es falsch verwenden, verhält es sich sehr gefährlich. Notieren Sie es sich.
Die eingebettete Variable wird wie folgt beschrieben.
/ \ * $ Argumentname * / Literal
BalanceDao
@S2Dao(bean = Balance.class)
public interface BalanceDao {
@Sql("select id, name, amount, created_at, updated_at from balance where name = '/*$name*/'Tanaka''")
public List<Balance> findByName(String name);
}
curl
$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=Taro Tanaka"
id:1name:Taro Tanaka erstellt_ad:2019-05-03 19:25:33.0updated_ad:null
Laufzeitprotokoll
DEBUG 2019-05-04 12:51:36,087 [http-nio-8080-exec-5] select id, name, amount, created_at, updated_at from balance where name = 'Taro Tanaka'
Auf diese Weise können Sie sehen, dass der in / * $ name * / festgelegte Teil (eingebettete Variable) ersetzt und SQL ausgeführt wird.
Das Gefährliche an eingebetteten Variablen ist dann, dass der SQL-Teil so wie er ist durch den Inhalt des Arguments ersetzt wird, sodass die Gefahr einer SQL-Injection besteht.
Ich werde es versuchen.
curl
$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=A'or'A'='A"
id:1name:Taro Tanaka erstellt_ad:2019-05-03 19:25:33.0updated_ad:null
id:2name:Hanako Sato erstellt_ad:2019-05-03 23:48:40.0updated_ad:null
Laufzeitprotokoll
DEBUG 2019-05-04 12:54:57,636 [http-nio-8080-exec-6] select id, name, amount, created_at, updated_at from balance where name = 'A'or'A'='A'
Auf diese Weise können alle Daten erfasst werden.
Ich denke, es gibt zwei Möglichkeiten, damit umzugehen.
Grundsätzlich denke ich, dass es besser ist, Kommentare zu Bindungsvariablen zu verwenden.
Die Verwendung ist einfach. Geben Sie einfach Folgendes an:
/ \ * Argumentname * / Literal
BalanceDao
@Sql("select id, name, amount, created_at, updated_at from balance where name = /*name*/'Tanaka'")
public List<Balance> findByName(String name);
Versuchen Sie es mit SQL Injection.
Es wird nichts zurückgegeben
$ curl -G "localhost:8080/sastruts/balance/findname" --data-urlencode "name=A'or'A'='A"
$
Laufzeitprotokoll
DEBUG 2019-05-04 13:01:31,270 [http-nio-8080-exec-3] select id, name, amount, created_at, updated_at from balance where name = 'A'or'A'='A'
Im Ausführungsprotokoll sieht es so aus, als ob die SQL-Injektion erfolgreich war, aber tatsächlich wurde nichts zurückgegeben.
Recommended Posts