WebGoat-Miles Reward Miles는 이용 가능한 모든 보상을 보여줍니다. 당신이 당신의 ID로 로그인할 때, 이 Lesson는 당신에게 당신의 잔액과 당신이 살 수 있는 상품을 보여 줄 것입니다. 당신의 목표는 당신에게 보상으로 허락된 구성 보다 더한 보상을 추가하도록 시도하는 것 입니다.
풀이
Please enter your account ID 옆의 Input box에 ID를 입력하면, 그 아래에 보상 목록이 나옵니다.
그리고 선택한 후 Submit을 누르면 배송될 거라고 메시지가 화면에 표시됩니다.
이 문제는 앞의 DOM injection 과 비슷하게 풀 수 있습니다.
페이지의 동작을 확인하기 위해 개발자 도구에서 네트워크 기능을 실행시켜주세요.
F12 -> 네트워크 / 우클릭 -> 요소 검사 -> 네트워크
이 상태에서 ID를 입력하면 네트워크 창에 Request와 그에 대한 Response가 추가 됩니다.
그래봤자 한 줄만 추가되요. ㅎㅎ 아래는 추가된 Request입니다.
그리고 Request에 대한 Response입니다. Response로 XML을 받습니다.
이 내용이 브라우저에서 처리되어 화면에 표시가 되고, 받을 보상을 선택해서 Submit 할 수 있게 됩니다.
이 과정은 다음과 같이 이루어집니다.
우선 ID를 입력하면 onblur 속성에 의해 getRewards() 함수를 호출합니다.
onnblur는 커서가 떠날 때 실행됩니다.
그리고 이 함수는 부모인 form 태그에 포함된 xmlInjection.js에 있습니다.
그 내용은 아래와 같습니다.
function getRewards(url) { var accountIDField = document.getElementById('accountID'); if (accountIDField.value.length < 6) { return; } var url = url + '&from=ajax&accountID=' + encodeURIComponent(accountIDField.value); if (typeof XMLHttpRequest != 'undefined') { req = new XMLHttpRequest(); } else if (window.ActiveXObject) { req = new ActiveXObject('Microsoft.XMLHTTP'); } req.open('GET', url, false); req.onreadystatechange = callback; req.send(null); } function callback() { if (req.readyState == 4) { if (req.status == 200) { var rewards = req.responseXML.getElementsByTagName('reward'); var rewardsDiv = document.getElementById('rewardsDiv'); rewardsDiv.innerHTML = ''; var strHTML = ''; strHTML = ' Rewards'; for (var i = 0; i < rewards.length; i++) { strHTML = strHTML + ''; strHTML = strHTML + rewards[i].firstChild.nodeValue + ''; } strHTML = '' + strHTML + '
' + strHTML; rewardsDiv.innerHTML = strHTML; } } }
동작은 앞의 DOM Injection 때와 다를 게 별로 없습니다.
url 변수에 적힌 곳으로 request를 보낸 후 그에 대한 response를 받습니다.
다만, callback에서 eval()을 이용한 것이 아니라,
XML을 받아 XML의 내용을 웹 페이지에 맞게 수정하여 그대로 표시하고 있습니다.
즉, ID가 입력되면 이 getRewards() 함수가 호출되어 XML을 요청하는 request를 보내고,
서버에서는 그에 대한 XML을 response로 보냅니다. Ajax에서는 이 response를 받아 수정하여 페이지에 표시하게 됩니다.
이제 이를 토대로 문제를 풀자면,
우리는 response 를 중간에서 가로채 XML에 보상 목록을 추가하는 식으로 해결할 수 있습니다.
우선, Proxy 툴로 ID를 입력할 때 보내지는 Response를 잡습니다.
아래에 보면 XML이 보이는 데요. 이 XML을 아래와 같이 수정하고 패킷을 통과시키면 표시되는 내용이 바뀐 것을 볼 수 있습니다.
WebGoat Mug 20 Pts WebGoat t-shirt 50 Pts WebGoat Secure Kettle 30 Pts WebGoat Core Duo Laptop 2000 Pts WebGoat Hawaii Cruise 3000 Pts
이제 추가된 보상을 선택하고 Submit을 하면 문제가 풀리게 됩니다.