以前曾经QQ空间发布过关于IP注入攻击的文章,这种注入其实没什么神秘,只是很多时候被忽略了。 IP伪造有几种途径,一种是通过是修改IP数据包,有兴趣的可以去看看IP数据包的结构,还有一种就是利用修改http头信息来实现IP伪造。涉及到[客户端]IP的通常使用3个环境变量:$_SERVER['HTTP_CLIENT_IP']和$_SERVER['X_FORWARDED_FOR']还有$_SERVER['REMOTE_ADDR']实际上,这3个环境变量都有局限性。前两个是可以随意伪造。只要在发送的http头里设置相应值就可以,任意字符都可以,而第3个环境变量,如果用户使用了匿名代理,那这个变量显示的就是代理IP。
//获取客户端IP function getIP() { $cip = ''; if($_SERVER('HTTP_CLIENT_IP') && strcasecmp($_SERVER('HTTP_CLIENT_IP'), 'unknown')) { $cip = $_SERVER('HTTP_CLIENT_IP'); } elseif($_SERVER('HTTP_X_FORWARDED_FOR') && strcasecmp($_SERVER('HTTP_X_FORWARDED_FOR'), 'unknown')) { $cip = $_SERVER('HTTP_X_FORWARDED_FOR'); } elseif($_SERVER('REMOTE_ADDR') && strcasecmp($_SERVER('REMOTE_ADDR'), 'unknown')) { $cip = $_SERVER('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $cip = $_SERVER['REMOTE_ADDR']; } return $cip; }
根据前面说的,这段代码 如果我能伪造 HTTP_CLIENT_IP,只要使得它不是 unkown,那就能让$cip毫无保留的接受我们伪造的数据,然后:
1 $db->row_delete("online","userid='$userid' or ip='".getIP()."'");
这句实际执行的是(假设当前用户id是1了,这是无关紧要的) delete from online where userid=1 or ip='$ip'
假如我伪造http_client_ip伪造为 ';delete from `user`#,上述sql语句就会变成
delete from online where userid=1 or ip='';delete from `user` (因为#后的被注释掉了),很危险吧。
攻击脚本就不发了,很简单,伪造个头就可以了。
文章作者:荆棘鸟
查看更多关于不常用的注入–利用IP地址进行注入 - 网站安全的详细内容...