修改Client的ip地址进行xss攻击
任何从客户端获取的数据都是不可信的
说起XSS,我想起的总是这行代码:<script>alert('xss')</script>
,然后拿着它到各种输入框到处试,也有很多成功的情况,但这种弹一个显示框的攻击总觉得没啥作用。
最近跟着师兄实践了一把XSS攻击才知道,以前那种到处找输入框的方式简直too young,too naive……
服务器如何获取用户IP?
先了解几个http头信息:
-
REMOTE_ADDR
:remote_addr
代表客户端的IP,但它的值不是由客户端提供的,而是服务端根据客户端的IP指定的,访问某个网站时,假设中间没有任何代理,那么网站的web服务器(Nginx
,Apache
)就会把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
。 -
以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-For
和Client-Ip
中获取,如果没有经过代理,那就从REMOTE_ADDR
中获取。简直完美,可以把代码交给包工头打卡下班了……
利用IP地址的XSS攻击
如果X-Forwarded-For
和Client-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: