TeamH4C

[빡공팟 5기] W6 : DVWA 실습 - JavaScript (medium)

이유갬 2022. 10. 30. 23:26

[  실습 목표  ]

Simply submit the phrase "success" to win the level. Obviously, it isn't quite that easy, each level implements different protection mechanisms, the JavaScript included in the pages has to be analysed and then manipulated to bypass the protections.

success 라는 문구를 제출하면 성공이다!


[  실습 화면  ]

- 한번 success 문구를 입력해보았다.

- Invalid token 이라는 문구가 출력된다.

- 소스 코드를 분석해보자.

- setTimeout은 300ms 마다 do_elsesomething("XX") 를 발생시키는 거 같다.

- setTimeout 함수에 대해 검색해보았다.

- 기본 단위가 milliseconds 가 맞다.

- 토큰의 값을 do_elsesomething(e) + success 문구에 XX 를 추가한 것을 인자로 do_something 함수가 가진다.

- do_somethning 함수는 문자열을 거꾸로 저장하여 반환한다.

- 각각이 무슨 역할을 하는지 대략적으로 알 수 있는데 내가 이해한 것이 맞는지 패킷을 잡아서 확인해보자!

 

- 입력폼에 success 를 입력하고 패킷을 잡아보니 위와 같이 나왔다.

- token 을 보니 XXcMegnahCXX 가 나왔다. 점점 함수의 역할에 대해 감이 잡히는 것 같으니 다른 구문을 입력해보았다.

- 다른 구문을 입력해보아도 토큰의 값은 변하지 않는다.

- 다시 소스 코드를 분석해보았다. 더 보기 좋게 Visual Studio Code 로 이동하여 보았다.

- 패킷의 구성과 소스코드를 종합하여 판단해보면 token 은 앞뒤로 XX 가 붙으며 제출할 구문이 거꾸로 저장되어야 한다.

- 그런데 항상 구문이 ChangeMe 로 되어있고 따라서 토큰이 계속 동일한 것이다.

- 따라서, success 를 거꾸로 한 값 XXsseccusXX 를 토큰에 삽입하면 success 제출이 성공한다는 결론을 내릴 수 있다.

- 하지만 setTimeout 의 존재가 아직 신경쓰인다. 다시 한번 살펴보자.

- hidden 되어 있는 token 의 값이 XXChangeMeXX 문자열의 반대로 저장되어 있는 걸 볼 수 있다.

- 이때, 구문도 success 로 변경하고 스크립트 함수의 300 을 1로 변경시켜보자.

- token 의 값이 내가 패킷으로 변경했었던 그 값으로 바뀌었다.

- 그리고 제출을 해보니 Well done! 이 출력되었다.

- 결론적으로 전자의 방법이나 후자의 방법이나 적절한 토큰을 만들어 success 를 제출한것인데,

- 토큰이 생성될 때 setTimeout 함수의 역할을 제대로 파악했더라면 후자의 방법으로 바로 풀었을 것 같다.

- 결론적으로 다시 소스 코드를 분석하자면,

1. phrase 를 success 설정한다. -> 이미 ChangeMe 가 입력되어 있으므로 초반엔 phrase 가 ChangeMe 설정되어 토큰도 그게 맞게 세팅되어 있었던 것이다.

2. setTimeout 함수의 발동으로 do_elsesomething 함수가 호출되고 토큰을 재생성한다.

- 전자의 방법은 setTimeout 함수가 발동되기 까지 기다리지 않고 어떤식으로 토큰이 생성될 지 추론하여 대입하여 푼 것이고

- 후자의 방법은 setTimeout 함수가 정확히 어떤 역할을 하는지 파악하여 해당 시간 변조로 올바른 토큰 생성을 기다리고 값을 제출한 것이다.

- 실습 목표를 달성했다!