워게임/HackTheBox

[HackTheBox] LoveTok - 웹해킹 / Command Injection

SecurityMan 2022. 11. 15. 11:00

 

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 파일 이름

 

으로 명령어를 입력해보니 플래그를 찾을 수 있었다.

반응형