目录
XSS漏洞
XSS的类型
Vulnerability: Reflected Cross Site Scripting (XSS)
LOW
Medium
HIGH
Vulnerability: Stored Cross Site Scripting (XSS)
LOW
Medium
HIGH
Vulnerability: DOM Based Cross Site Scripting (XSS)
LOW
Medium
HIGH
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets,缩写:CSS)混淆,所以架构跨站脚本攻击缩写为XSS。XSS就是攻击者在web页面插入恶意的Script代码,当用户浏览该页面时,嵌入其中的js代码会被执行,从而达到恶意攻击的目的。某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。
XSS类型一般分为三种:
1.反射型XSS
反射型XSS只是简单的把用户输入的数据“反射”给浏览器,也就是需要诱使用户“点击”一个恶意链接,才能攻击成功。反射型XSS也叫作“非持久性XSS”
2.存储型XSS
存储型XSS会把用户输入的数据“存储”在服务器端。如果没有过滤或者过滤不严,那么这些恶意代码被服务器端接收并存储,用户访问该页面的时候触发代码执行。这种XSS具有很强的稳定性,当再次访问页面时会被执行。<持久化>.这种XSS比较危险,容易造成蠕虫,盗窃cookie等。
存储型XSS和反射型XSS、DOM型XSS相比,具有更高的隐蔽性,危害性也更大。它们之间最大的区别在于反射型XSS与DOM型XSS执行都必须依靠用户手动去触发,而存储型XSS却不需要。
3.DOM Based XSS
DOM的全称为Document Object Model,即文档对象模型,DOM通常用于代表在HTML、XHTML和XML中的对象。使用DOM可以允许程序和脚本动态低访问和更新文档的内容、结构和样式。
实际上,这种类型的XSS并非按照“数据是否保存在服务器端”来划分的,从效果上来说也是反射型XSS单独划分出来的,因为DOM Based XSS的形成原因比较特别。这是由于客户端脚本自身解析不正确导致的安全问题。
这种利用也需要受害者点击链接来触发,DOM型XSS是前端代码中存在了漏洞(DOM型的XSS是不需要与服务器交互的,它只发生在客户端处理数据阶段),而反射型是后端代码中存在了漏洞。
反射型和存储型xss是服务器端代码漏洞造成的,payload在响应页面中,在dom xss中,payload不在服务器发出的HTTP响应页面中,当客户端脚本运行时(渲染页面时),payload才会加载到脚本中执行。
页面源代码:
Hello ' . $_GET[ 'name' ] . '
';
}
?>
代码分析:直接采用get方式传入了name参数,并没有任何的过滤与检查,存在明显的XSS漏洞。
(1)直接输入最简单的payload:测试是否存在XSS漏洞,大多数XSS漏洞可以利用该种方法检测。
回显弹框
将变化的url值进行url解码为:?name=#
题目源代码:
Reflected XSS Source
vulnerabilities/xss_r/source/medium.php
', '', $_GET[ 'name' ] );
// Feedback for end user
echo "Hello ${name}
";
}
?>
代码分析:这里很明显看得出来,是对script字符进行了过滤,使用str_replace()函数将输入中的script替换成为空,于是需要我们想办法绕过过滤字符。
1.双写绕过
2.大小写绕过
可以弹框
页面源代码
Hello ${name}
";
}
?>
针对特殊符号,均有过滤,使得双写绕过以及大小写混淆绕过失效。(正则表达式中的i表示不区分大小写)。
script标签失效,但是可以通过img、body等标签的事件或者iframe等标签的src注入恶意的js代码。
1.采用img标签转换后的XSS payload:
其他编码形式:
2.使用iframe标签:
使用DATA URL进行XSS:
其中的“PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4=”就等同于“”
Stored XSS Source
vulnerabilities/xss_s/source/low.php
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
//mysql_close();
}
?>
相关函数介绍:
trim(string,charlist)函数移除字符串两侧的空白字符或其他预定义字符,预定义字符包括\0、\t、\n、\x0B、\r以及空格,可选参数charlist支持添加额外需要删除的字符。
mysqli_real_escape_string(string,connection)函数会对字符串中的特殊符号(\x00,\n,\r,\,',",\x1a)进行转义。
stripslashes(string)函数删除字符串中的反斜杠。
从代码中可以知道,对输入并没有做XSS方面的过滤以及检查,并且存储在数据库中,因此这里存在明显的存储型的XSS漏洞。经典payload:
1在界面输入经典payload,发现name框对输入长度有限制,因此将payload转而输入message框,发现可以成功注入。
2
(1)修改name框的最大长度,让经典payload在name框也可以发挥作用。在网页web工具栏中 直接找到name输入框的属性设置,修改maxlength = “100”。
(2)直接在name框输入经典payload,发现对长度已经没有限制。
(3)随便输入message的值,回显成功注入。
页面源代码
', '', $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( '' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
//mysql_close();
}
?>
相关函数介绍:
strip_tags()函数剥去字符串中的HTML、XML以及PHP的标签,但允许使用标签。
addslashes()函数返回在预定义字符(单引号、双引号、反斜杠、NULL)之前添加反斜杠的字符串。
并且message参数使用了htmlspecialchars函数进行编码,因此无法再通过message参数注入XSS代码,但是对于name参数,只是简单过滤了。成功注入。
从代码中可以看到,对 http://your ip/vulnerabilities/xss_d/?default=German#
Unknown Vulnerability Source
vulnerabilities/xss_d/source/high.php
分析代码:default变量中的值,只允许French、English、German、Spanish中的一种才行,否则就会跳转结束运行。
这里可以采用上一种方式然后。payload:
绕过方式:
default=German&x=
default=German#
参考目录:
XSS漏洞整理笔记 - FreeBuf网络安全行业门户
DVWA 之 Reflected Cross Site Scripting (XSS)_baynk的博客-CSDN博客
DVWA XSS (Reflected) 反射型跨站脚本 - FreeBuf网络安全行业门户
DVWA下的XSS通关(存储型) - FreeBuf网络安全行业门户
DVWA 之 Stored Cross Site Scripting (XSS)_baynk的博客-CSDN博客
代码审计——DVWA DOM Based Cross Site Scripting (XSS) DOM型XSS_霓虹灯啊的博客-CSDN博客