网站建设与网页设计...,建网赌网站流程,广州安全教育平台官网,无人在线观看高清视频单曲直播[网络安全]DVWA之XSS#xff08;Stored#xff09;攻击姿势及解题详析合集 XSS(Stored)-low level源代码姿势基于Message板块基于Name板块 XSS(Stored)-medium level源代码姿势双写绕过大小写绕过Xss标签绕过 XSS(Stored)-high level源代码姿势#xff1a;Xss标签绕过 XSS(S… [网络安全]DVWA之XSSStored攻击姿势及解题详析合集 XSS(Stored)-low level源代码姿势基于Message板块基于Name板块 XSS(Stored)-medium level源代码姿势双写绕过大小写绕过Xss标签绕过 XSS(Stored)-high level源代码姿势Xss标签绕过 XSS(Stored)-Impossible level源代码代码审计 总结 免责声明本文仅分享XSS攻击相关知识不承担任何法律责任。 DVWA请读者自行安装本文不再赘述。 XSS(Stored)-low level
源代码
?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();
}? trim() 函数移除字符串两侧的空格以确保数据在插入到数据库时没有多余的空白字符。
使用 stripslashes() 函数去除反斜杠同时使用 mysqli_real_escape_string() 函数转义特殊字符。
使用 mysqli_real_escape_string() 函数将特殊字符转义为它们的 Unicode 编码以确保它们不会被视为 SQL 语句的一部分。 从源代码来看它没有明确的防御 XSS 攻击的措施。
姿势
基于Message板块
Payloadscriptalert(qiu)/script
基于Name板块
Name只允许输入八个字符而XSS语句是比八个字符长的。 绕开长度限制 \color{#00FF00}{绕开长度限制} 绕开长度限制 将页面Name元素的maxlength改为100 Payloadscriptalert(qiu)/script
XSS(Stored)-medium level
源代码
?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();
}
? 对留言内容 $message 进行了三种过滤
使用 strip_tags() 函数移除所有 HTML 和 PHP 标签使用 addslashes() 函数将字符串中的特殊字符转义例如单引号、双引号和反斜杠使用 htmlspecialchars() 函数将message中特殊字符例如 转换为相应的 HTML 实体以防止 XSS 攻击。
对姓名 $name 进行了两种过滤
使用 str_replace() 函数将字符串中的script替换为空字符串使用 mysqli_real_escape_string() 函数转义字符串中的特殊字符例如单引号和双引号以防止 SQL 注入攻击。
姿势
双写绕过
以message为注入点Payloadscripscripttalert(1)/scrscriptipt 无回显原因htmlspecialchars() 函数将message中的特殊字符例如 转换为相应的 HTML 实体
以Name为注入点 大小写绕过
由于str_replace() 函数对大小写敏感可通过大小写绕过限制。 以Name为注入点PayloadScriptalert(1)/sCript Xss标签绕过
由于针对Name的str_replace() 函数只对script起过滤作用因此可使用不同的Xss标签进行绕过。 以Name为注入点Payloadimg src1 onerroralert(1) XSS(Stored)-high level
源代码
?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();
}? 对留言内容 $message 进行了三种过滤
使用 strip_tags() 函数移除所有 HTML 和 PHP 标签使用 addslashes() 函数将字符串中的特殊字符转义例如单引号、双引号和反斜杠使用 htmlspecialchars() 函数将特殊字符如 转换为相应的 HTML 实体以防止 XSS 攻击
对姓名 $name 进行了两种过滤
使用 preg_replace() 函数将字符串中的 script 替换为空字符串使用mysqli_real_escape_string() 函数转义字符串中的特殊字符例如单引号和双引号以防止 SQL 注入攻击。
姿势Xss标签绕过 切换 X S S 标签 \color{#FF00FF}{切换XSS标签} 切换XSS标签
以Name为注入点Payloadimg src1 onerroralert(1) 以Name为注入点Payloadaudio src1 onerroralert(1) XSS(Stored)-Impossible level
源代码
?phpif( isset( $_POST[ btnSign ] ) ) {// Check Anti-CSRF tokencheckToken( $_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();? 代码审计
if( isset( $_POST[ btnSign ] ) ) {该行通过 isset() 函数判断 PHP 脚本是否是由提交按钮 btnSign 触发的。如果是则执行后续代码。
接着代码调用了 checkToken() 函数用于验证 Anti-CSRF token 是否匹配
checkToken( $_REQUEST[ user_token ], $_SESSION[ session_token ], index.php );这个函数需要三个参数用户提交的 CSRF token、服务器存储的 CSRF token 和当前页面的 URL。函数会检查两个 token 是否相同以及请求是否来自于正确的来源从而避免跨站点攻击。
接下来的代码获取了用户输入的姓名和留言信息
$message trim( $_POST[ mtxMessage ] );
$name trim( $_POST[ txtName ] );trim() 函数移除字符串两侧的空格。这样可以确保数据在插入到数据库时没有多余的空白字符。
然后使用 stripslashes() 函数去除反斜杠同时使用 mysqli_real_escape_string() 函数转义特殊字符
$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 );$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 );mysqli_real_escape_string() 将特殊字符转义为 Unicode 编码。
最后使用 htmlspecialchars() 函数对用户输入的数据进行 HTML 编码以防止 XSS 攻击。该函数将 HTML 特殊字符转义为实体从而避免恶意代码在浏览器中执行。
接下来的代码使用 PDO 对用户数据进行插入
$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();$db 是一个预先创建的 PDO 数据库连接。这个代码段使用了 PDO 的预准备语句prepared statement功能这是一种避免 SQL 注入攻击的最佳方法之一。使用 bindParam() 函数将实际插入的值与数据库字段绑定起来确保即使用户输入包含非法字符也不会对 SQL 查询产生影响。
最后调用 generateSessionToken() 函数来生成 Anti-CSRF token
generateSessionToken();这个函数采用某些规则生成随机的 session_token并将其存储在 PHP 会话中。 总结
以上为[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集读者可躬身实践。
[网络安全]DVWA之XSS合集
[网络安全]DVWA之XSS(DOM)攻击姿势及解题详析合集
[网络安全]DVWA之XSS(Reflected)攻击姿势及解题详析合集
我是秋说我们下次见。