sql expansion with query string stored in attribute?

Fajar A. Nugraha list at fajar.net
Wed Oct 19 11:27:53 CEST 2011


On Wed, Oct 19, 2011 at 4:01 PM, Phil Mayers <p.mayers at imperial.ac.uk> wrote:
> Are you using postgres?

Nope. MySQL.

> If so, you could try to abuse this feature by making
> EVERY character safe, then perform the escaping yourself by doing this:
>
> update request {
>  SQL-Query := "select * from foo where bar=$tag$%{User-Name}$tag$"
>  SQL-Result := "%{sql:%{SQL-Query}}"
> }

"SQL-Query" and "SQL-Result" is just an example, right? Unless it's
specifically added to a dictionary.

>
> It's not the most secure option; someone could contrive to get the string
> "$tag$; drop table foo" into a radius field, but if you can be sure this
> won't happen (e.g. sanitise it) it might work.

The most dangerous character would probably be ";".

Right now I'm adding "'=(),|". The first five because it's often used
in queries. The last one ("|") is because I need a "marker" character,
so that I can abuse mysql's CONCAT() and split the result later using
unlang's regex. The "put queries in attribute" part is necessary to be
able to create a generic pseudo-redundant sql expansion.

I'm currently testing it for dynamic-clients. The modification uses
less sql query (one, as opposed to five), and can use another sql
server if the first one is dead or returns no result (which is why I
said pseudo-redundant). If anyone's interested, the modification is
something like this:

local-config.conf:
==================================
local-config {
	...
	dynamic-clients {
		sql-nas="SELECT CONCAT('|', shortname, '|', secret , '|', type ,
'|', IF(ISNULL(server),'',server), '|') FROM nas WHERE nasname =
'%{Packet-Src-IP-Address}'"
	}
	...
}

policy.conf:
==================================
policy {
	...
	#  SQL expansion: query from Tmp-String-0, result stored on Tmp-String-1
	expand_sql1 {
		if (control:Tmp-String-0) {
			update control {
				Tmp-String-1 := "%{sql-expansion-1: %{control:Tmp-String-0}}"
			}
		}
	}
	expand_sql2 {
		if (control:Tmp-String-0) {
			update control {
				Tmp-String-1 := "%{sql-expansion-2: %{control:Tmp-String-0}}"
			}
		}
	}
	expand_sql_redundant {
		expand_sql1
		if (! "%{control:Tmp-String-1}") {
			expand_sql2
		}
	}
	...
}

sites-available/dynamic-clients:
==================================
server dynamic_client_server {
...
	authorize {
		update control {
			Tmp-String-0 := "${local-config.dynamic-clients.sql-nas}"
		}
		expand_sql_redundant
		
		if (control:Tmp-String-1 =~ /\\|(.*?)\\|(.*?)\\|(.*?)\\|(.*?)\\|/) {
				update control {
					FreeRADIUS-Client-IP-Address = "%{Packet-Src-IP-Address}"
					FreeRADIUS-Client-Shortname = "%{1}"
					FreeRADIUS-Client-Secret = "%{2}"
					FreeRADIUS-Client-NAS-Type = "%{3}"
					FreeRADIUS-Client-Virtual-Server = "%{4}"
			}
		}
		ok
	}
...
}

-- 
Fajar




More information about the Freeradius-Users mailing list