보안개구리

[A-1 Injection]PHP Code Injection 본문

웹 진단/bWAPP 실습

[A-1 Injection]PHP Code Injection

보안개구리 2024. 6. 14. 11:37

 이번 시간은 PHP Code Injection에 대하여 실습해보겠다.

 

 [Low Level]

 먼저 해당 실습 화면에 접속하면  문구가 화면에 출력되는 것을 확인할 수 있다.

 페이지 소스를 확인해보면 message이라는 문구에 a태그가 달려있는 것을 알 수 있다.

  그러면 화면에 나와있는 굵은 글씨로 된 message를 클릭하면 /phpi.php?message=test로 이동하여 왼쪽 사진에서 오른쪽 사진처럼 변하고 tset라는 단어를 출력한다.

 이때 meesage 변수 값을 다른 값으로 바꾼다면 입력한 값이 test 대신 화면에 출력된다.

 php.php 파일을 살펴보겠다.

 

 위 내용을 살펴보면 난이도 Low Level인 경우 <?php @eval ("echo " . $_REQUEST["message"] . ";");?>를 수행하고 그 밖에 모든 경우에 대해서는 <?php echo htmlspecialchars($_REQUEST["message"], ENT_QUOTES, "UTF-8");;?>를 수행한다.

 

 현재 필자의 실습 난이도는 Low Level이며 따라서 eval 함수가 사용되는데 message라는 변수에 입력받은 값을 echo를 통해 출력하는 형식이다.

 하지만 eval 함수는 인자값을 그대로 실행한다는 취약점이 존재한다.

 message 변수 값에 test;system(pwd) 또는 test; 없이 바로 system(pwd)를 입력해보겠다.

 위 사진처럼 경로가 노출되는것을 알 수 있다.

 이런식으로 시스템 명령어가 실행된다라는 것은 저번 시간에 실습했던 OS Command Injection-Blind 방식처럼 nc를 통해 bin/bash 권한을 받아 직접 입력할 수도 있다.

 

 [Medium, High Level]

 위에서 본것처럼 Low Level을 제외한 모든 것들은 <?php echo htmlspecialchars($_REQUEST["message"], ENT_QUOTES, "UTF-8");;?>를 수행하게 된다.

 아까와는 달리 eval 함수는 사용되지 않는것 같고 대신 익숙한 htmlspecialchars함수가 보인다.

 HTML Injection에서 봤던 부분이며 문자열에서 지정된 특수문자를 HTML로 변환시키는 함수이다.

 그래서 Low Level에서의 실습처럼 message 변수값에 system(pwd)를 입력해도 "system(pwd)"라고 출력됨을 확인할 수 있다.