Utilisation de requête SQL sans passer par ObjectDB - > Injection SQL

Bonjour,

Pouvez-vous me confirmer que le fait d’utiliser des requêtes SQL classiques avec le getGrant.update(SQL) (ou tout autre requête SQL) avec des paramètres concaténés avec des + permet d’injecter du SQL. (cf. ci-dessous).

Je ne vois pas dans le code de Simplicité un mécanisme permettant d’éviter les injections lorsqu’on fait ce genre de requête ci-dessous. (sauf bien entendu utiliser les save, validateAndSave avec des objectDB).

Merci d’avance

Cf. doc OWASP :

Scenario #1: An application uses untrusted data in the construction of the following vulnerable SQL call:
String query = "SELECT * FROM accounts WHERE custID='" + request.getParameter("id") + "'";
Scenario #2: Similarly, an application’s blind trust in frameworks may result in queries that are still vulnerable, (e.g. Hibernate Query Language (HQL)):
Query HQLQuery = session.createQuery("FROM accounts WHERE custID='" + request.getParameter("id") + "'");
In both cases, the attacker modifies the ‘id’ parameter value in their browser to send: ‘ or ‘1’=’1. For example:
http://example.com/app/accountView?id=' or '1'='1

This changes the meaning of both queries to return all the records from the accounts table. More dangerous attacks could modify or delete data, or even invoke stored procedures.

Il faut utiliser les APIs avec host variables (ex: query ou update) et/ou utiliser Tool.toSQL(...) pour construire le SQL (ex: String sql = "select x from y where id = " + Tool.toSQL(id))

1 Like

Oui il faut plutôt passer par les host-values pour utiliser le driver JDBC qui encodera correctement les variables typées (string, date…).

List<ObjectField> hosts = new ArrayList<>();
hosts.add(new ObjectField(ObjectField.TYPE_STRING, "drop table xxx"));
hosts.add(new ObjectField(ObjectField.TYPE_DATE, "2021-10-07"));

List<String[]> rows = getGrant().query(
  "select * from mytable where mystring=? and mydate=?", hosts);

getGrant().update(
  "update mytable set mystring=? where mydate=?", hosts);

Le tableau des hosts doit être dans le même ordre que les ? de la requête.

Tool.toSQL est plus simple à utiliser pour les cas simples = pour encoder les caractères spéciaux des varchar (' => '', \n, \r…) dans une requete SQL.

String sql = "select x from y where mystring = '" + Tool.toSQL(astring) + "'";
1 Like

Merci pour vos réponses. Ca me rassure d’un côté. Je pense que les performances de l’utilisation des host values ou Tool.toSQL doivent être quasi identiques à une simple requête SQL.

C’est donc primordial de les utiliser pour éviter les injections.

Oui surtout si la donnée vient directement d’un input front.

Un hacker peut également injecter du code dans les champs HTML pour exécuter un script. Il en va de même pour les contenus HTML des input/textarea, Simplicité encode systématiquement les données.

Donc s’il y a du code spécifique pour alimenter des champs, idem il faut escaper correctement les contenus :

Code en back

Tool.toHTML("<p>Hello world!</p> <script>..xhr request to hacker...</script>");

Code en front

$(div).text("<p>Hello world!</p> <script>...xhr request...</script>");

ou pour volontairement insérer du contenu riche mais bien retirer les scripts :

$(div).htmlSafe("<p>Hello world!</p> <script>...xhr request...</script>");
$(div).appendSafe("<p>Hello world!</p> <script>...xhr request...</script>");

Ces extensions jQuery de Simplicité afficheront “Hello world!” dans un paragraphe, mais n’exécuteront aucun script, ou <img onload="script...">

1 Like

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.