* 이 페이지는 계좌이체를 하는 간단한 인터넷 은행 프로그램 입니다.
* 아래에 당신의 잔고, 이체할 계좌 그리고 이체할 양이 보여집니다
* 프로그램은 기본적인 사용자 측의 검증을 한 후에 거래를 제출하기 위해 AJAX를 사용합니다.
* 당신의 목표는 사용자의 권한을 우회하고 조용하게 거래를 실행하는 것 입니다.
풀이
아…영어 실력이… 사용자의 권한이라 길래 사용자 권한 검사해서 우회하는 문제인가 했더니…사용자가 입력한 값을 검사하는 함수를 우회하는 문제였네요…;;;
사용자가 계좌랑 이체할 금액을 적으면 그 값이 제대로 된 값인지 검증하는 함수가 실행되고 이체를 진행하게 되는 데 검증하는 함수를 우회하는 문제입니다.
함수를 찾기 위해 Confirm에서 개발자 도구를 실행
(Confirm 우클릭 -> 검사)
위에 <script> 태그를 보니 따로 다운받는 게 아니라 HTML에 적어놨네요. 아래는 해당 스크립트 소스 입니다.
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').innerHTML; 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').innerHTML = balanceValue + '$'; } function submitData(accountNo, balance) { var url = '#attack/179/400&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; }}}
위에 있는 processData 함수에서 입력한 값에 대한 검증이 이루어지고, 아래 submitData 함수에서 이체가 이루어 집니다. 따라서, 우리는
submitData 함수를 바로 호출해서 입력값에 대한 검증 없이 이체를 실행해야 합니다.
뭐…소스코드를 수정해도 되지만, 브라우저에서는 스크립트를 바로 실행할 수 있습니다.
브라우저의 주소창에 아래와 같이 입력해주세요.
javascript:submitData(123,123)
자바스크립트 함수를 실행시키는 명령어로 : (콜론이라고 하나요) 뒤에 있는 함수를 실행합니다. submitData 함수에 정의된 대로 accountNo와 balance 값을 적어 실행시킵니다.
…
이러면 풀려야 하는데…안풀리네요…;;;;
5.X버전으로 바꿔야하나…