이번에는 자주 발생하지는 않지만 강력한 위력을 가진 code injection(server-side injection)에 대한 이야기를 풀어나갈까 합니다.
대체로 php injection 으로 많이 알려져 있으며, 여러가지 웹 언어에서 동작이 가능한 공격방법입니다.
Code Injection(PHP Injection)이란?
웹 서비스 개발 과정 중 서버사이드 언어(php,jsp,asp 등)을 include 하는 과정에서 생길 수 있는 취약점이며 공격자가 코드를 웹 서비스로 넘기고 웹이 처리하여 발생하는 취약점입니다.
해당 공격을 통해서 공격자 악성 php,jsp 등의 스크립트를 실행할 수 있게 되지요. 간단하게 php를 예시로 작성합니다.
Code Injection is the general term for attack types which consist of injecting code that is then interpreted/executed by the application. This type of attack exploits poor handling of untrusted data. These types of attacks are usually made possible due to a lack of proper input/output data validation, for example: data format amount of expected data
Code Injection differs from Command Injection in that an attacker is only limited by the functionality of the injected language itself. If an attacker is able to inject PHP code into an application and have it executed, he is only limited by what PHP is capable of. Command injection consists of leveraging existing code to execute commands, usually within the context of a shell.
allowed characters (standard regular expressions classes or custom)
(wiki)
PHP Injection 의 발생 경로
웹 해킹에 사용되는 기술은 웹 프로토콜(http)에서의 대다수 행위에 대해 공격이 가능합니다. PHP Injection 또한 XSS, SQL Injection 이 취약한 부분과 같이 넓은 범위에 대해 공격시도가 가능합니다. 크게 몇가지로 정리해보았습니다.
-
GET Parameter를 통한 Injection
-
POST Data를 통한 Injection
3.Cookie를 통한 Injection
4.HTTP Header 부분에 Injection
이외에도 웹에서 인자값을 받아 처리할 수 있는 구간에서는 모두 동작할 수 있습니다.
PHP Injection 을 통한 공격
- 구문 우회를 통한 Injection 이 방법은 XSS 공격 시 Javascript 내 구문을 삽입하는 형태와 매우 유사합니다. OWASP에서 제공하는 코드를 보면 쉽게 이해가 가능합니다.
eval 함수를 구문을 실행하는 중 공격자가 세미콜론을 이용하여 명령행을 닫은 후 원하는 명령을 수행하는 형태입니다.
vul.php <?
$myvar = "varname";
$x = $_GET['arg'];
eval("\$myvar = \$x;");
?>
내용이 위와 같다면 공격자 /vul.php?arg=1; phpinfo() 와 같은 형태로 공격이 가능합니다.
- PHP 파일 참조를 통한 Injection 대게 1번의 방법은 개발 당시 저런 형태로 개발된 경우가 적습니다. 실제로 취약점 진단 시 저런 형태의 Injection 은 많이 발생하지 않습니다.
대체로 db conf 파일 참조나 다른 php 파일을 로드해서 사용하는 경우 유사한 형태로 Code Injection 이 가능합니다.
vul.php <? $test = $_GET[‘dbset’]; include($test); ?>
이런 코드가 있다면 공격자는 /vul.php?dbset=../../downfile/rm_rf.php 같은 형태로 rm_rf.php 의 코드를 실행 할 수 있습니다. LFI 이며 이 것도 어찌보면 Code Injection 과 같다고 할 수 있습니다. 또한 RFI 처럼 외부 링크 참조가 가능할 때 공격자는 자신의 서버에 있는 php 코드를 타겟에서 호출하여 injection 이 가능합니다.
Injection 을 확인하는 방법
타겟의 중요도와 안정성을 생각하여 여러가지 형태로 테스트를 진행할 수 있습니다. 일반적으로 php의 실행 여부를 확인하기 위해서는 간단한 스크립트로 확인하는 법이 안전하고 좋습니다.
ex) /vul.php?arg=1; echo “Vulnerbility!!” ex) /vul.php?arg=1; phpinfo();
웹 페이지에서 Vulnerability 가 나타나면 취약하다고 볼 수 있습니다.
좀 더 나아가서 우리는 시스템 명령 수행 여부를 확인할 수 도 있습니다.
ex) /vul.php?arg=1; system(“id”); ex) /vul.php?arg=1; system(“uname -a”);
시스템 명령 수행만 가능하여도 시스템에 대해 어느정도 제어가 가능하며, 웹쉘 업로드 등 추가적인 Action 이 가능합니다.
삽입된 형태에 따라 따르지만 저장되는 형태의 Injection(대체로 POST 방식일듯..) 이라면 OneLine WebShell 업로드를 통해 웹 쉘 사용도 가능합니다.
중략
set=1&maxx=34&phpinfoON=phpinfo()&test=123
이라고 POST 요청 시 데이터가 저장된다면 공격자는 아래와 같은 형태로 웹 쉘을 올릴 수 있습니다.
POST /vul.php HTTP/1.0
중략
set=1&maxx=34&phpinfoON=eval($_GET[‘h_cmd’]);&test=123
이후 업로드 된 페이지를 h_cmd 파라미터를 통해 oneline shell을 동작한다면 쉽게 시스템 제어가 가능합니다.
Injection 이후 공격자의 행위
php injection이 성공한 후 공격자는 무엇을 할까요? 공격자 입장에서 생각하였을 때 저의 경우에는 시스템 정보 획득 및 쉘 권한을 따오는게 주 목적이 되지 않을까 싶습니다. 물론 공격자의 목적에 따라 어느 정도 이어지는 Action이 달라지겠지만 대체로 정보수집 + 쉘 권한이라고 봅니다.
-
injection을 통한 정보수집 정보 수집의 경우에는 실행된 php 명령을 통해 시스템의 설정이나 다른 source 파일을 확인하여 공격자가 이후 이루어질 공격에 대해 쉽게 할 수 있도록 많은 정보를 수집할 것입니다.
-
Injection 이후 Shell 업로드
공격자가 시스템 접근 권한을 노리고 있을 시 shell을 업로드 할 가능성이 높아집니다. shell은 접근성이 좋은 webshell 부터 시스템에 직접 bind, reverse shell을 설치하여 공격자가 접근 권한을 획득할 수 있습니다.