Wannabe-hacker alla riscossa

Aperto da emanuele, Martedì - 24 Febbraio 2015 - 15:46

0 Utenti e 1 Visitatore stanno visualizzando questa discussione.

emanuele

Blog post un po' tecnico, ma così è venuto...

Negli ultimi giorni un qualche bot che qualche hacker si era dimenticato accesso ha iniziato a "sondare" IS alla ricerca di potenziali SQL-injection.

Le (dato che erano parecchi tentativi) SQL-injection tentate erano della categoria:
http://stackoverflow.com/questions/4600954/site-has-been-hacked-via-sql-injection
http://security.stackexchange.com/questions/34913/a-customers-site-had-a-big-mysql-injection-attack-on-it-just-want-to-learn-from
ecc.
Vi sono parecchi report in giro per il web che risalgono anche a più di 4 anni fa.

In particolare, questi tentativi sono stati portati tramite i link di paginazione del blocco news nella home page del sito, quindi a partire da URL simili a:
http://www.italiansmf.net/forum/index.php?news8=1
l numbero della pagine (1 nell'esempio) era sostituito con la SQL-injection generando URL simili a:
http://www.italiansmf.net/forum/index.php?news8=999999.9%20union%20all%20select%20null%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C(select%20cast(Char(114)%2BChar(51)%2BChar(100)%2BChar(109)%2BChar(48)%2BChar(118)%2BChar(51)%2BChar(95)%2BChar(104)%2BChar(118)%2BChar(106)%2BChar(95)%2BChar(105)%2BChar(110)%2BChar(106)%2BChar(101)%2BChar(99)%2BChar(116)%2BChar(105)%2BChar(111)%2BChar(110)%20as%20nvarchar(4000)))%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull--

Il codice fallisce ancora prima di iniziare, perché SimplePortal, pulisce debitamente l'input:
$start = !empty($_REQUEST['news' . $id]) ? (int) $_REQUEST['news' . $id] : 0;
rendendolo un numero intero, quindi niente di cui preoccuparsi.
La cosa noiosa, però, era che quel URL finisce per generare un errore in PHP, niente di traumatico, solo un semplice:
sprintf(): Too few arguments
in Subs.php, nel codice che genera la paginazione del blocco delle news (non entro nei dettagli dato che non sono rilevanti nel contesto di questo post).
Dal 17 febbraio ad oggi erano stati generati qualche (parecchi) centinaio di errori.

Ovviamente cancellarli ogni volta non è una soluzione particolarmente allettante, così abbiamo provato un approccio diverso: una piccola modifica al codice per evitare in toto che il potenziale attacco vada a buon fine.
Nel nostro caso specifico è stato sufficiente:

if (isset($_REQUEST['news8']) && strpos($_REQUEST['news8'], 'union') !== false)
redirectexit('http://www.google.it');

così, quando un'attaccante dovesse accedere ad un URL nella forma:
http://www.italiansmf.net/forum/index.php?news8=qualcosaunionaltro
il simpaticone viene reindirizzato a google.

Questa soluzione, però, è in un certo qual modo specifica per questo sito, dato che il nome "news8" deriva dal fatto che l'id del blocco con le news è 8, ma magari una soluzione generica nel caso doveste incontrare simili "attacchi" potrebbe esservi utile, quindi vediamo cosa si può fare.

Il problema è quindi identificare il pattern: "news{numero}" e verificare che non abbia all'interno tentativi di SQL-injection, proviamo così:
if (!empty($_REQUEST))
{
$news = preg_grep('~^news(\d+)$~', array_keys($_REQUEST));

if (!empty($news))
{
foreach ($news as $val)
{
if (stripos($_REQUEST[$val], 'union') !== false || stripos($_REQUEST[$val], 'select') !== false)
redirectexit('http://www.google.it');
}
}
}

Questo codice si occupa di identificare qualunque elemento nell'URL (e non solo in verità) che abbia la forma "news{numero}" e verifica che il suo valore non contenga né "select", né "union", due parole tipicamente usate nelle SQL-injection.

Naturalmente, come potrebbero mandare dei "se"? Ed eccolo qui, infatti.
1. Se non avete notato errori nel log riconducibili a questo genere di attacco, il codice sopra è sostanzialmente inutile, e quindi non perdete tempo ad applicarlo.
2. Se avete notato errori nel log simili a quelli riportati, ma che usano altre forme delle URL, potrebbe essere necessario adattare il codice alle vostre necessità, quindi se vi capita non siate timidi e chiedete pure. ;)

Flavio93Zena

E anche bannare l'IP? In questo caso servirebbe :P

Darknico

Citazione di: Flavio93Zena il Martedì - 24 Febbraio 2015 - 23:39
E anche bannare l'IP? In questo caso servirebbe :P

L'ip cambia..... E mo vuoi la vita più facile :p
Non supporto privatamente, non risponderei e ci rimarreste male....

Flavio93Zena

Il mio motto è "As long as it works... ;)" ;D
Certo che voglio la vita facile, ho imparato che complicarsela volutamente non è una soluzione intelligente ;D in questo caso però... Hmm. Mi domando se sia possibile provare ad iniettare codice anche in altre parti del forum, qualsiasi che abbia un'azione o un qualcosa diverso dall'installazione standard di smf. Ho idea che per questa parte devo fidarmi del team e non è una cosa che mi riesce facilmente :P
Tra l'altro è un avvenimento - sono le 7 di mattina e sono sveglio, sì, ma dopo aver dormito stavolta, lol.

Discussioni simili (3)