HackTheBox 에서 제공하는 LoveTok 문제
웹해킹 문제로 Command Injection 취약점을 이용한 문제이다.
문제페이지에 접속했을 때 화면이다.
You'll find love: 라고하면서 어떤 시간을 알려주고 있다.
아래쪽에 있는 Nah, that doesn't work for me. Try again! 이라는 문구는
위에 있는 시간이 마음에 들지 않을 때 누르는 버튼이다.
버튼을 누르면 URL이 /?format=r 이라고 바뀌면서 시간도 같이 바뀌게 된다.
주어지는 소스코드도 같이 살펴보자.
TimeController.php 파일을 먼저 살펴본다.
isset 으로 format 파라미터가 GET 요청에 있으면 그대로 쓰고, 없으면 r 값을 넣어준다.
이건 아까 빨간 버튼 눌러서 확인한 것과 같다.
그런다음 $time 에 TimeModel($format) 결과를 넣고,
$time 을 이용해 getTime() 함수를 호출하고 있다.
TimeModel.php 파일을 보면 다음 절차를 확인할 수 있다.
일, 시, 분, 초를 랜덤한 값으로 생성해서 prediction 에 담아준다.
getTime() 함수에서는 eval 을 이용해 date함수를 실행하여
fomat 으로 입력받은 형태로 prediction 의 값을 출력해주게 된다.
여기서 format=r 이란 RFC 2822 / RFC 5322 에서 규정한 표시형식을 말한다.
Example에 있는것처럼 Thu, 21 Dec 2000 16:01:07 +0200 이런 표현방식이다.
여기서 일, 시, 분, 초만 가져다가 사용하는 것이다.
그래서 format에다가 연도를 뜻하는 y 나 월을 뜻하는 M 을 넣어주면
이렇게 연도와 월만 출력되는것을 볼 수 있다.
여긴 살짝 여담이었고 문제풀이로 다시 넘어간다.
php 에서 date 함수의 경우 알수없는 format 이 입력되면 문자 그대로를 출력해주는 특징이 있다.
위처럼 format 에 아무런 의미도 없는 bbbb 라는 문자를 입력하면
아래쪽에 bbbb 라고 그대로 출력되는것을 볼 수 있다.
이걸 이용해 Command Injection 을 해본다.
?format=${system(ls)} 라고 입력하면
ls 명령어가 수행되어서 그 결과가 웹페이지 상단에 출력되는것을 볼 수 있다.
그런데 TimeModel.php에 있는 addslashes($format) 때문인지
띄어쓰기를 하거나 옵션을 주면 명령어가 실행되지 않았다.
이럴때 우회하는 좋은 방법이 있다.
?format=${system($_GET[A])}&A=ls -al
과 같은 형태로 system 안에 $_GET[A] 를 써서 A 파라미터를 하나 생성한 뒤,
& 를 이용해 A 에 들어갈 명령어를 지정해 주는 것이다.
?format=${system($_GET[A])}&A=ls / -al
라고 입력해서 / 경로를 살펴보니 flag 로 의심되는 파일이 있었고,
?format=${system($_GET[A])}&A=cat /flag 파일 이름
으로 명령어를 입력해보니 플래그를 찾을 수 있었다.
'워게임 > HackTheBox' 카테고리의 다른 글
[HackTheBox] Illumination - 포렌식 / git (54) | 2022.12.08 |
---|---|
[HackTheBox] Toxic - 웹해킹 / PHP Object Injection (68) | 2022.12.05 |
[HackTheBox] Gunship - 웹해킹 / Prototype Pollution / RCE (55) | 2022.11.07 |
[HackTheBox] baby CachedView - 웹해킹 / Flask (59) | 2022.10.31 |
[HackTheBox] misDIRection - MISC / Shell script (43) | 2022.10.21 |