https://www.root-me.org/en/Challenges/Web-Client/Javascript-Authentication-2
Challenges/Web - Client : Javascript - Authentication 2 [Root Me : Hacking and Information Security learning platform]
TCP - Back to school just blocks when i try to read the flag after i have sent the calculation. Not sure if my calculation is wrong or what is is?
www.root-me.org
Start the challenge 버튼을 눌러 문제를 푸는 웹페이지로 이동하자.
가장 처음의 화면이다.
"Authentication" 라는 문구,
그 아래에 login 버튼,
Close Window 라는 문구에 링크가 걸려있다.
login 버튼을 누르니 Username을 입력하라는 팝업창이 뜬다.
아직은 아는 게 없으니
Username에 admin을 입력한 뒤 확인 버튼을 눌러주었고,
바로 다음에 나오는 Password도 admin을 입력해줬다.
"Nope, you're a naughty hacker." 라고 써있는 팝업창이 뜬다.
그리고 Close Window 를 눌러줬더니 문제를 풀던 창이 말 그대로 닫힌다.
F12 를 눌러 페이지의 소스 코드를 살펴보자.
login 버튼에 대한 소스코드를 읽다가 궁금한 점이 생겼다.
connexion(); 은 어떤 동작을 수행하는 것일까?
더 찾아보니 connexion 함수에 대한 내용을 찾을 수 있었다.
F12 를 눌러 페이지의 소스 코드를 살펴보자.
function connexion(){
var username = prompt("Username :", "");
var password = prompt("Password :", "");
var TheLists = ["GOD:HIDDEN"];
for (i = 0; i < TheLists.length; i++)
{
if (TheLists[i].indexOf(username) == 0)
{
var TheSplit = TheLists[i].split(":");
var TheUsername = TheSplit[0];
var ThePassword = TheSplit[1];
if (username == TheUsername && password == ThePassword)
{
alert("Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)");
}
}
else
{
alert("Nope, you're a naughty hacker.")
}
}
}
캡쳐화면은 글씨가 잘 안 보여서 소스코드를 복사해 코드블럭에 옮겨보았다.
위의 소스코드 전체 중에
if (username == TheUsername && password == ThePassword)
{
alert("Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)");
}
이 부분이 눈에 띈다.
Username과 Password 에 대한 정보가 나와있다고 생각했다.
username칸에는 "TheUsername"을, password칸에는 "ThePassword" 를 입력하면 문제의 정답을 알 수 있을 거라고 생각했다.
그래서 username칸에는 "TheUsername"을, password칸에는 "ThePassword" 를 입력해보았다.
그런데 또 "Nope, you're a naughty hacker." 라고 써있는 팝업창이 떴다.
다시 소스코드를 살펴보자.
function connexion(){
var username = prompt("Username :", "");
var password = prompt("Password :", "");
var TheLists = ["GOD:HIDDEN"];
for (i = 0; i < TheLists.length; i++)
{
if (TheLists[i].indexOf(username) == 0)
{
var TheSplit = TheLists[i].split(":");
var TheUsername = TheSplit[0];
var ThePassword = TheSplit[1];
if (username == TheUsername && password == ThePassword)
{
alert("Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)");
}
}
else
{
alert("Nope, you're a naughty hacker.")
}
}
}
사실 TheUsername 과 ThePassword 이 의미하는 것은 따로 있었다.
다시 생각해보니 TheUsername 과 ThePassword이 "" 안에 들어가있던 것도 아니니
문자열을 의미하는 것도 아니었다.... ㅎㅎ;;
다시 해석해보면,
var TheSplit = TheLists[i].split(":");부분은
TheLists[i]의 값을 : 기준으로 나누어 배열로 저장한다.
즉, 사용자명과 비밀번호가 각각 TheSplit[0]과 TheSplit[1]에 저장된다.
var TheUsername = TheSplit[0];부분은
사용자명을 TheUsername 변수에 저장한다.
var ThePassword = TheSplit[1]; 부분은
비밀번호를 ThePassword 변수에 저장한다.
if (username == TheUsername && password == ThePassword) 부분은
사용자가 입력한 사용자명과 비밀번호가 TheLists 배열에서 발견된 사용자명과 비밀번호와 일치하는지 확인한다.
alert("Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)"); 부분은
조건이 충족되면, 사용자에게 해당 메시지를 띄운다는 의미이다. 즉, 올바른 사용자명과 비밀번호를 입력한 경우이다.
그러니까 결론적으로
":" 이전의 "GOD"를 username에 입력하고,
"HIDDEN"을 password에 입력하면
"Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)" 라고 적힌 메시지를 띄운다는 것이다.
실제로 해봤더니 소스코드를 해석한대로 된다.
"Vous pouvez utiliser ce mot de passe pour valider ce challenge (en majuscules) / You can use this password to validate this challenge (uppercase)"에서 이 password를 이용해 validate this challenge 할 수 있다고 했으니...
password 였던 "HIDDEN"을 정답으로 입력해보자.
정답!
'Hacking (CTF) > 웹 해킹' 카테고리의 다른 글
[webhacking.kr] old-12번 (0) | 2023.09.27 |
---|---|
[Root Me] Javascript - Webpack (0) | 2023.09.26 |
[Root Me] HTTP - COOKIES (0) | 2023.09.23 |
[webhacking.kr] old-19번 (0) | 2023.09.19 |
[webhacking.kr] old-42번 (0) | 2023.09.18 |