-
[TSG] Upside-down cake (혹시나 역시나 자바 스크립트)CTF/web 2023. 11. 5. 18:56
입대하고 오랜만에 글을 쓴다..
일에 치이고 사람에 치이고 시간에 치이느라 다른 부분에 신경을 많이 못 썼다. 블로그 활동도 열심히 해야겠다.
슬슬 공부한 것들을 몰아서 써봐야겠다!
이건 오랜만에 풀어본 웹 문제이다!
자바스크립트의 괴랄한 문법에 대한 소문은 많이 들었지만 그것을 체감하는 문제였다...
문제 페이지다! 정말정말 긴 회문을 입력해야한다.
우리의 입력값은 json 형태로 넘어가 길이를 체크하고, 타입은 문자열인지, 회문인지를 체크한다.
근데 최대 요청 사이즈는 100으로 설정해버린 악독한 문제이다.
아니면 1000글자를 정직하게 넣는 문제라는 것을 알려줘서 오히려 좋은 문제인가....?
1. Bypass if(string.length < 1000)
첫번째 난관이다. 100글자 미만을 입력시켰으면서 길이가 1000보다 작으면 안된다.
처음 보고서는 파이썬처럼 'a'*1000 같은 문법이 통할까 싶었지만 어림도 없었다!
그렇게 여러가지를 테스트하며 고민하던 중....
??????????
a.length의 값이 undefined일 경우 if 문이 그냥 통과되어 버린다.
이게 뭔가 싶어 MDN 문서를 찾아봤다.
그니까... NaN < 1000 은 false가 되어버린다는 것인가...?
진짜네...
이렇게 첫번째는 어찌저찌 해결됐다.
우리는 데이터의 type을 Object로 넘겨주어 string.length를 undefined로 만들어주어야한다!
근데 이제 보니까 main.mjs의 변수명을 string으로 해서 더 헷갈렸던 것 같다.
2. Bypass typeof ~~ === 'string'
이제 나머지 하나만 우회하면 된다.
근데 여기서 또 의문이 들었다.
Array(string.length).keys() 부분인데
우리가 string.length를 undefined로 만들어줬는데... 이게 어떻게 되는거지..?
Array(string.length) 에서 [undefined]라는 배열이 생성되고, 해당 배열의 길이는 결국 1이기 때문에 결과값으로 0이 나오는 모습이다
나머지는 Object 형식으로 넘겨줬기에 key 값만 맞춰주면 될 것이라고 생각했다.
근데 문득 든 생각이 있다.
반복문에서 i는 0으로 한 번만 코드가 실행되는데
14번째 줄의 string[undefined - i - 1 ] 부분에서 undefined - i - 1은 결국 NaN이 된다.
그렇다면 NaN이 키값으로...되나...?
된다..
그럼 끝났다.
자바스크립트의 무시무시함을 맛볼 수 있는 문제였다.
혹시나 싶은 것들이 다 어찌저찌 동작해서 무서웠다.
혹시나 역시나 자바스크립트...
'CTF > web' 카테고리의 다른 글
[imaginary] roo cookie (1) 2022.07.19 [imaginary] maas (0) 2022.07.19