个人看法:现在企业中xss可能比较少了,如果在挖掘中测试xss直接返回405或者403,500这种极有可能是他们加上了waf(web安全防火墙)。一般都是绕不过去我们可以尝试其他漏洞,或者找旁站!
1.XSS平台
DVWA靶场通关-已完结(可参考) https://blog.csdn.net/Yb_140/article/details/122632752
** (XSS)(基于 DOM 的跨站脚本)DOM Based Cross Site Scripting**
Low(低级)
跨站脚本攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。
DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM—based XSS漏洞。
注入代码,直接弹窗显示
?default=<script>alert(11)</script>
Medium(中级)
简单来说,就是过滤掉了“<script”,当函数匹配到 <script 字符串的时候就会将URL后面的参数修正为 ?default=English
在这里可以通过onerror事件,在装载文档或图像的过程中如果发生了错误就会触发
注入代码
?default=</option></select><img src=x onerror=alert(1)>
High(高级)
设置了白名单,只对default进行检查,可以使用&连接另一个自定义变量来绕过
构造
注入代码
English&<script>alert(1)</script>
Impassible(无动于衷)
这一关看来什么反应都没有,
源码解析:
<?php # Don't need to do anything, protction handled on the client side ?>不需要做任何事情,保护由客户端处理
**(XSS)(反射跨站脚本)Reflected Cross Site Scripting **
是非持久型,参数型的跨站脚本
Low(低级)
XSS攻击需要具备两个条件:
需要向web页面注入恶意代码;
这些恶意代码能够被浏览器成功的执行
XSS反射型漏洞
反射型XSS的触发有后端的参与,而之所以触发XSS是因为后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。
基本原理就是通过给别人发送带有恶意脚本代码参数的URL,当URL地址被打开时,特定的代码参数会被HTML解析,执行,如此就可以获取用户的COOIKE,进而盗号登陆。
服务器并没有对 name 参数做任何的过滤和检查。
注入代码
<script>alert(1)</script> 进行尝试Medium(中级)
源码分析
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
//将输入中的<script>转化为空
$name = str_replace( '<script>', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>会检查 name 参数中是否有 “< script >”,如果有则替换为空
可以使用大小写绕过
<sCript>alert(1)</ScRipt>或者
<sc<script>ript>alert(1)</script>
High(高级)
源码分析
<?php
header ("X-XSS-Protection: 0");
// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
// Get input
//使用通配符,完全匹配scriptN,所以有关script的标签全被过滤
$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );
// Feedback for end user
echo "<pre>Hello ${name}</pre>";
}
?>preg_replace() 函数执行一个正则表达式的搜索和替换,**“*” **代表一个或多个任意字符,“i” 代表不区分大小写。也就是说 “< script >” 标签在这里被完全过滤了,但是我们可以通过其他的标签例如 img、body 等标签的事件或者iframe 等标签的 src 注入 JS 攻击脚本。
注入代码
Impassible(无动于衷)
源码分析
<?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();
?>htmlspecialchars() 函数用于把预定义的字符 "<" 和 ">" 转换为 HTML 实体,防止了我们注入 HTML 标签。htmlspecialchars 函数会将 < 和 > 转换成 html 实体而不是当做标签,所以我们插入的语句并不会被执行。
htmlspecialchars详解
(120条消息) htmlspecialchars详解_The-Back-Zoom的博客-CSDN博客_html_special_chars
(XSS)(存储跨站脚本) Stored Cross Site Scripting
是持久性跨站脚本,持久性体现在xss代码不是在某个参数中,而是写进数据库或文件等可以长久保存数据的介质中,储存性xss通常发生在留言板中,我们可以在留言板留言,把恶意代码写进数据库中。
Low(低级)
在留言板中注入代码
注入代码
<script>alert("hello")</script>同样name框中也可以注入代码不过在这里做了限制需要修改前端的html代码进行注入
一样注入成功!
再次访问此页面时,就会有次弹窗
成功后更新数据库
Medium(中级)
这里我只挑了部分源码
Message处使用了htmlspecialchars()函数,将字符全部转为了HTML实体,因此Message处无法使用XSS形成攻击。
name处做了长度限制,因此考虑使用抓包在BP中修改name的值,考虑使用双写或者大小写去绕过。
$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 );<scr<script>ipt>alert(1)</script>
High(高级)
与11的High相同,script被过滤
使用BP改name即可
<img src=1 onerror=alert(1)>
Impassible
源码解析:
<?php
if( isset( $_POST[ 'btnSign' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// 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)) ? "" : ""));
$message = htmlspecialchars( $message );
// Sanitize name input
$name = stripslashes( $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)) ? "" : ""));
$name = htmlspecialchars( $name );
// Update database
$data = $db->prepare( 'INSERT INTO guestbook ( comment, name ) VALUES ( :message, :name );' );
$data->bindParam( ':message', $message, PDO::PARAM_STR );
$data->bindParam( ':name', $name, PDO::PARAM_STR );
$data->execute();
}
// Generate Anti-CSRF token
generateSessionToken();
?>对Name和Message都使用了htmlspecialchars()函数做了过滤,还加了token值,进一步提高了安全性。









