Ik log bij een vote-onderdeel op een site het IP-adres met het script dat ik bij een User Comment in de PHP Manual zag staan:
Er zijn 60.000+ votes uitgebracht, en bij 468 votes kwam het IP-adres 127.0.0.1 uit deze functie naar voren. Kijk ik in de apache-logs, dan staat daar een "gewoon" IP-adres, en ook verder geen bijzonderheden mbt de betreffende votes. Wel zijn alle 127.0.0.1's uit de database, in de Apace-logs overal tot hetzelfde IP-adres te herleiden, en het blijkt tevens dat dit adres ook andere IP-adressen heeft opgeleverd via bovenstaand script (en dan wel "gewone" IP-adressen waar niks bijzonders aan te zien is).
Omdat deze votes slechts betrekking hebben op 5 elementen (waar op duizenden elementen gestemd kon worden), vermoed ik dat iemand heeft lopen vogelen met een IP-spoofer. Dat die dingen bestaan weet ik wel, maar dat ze de server kunnen laten denken met een localhost-IP te maken te hebben verbaast me, en doet me bovendien afvragen wat dit voor gevolgen kan hebben voor het benaderen van applicaties die normaal gesproken alleen localhost te gebruiken zijn.
Heeft iemand daar meer info over? Is het inderdaad mogelijk om een server via een IP-spoofer te laten denken dat ie met een localhost-IP te maken heeft? Of zit er een fout in dit specifieke script waardoor deze wel, en de Apache logs niet om de tuin geleid kan worden?
PS. Het is niet mogelijk het ip-adres te overrulen via een GET, POST of anderzins: de query wordt opgebouwd als volgt:
PS2: bij andere votes lijkt gewoon het IP gelogd te worden dat ook in de Apache-logs terug te vinden is (op basis van een steekproef).
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| // Returns IP-Address function fetchip() { global $HTTP_SERVER_VARS; //get useful vars: $client_ip = $HTTP_SERVER_VARS['HTTP_CLIENT_IP']; $x_forwarded_for = $HTTP_SERVER_VARS['HTTP_X_FORWARDED_FOR']; $remote_addr = $HTTP_SERVER_VARS['REMOTE_ADDR']; // then the script itself if (!empty ($client_ip) ) { $ip_expl = explode('.',$client_ip); $referer = explode('.',$remote_addr); if($referer[0] != $ip_expl[0]) { $ip=array_reverse($ip_expl); $return=implode('.',$ip); } else { $return = $client_ip; }; } elseif (!empty($x_forwarded_for) ) { if(strstr($x_forwarded_for,',')) { $ip_expl = explode(',',$x_forwarded_for); $return = end($ip_expl); } else { $return = $x_forwarded_for; }; } else { $return = $remote_addr; } unset ($client_ip,$x_forwarded_for,$remote_addr,$ip_expl); return $return; } |
Er zijn 60.000+ votes uitgebracht, en bij 468 votes kwam het IP-adres 127.0.0.1 uit deze functie naar voren. Kijk ik in de apache-logs, dan staat daar een "gewoon" IP-adres, en ook verder geen bijzonderheden mbt de betreffende votes. Wel zijn alle 127.0.0.1's uit de database, in de Apace-logs overal tot hetzelfde IP-adres te herleiden, en het blijkt tevens dat dit adres ook andere IP-adressen heeft opgeleverd via bovenstaand script (en dan wel "gewone" IP-adressen waar niks bijzonders aan te zien is).
Omdat deze votes slechts betrekking hebben op 5 elementen (waar op duizenden elementen gestemd kon worden), vermoed ik dat iemand heeft lopen vogelen met een IP-spoofer. Dat die dingen bestaan weet ik wel, maar dat ze de server kunnen laten denken met een localhost-IP te maken te hebben verbaast me, en doet me bovendien afvragen wat dit voor gevolgen kan hebben voor het benaderen van applicaties die normaal gesproken alleen localhost te gebruiken zijn.
Heeft iemand daar meer info over? Is het inderdaad mogelijk om een server via een IP-spoofer te laten denken dat ie met een localhost-IP te maken heeft? Of zit er een fout in dit specifieke script waardoor deze wel, en de Apache logs niet om de tuin geleid kan worden?
PS. Het is niet mogelijk het ip-adres te overrulen via een GET, POST of anderzins: de query wordt opgebouwd als volgt:
PHP:
1
2
| $sql = "INSERT INTO table (kolom, ipadres, etc) "; $sql .= "VALUES ('...','" . fetchip() . "', '...')"; |
PS2: bij andere votes lijkt gewoon het IP gelogd te worden dat ook in de Apache-logs terug te vinden is (op basis van een steekproef).
[ Voor 5% gewijzigd door Anders op 16-02-2004 10:32 ]
Ik spoor veilig of ik spoor niet.