Thank you Bogdan!

It's worth noting that, if using {s.escape.user}, it won't detect a SQL injection, however, it may detect other potentially problematic characters, so one then has to apply both checks individually, e.g.

if ( $fU != $(fU{s.escape.common}) || $tU != $(tU{s.escape.common}) ) {
        xlog ("Rejecting SQL injection attempt received from 
$socket_in(proto):$si:$sp (Method: $rm; From: $fu; To: $tu; Contact: $ct).");
        send_reply (403,"Forbidden");
        exit;
}
if ( $fU != $(fU{s.escape.user}) || $tU != $(tU{s.escape.user}) ) {
        xlog ("Rejecting request with unusual characters received from 
$socket_in(proto):$si:$sp (Method: $rm; From: $fu; To: $tu; Contact: $ct).");
        send_reply (403,"Forbidden");
        exit;
}

So above doesn't block UTF-8; it just enforces that it must be received from the client in fully escaped form.

I'm gathering that UTF-8 is actually acceptable for the user part (and most other parts) of the URI, provided that it's encoded with '%'? I work with purely ASCII user parts however, out of interest, was wondering if it is allowable and/or commonplace to use Unicode extended character sets for any portions of the URI in parts of the world where other character sets are more frequently used? From what I could find, it seems that UTF16 is not allowed in the User Part and that the domain would be internationalised using Punycode, so the full URI should always be encoded in ASCII but with UTF-8 (but not UTF-16) permitted in %-encoded form for the user part?

With respect to the Contact header, I'm struggling a bit. Is the syntax below correct?

if ( $(ct.fields(uri){uri.user}) != 
$(ct.fields(uri){uri.user}{s.escape.common}) ) {
        send_reply (403,"Forbidden");
        exit;
}

--
Thanks
*Gregory Massel*

On 2023-12-05 11:33, Bogdan-Andrei Iancu wrote:
Hi Gregory,

As it is said, there is no single way to skin the cat :). Your approach is a valid one, by using the escaping transformation. Maybe you should check the s.escape.user [1].

Such checks make sense when using avp_db_query(), so raw queries. The internal queries (like auth, etc) are done via prepared statements, so safe to injections.

[1] https://www.opensips.org/Documentation/Script-Tran-3-2#s.escape.user

Regards,
Bogdan-Andrei Iancu

OpenSIPS Founder and Developer
   https://www.opensips-solutions.com
   https://www.siphub.com
On 30.11.2023 02:34, Gregory Massel via Users wrote:

Hi all

I'm wondering what the best practice is in terms of detection and dropping attempted SQL injection attacks?

Is something like the following adequate or can this be enhanced:

if ( $fU != $(fU{s.escape.common}) || $tU != $(tU{s.escape.common}) ) {
        drop();
}

Obviously this does not remove the need to escape anything passed to avp_db_query(), however, what I want to do is identify these sorts of attacks at the top of the script and avoid processing.

To date all the attacks I've seen focus on the contact and from user, e.g.:
INVITEsip:00111390237920793@x.x.x.x:5060;transport=UDP  SIP/2.0
Contact:<sip:a'or'3=3--@x.x.x.x:5060;transport=UDP>
To:<sip:00111390237920793@x.x.x.x;transport=UDP>
From:<sip:a'or'3=3--@x.x.x.x;transport=UDP>;tag=v2pjtxqb
I'm not quite sure how to match the Contact user. Would the following work?
if ( $(ct.fields(uri){uri.user}) != 
$(ct.fields(uri){uri.user}{s.escape.common}) ) {
        drop();
}
--
Regards
*Gregory Massel*

_______________________________________________
Users mailing list
Users@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

_______________________________________________
Users mailing list
Users@lists.opensips.org
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

Reply via email to