前期准备:linux下搭建dvwa需要lamp环境,其php版本不能太高,php7.0无法使用,php5.6可以;
XSS定义
CSS(Cross Site Script)又叫XSS,中文意思:跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行。XSS的攻击目标是为了盗取客户端的cookie或者其他网站用于识别客户端身份的敏感信息。获取到合法用户的信息后,攻击者甚至可以假冒最终用户与网站进行交互。
XSS的原理
也就是往HTML中注入脚本,HTML指定了脚本标记.在没有过滤字符的情况下,只需要保持完整无错的脚本标记即可触发XSS,假如我们在某个资料表单提交内容,表单提交内容就是某个标记属性所赋的值,我们可以构造如下值来闭和标记来构造完整无错的脚本标记,"><"
反射型XSS
等级Low
源代码
Hello ' . $_GET[ 'name' ] . '
';
}
?>
这里随便输入Word试一下:
word ;
观察到调用函数输出了Xss弹窗,后面为Word,其实可以完成许多功能。
等级Medium
源代码:
', '', $_GET[ 'name' ] );
// Feedback for end user
echo "Hello ${name}
";
}
?>
观察发现使用str_replace
进行了黑名单过滤,绕过这个不成问题,使用
双写绕过
大小写混写绕过
等级High
Hello ${name}
";
}
?>
使用正则进行匹配,过滤了大小写混合写入已经双写,但是可以使用img、body等标签的事件以及iframe标签的src注入恶意的js代码进行漏洞利用
等级Impossible
源代码:
Hello ${name}
";
}
// Generate Anti-CSRF token
generateSessionToken();
?>
htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。以防止浏览器将其作为HTML元素。这样会将用户输入的内容都不作为标签以提高安全性。
预定义的字符是:
& (和号)成为 &
" (双引号)成为 "
' (单引号)成为 '
< (小于)成为 <
> (大于)成为 >
一些常用的xss语句
最普通的xss代码
获取cookie
img链接地址xss
注释方法防止过滤
加载图像失败执行
存储型XSS
等级Low
源代码:
' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '
' );
//mysql_close();
}
?>
部分函数讲解
trim() 函数移除字符串两侧的空白字符或其他预定义字符。
相关函数:
ltrim() - 移除字符串左侧的空白字符或其他预定义字符
rtrim() - 移除字符串右侧的空白字符或其他预定义字符
stripslashes():删除由 addslashes() 函数添加的反斜杠。该函数用于清理从数据库或 HTML 表单中取回的数据。(若是连续二个反斜杠,则去掉一个,保留一个;若只有一个反斜杠,就直接去掉。);
mysqli_real_escape_string:转义字符串中的特殊字符;
name栏输入发现有字数限制,那就抓包改数据;
message栏正常输入即可,
等级Medium
源代码:
', '', $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参数,简单过滤了字符串,仍然存在存储型的XSS。
使用双写
成功弹框
大小写混合绕过