[Swing CTF] Web-Ayaya
Ayaya
문제 제목과 페이지를 보아서 admin으로 로그인을 하면 플래그가 나오는 것 같다.
아이디: admin, 이메일: admin, 비밀번호: admin
으로 임의적으로 로그인 해보았지만 false가 떴다.
config.js 파일을 열어보니 Admin 권한을 얻을 수 있는 조건을 알 수 있었다.
profile object의 ip가 '127.0.0.1'이 포함되어야 하고,
isadmin의 값이 참이어야 Admin이 될 수 있다.
config.isadmin = function(profile) {
if (!(profile.ip.indexOf('127.0.0.1') > -1)) return false;
if (!profile.isAdmin) return false;
return true;
}
challenge 파일 안에 있는 index.js 파일을 보면
get으로 key와 value를 받고 있는 것을 볼 수 있다. get으로 받은 key와 value값을 각각 key와 value 변수에 저장한다.
key와 value 변수에 저장된 key와 value 값은 sess.user(user session 데이터)와 함께 config.addSessionData 함수에 인자로 전달된다. 즉 /add?key=a&value=b 라는 요청을 보냈을 때 config.addSessionData(sess.user, “a”, “b”)를 실행하게 된다.
다시 config.js 파일로 가서 addSessionData 함수를 찾아보면 인자로 받은 key와 value를 가지는 object를 인자로 받은 obj object에 assign하는 것을 알 수 있다.
아래와 같은 코드를 보면 Object.assign()메서드는 두 object를 합치는 것을 알 수 있다.
아래 코드에서 config.isadmin()함수의 인자로 sess.user.profile을 넘기고 있다. 즉 config.addSessionData()를 사용하여 sess.user.profile을 원하는 값으로 덮으면 config.isadmin()함수가 true를 return하도록 할 수 있다.
config.addSessionData(sess.user, “profile”, {”ip”:”127.0.0.1”, “isAdmin”:true}) 와 같은 구문을 실행하면 플래그를 찾을 수 있을 것이다.
위 구문을 실행하기 위해서 /add에 다음과 같은 파라미터를 넘겨준다.
/add?key=profile&v/add?key=profile&value[ip]=127.0.0.1&value[isAdmin]=true
SWING{4re_y0u_4DMiN?_ye4h!_c53df5f2a3ec98e5a9b8}