修改Client的ip地址进行xss攻击

任何从客户端获取的数据都是不可信的

说起XSS,我想起的总是这行代码:<script>alert('xss')</script>,然后拿着它到各种输入框到处试,也有很多成功的情况,但这种弹一个显示框的攻击总觉得没啥作用。
最近跟着师兄实践了一把XSS攻击才知道,以前那种到处找输入框的方式简直too young,too naive……
任何从客户端获取数据的地方都可能存在XSS攻击。

服务器如何获取用户IP?

先了解几个http头信息:

  • REMOTE_ADDR: remote_addr代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的IP指定的,访问某个网站时,假设中间没有任何代理,那么网站的web服务器(NginxApache)就会把remote_addr设为你的机器IP,如果你用了某个代理,那么你的浏览器会先访问这个代理,然后再由这个代理转发到网站,这样web服务器就会把remote_addr设为这台代理机器的IP。

  • X-Forwarded-For: X-Forwarded-For并不是标准协议头。当你使用了代理时,web服务器就不知道你的真实IP了,为了避免这个情况,代理服务器通常会增加一个叫做X_Forwarded_For的头信息,把连接它的客户端IP(即你的上网机器IP)加到这个头信息里,这样就能保证网站的web服务器能获取到真实IP。它的格式通常是X-Forwarded-For: client1, proxy1, proxy2

  • Client-Ip: Client-IpX-Forwarded-For十分类似,也不是标准协议头,也是用于使用代理服务器时,标识客户端IP,差别好像是Client-Ip只记录客户端IP,而不管代理服务器IP。详见stackoverflow上的回答

以PHP为例,常见的服务器获取客户端IP的程序就可以是:

<?php
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
   $myip = $_SERVER['HTTP_CLIENT_IP'];
}else if(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
   $myip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
   $myip= $_SERVER['REMOTE_ADDR'];
}
echo $myip;
?>

如果http请求经过代理,那么就从X-Forwarded-ForClient-Ip中获取,如果没有经过代理,那就从REMOTE_ADDR中获取。简直完美,可以把代码交给包工头打卡下班了……

利用IP地址的XSS攻击

如果X-Forwarded-ForClient-Ip是经过篡改的呢?问题就在于此。

这是某网站的站长信箱,获取了用户IP并显示。用Tamper Data截取GET请求,并加入X-Forwarded-For头部信息:

于是IP地址就变成了:

如果把X-Forwarded-For改成我们熟悉的<script>alert('xss')</script>

出现了反射型XSS。还没完,站长查看信件的时候,应该会显示发送者的IP吧,如果把获取cookie的js代码嵌入发送信件的POST请求中,那么就可能产生持久型XSS甚至获取到管理员cookie。

end

只要是从客户端获取数据,那么这个数据就是不可信的,就需要做验证。反过来说,只要数据是客户端传过去的,那么就可以运用这个数据尝试XSS攻击。


reference:

如何正確的取得使用者 IP?
怎样正确设置remote_addr和x_forwarded_for

Comments
Write a Comment