워게임/Root Me

[Root Me] PHP - assert() - 웹해킹 / Command Injection

SecurityMan 2022. 7. 14. 11:00

 

PHP의 assert() 함수와 관련된 웹해킹 문제

 

assert() 함수는 프로그래머가 예상치 못한 예외처리를 하기 위해서 사용되는 함수이다.

 

이번 문제에서는 assert() 함수의 취약점을 이용해 .passwd 파일의 내용을 읽으면 된다.

 

반응형

 

 

문제페이지에 접속했을때 화면이다.

 

비밀이 어디있는지 못찾을것이라며 사악한 웃음을 짓고있다..

 

 

메뉴처럼 생긴 Home, About, Contact 버튼을 각각 눌러보면

 

URL이 누를때마다 바뀌는 것을 볼 수 있다.

 

URL에서 ? 뒤에오는것은 변수라고 생각하면 된다.

 

문제페이지에서는 page 변수에 각각의 페이지 이름을 담아서 페이지를 불러오고 있다.

 

 

보통 이렇게 page 를 변수로 받아오는 환경에서

 

LFI(Local File Inclusion) 취약점이 발생한다.

 

그래서 LFI 공격할때 국룰인 ../../../etc/passwd 를 page 변수에 넣어봤다.

 

그랬더니 assert() 함수가 동작해서 에러메세지가 출력되는것이 보인다.

 

strpos() 함수를 사용해서 page 변수에 대입된 값에 .. (점점) 이 있는지 검사하고,

 

만약 있다면, Detected hacking attempt! 가 출력되는것 같다.

 

strpos() 함수는 문자열에서 특정 문자의 위치를 변환하는 함수이다.

 

 

이번엔 ?page=aa 라고 입력해봤다.

 

그랬더니 'includes/aa.php' 라는 파일이 존재하지 않는다는 메세지가 나온다.

 

page 변수에 어떤 값을 입력하면 뒤에 자동으로 .php 라는 확장자가 붙는것이다.

 

여기서 'includes/aa.php'작은따옴표로 감싸져 있는것을 보고 몇가지 테스트를 해봤다.

 

 

?page=' 이라고 입력했을 경우 syntax error 가 난다.

(%27은 URL인코딩된 값으로 작은따옴표를 의미한다.)

 

아마도 'includes/'.php' 이런식으로 서버에 전달되기 때문에

 

작은따옴표가 닫히지 않아서 그런것 같다.

 

 

?page='.' 이라고 입력했더니 이번엔 syntax error가 나지 않는다.

 

'includes/'.'.php' 이렇게 작은따옴표가 짝수개로 잘 닫혔기 때문일 것이다.

 

아마도 소스코드에는 includes/'.$_GET['page'].'.php' 이런식으로 적혀있을 것이다.

 

그래서 page 변수로 받은 값이 $_GET['page'] 자리로 들어가는것이다.

 

 

이번엔 command injection을 위해 system() 함수를 활용해봤다.

 

php 에서 system() 함수를 사용하면 운영체제 명령어를 실행할 수 있다.

 

'.system(id).' 라고 입력하면

 

id 명령어 실행결과가 앞쪽에 출력이 되는것이 보인다.

 

 

목표는 .passwd 파일의 내용을 읽는것이기 때문에

 

.passwd 파일을 먼저 찾아본다.

 

'.system("ls -al").' 이라고 입력해주면

 

숨김파일을 포함한 현재 디렉토리 내의 모든 파일을 보여준다.

 

뒤쪽에 .passwd 파일이 있는것이 보인다.

 

system 함수에서 이번처럼 명령어에 옵션을 줘서 띄워쓰기가 있는경우 쌍따옴표로 감싸주면 된다.

 

 

이제 마지막으로 '.system("cat .passwd").'  라고 입력해주면

 

.passwd 파일 내에 있는 플래그를 읽을 수 있다.

반응형