以前曾经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` (因为#后的被注释掉了),很危险吧。

攻击脚本就不发了,很简单,伪造个头就可以了。

转载请注明来自WebShell'S Blog,本文地址:https://www.webshell.cc/1363.html