Low level
- <?php
-
- // Is there any input?
- if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
- // Feedback for end user
- echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
- }
-
- ?>
Medium level
- <?php
-
- // Is there any input?
- if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
- // Get input
- $name = str_replace( '<script>', '', $_GET[ 'name' ] );
-
- // Feedback for end user
- echo "<pre>Hello ${name}</pre>";
- }
-
- ?>
High level
- <?php
-
- // 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 user
- echo "<pre>Hello ${name}</pre>";
- }
-
- ?>
Impossible level
- <?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();
-
- ?>
通过以上的代码范例可以看到,在medium和high的防御措施上,仍旧是黑名单式的过滤,而且思考的很狭隘,只是过滤了<script>标签,medium中直接硬编码的黑名单最不可取,别说换标签,直接大小写绕过;在High级别里面,通过正则,避免了<script>标签使用的可能,但是能够触发js的标签远不止这一个,随便一个<img src=1 onerror=[xss]>如都是可以绕过的。可以想到基于黑名单的策略是很容易疏漏的,不可取。在impossible中,直接对输入进行htnlspecilchars()编码转换,杜绝了xss。
(2) 存储型
注意下面的代码只是偏向于服务器对用户的输入不经过验证处理就直接入库,导致下次取出展现到前端的时候出现xss。代码没有包含从数据库取出的操作部分。因为只要从用户获取到数据后进行了严格的验证处理,就可以避免存储型xss,所以最终原因不是从数据库取出部分,所以DVWA省略掉了。出于篇幅原因,在DVWA的存储型的漏洞复现中的缺陷细节和反射型类似,都是标签,正则过滤不全。就不再赘述,现把impossible代码规范列出:
- <?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 = mysql_real_escape_string( $message );
- $message = htmlspecialchars( $message );
-
- // Sanitize name input
- $name = stripslashes( $name );
- $name = mysql_real_escape_string( $name );
- $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();
-
- ?>
(编辑:威海站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|