김승겸 한남대학교 컴퓨터공학과 인공지능 실험실 [Hacking Exposed] 웹 기획. 운영자를 위한 해킹과 보안중에서 8장. 입력 확인 공격 김승겸 한남대학교 컴퓨터공학과 인공지능 실험실
목차 Part I : 입력 확인 공격이란? Part II : 클라이언트-측 확인 루틴 우회 Part III : 일반적인 입력 확인 공격 Part IV : 일반적인 대응방법 Part V : 참고문헌
Part I : 입력 확인 공격이란?
정의 입력 확인 공격이란? 애플리케이션이 받아들일 수 없도록 되어 있는 데이터를 전송하려고 하는 시도 정상적인 데이터 전송 정상적인 사용자 비정상적인 데이터 전송 피해 서버 악의적인 사용자
입력 확인 공격 유형 예상하지 못한 입력 명령 실행 문자 버퍼 오버플로우
Part 2 : 클라이언트-측 확인 루틴 우회
자바스크립트 입력 확인을 수행하는 스크립트 자바스크립트는 서버에서 입력확인을 하기 위해서 작성 클라이언트측의 웹 브라우저에서 실행 브라우저에서 실행된다는 측면에서 안전하지 않다. 자바스크립트 확인 루틴 우회가능
아킬레스 Proxy server 역할을 수행 전형적인 HTTP proxy는 client browser와 web server사이에서 패킷을 중계한다. 아킬레스 또한 패킷을 중계하지만, 중계과정에서 intercept mode를 켜놓게 되면 패킷에 대한 변경이 가능하다. 웹 서버에서 브라우저, 브라우저에서 웹 서버로 가는 패킷은 아킬레스 proxy를 거치게 되고 그 패킷은 사용자에 의해서 변경할 수 있다.
아킬레스 패 킷 패 킷 Intercept mode를 켜놓고 아킬레스를 통과하는 패킷을 변경할 수 있다. 아킬레스 0.27 웹 브라우저 웹 서버
아킬레스 회원가입폼 간단하게 작성한 회원가입폼 각 폼필드의 내용은 post방식으로 서버에 전송 아킬레스를 사용하여 전송되는 패킷 내용을 볼 수 있고 수정이 가능하다.
아킬레스 아킬레스를 통해 본 패킷 내용 HTTP 헤더 내용 전송되는 데이터
아킬레스 아킬레스를 이용한 패킷 데이터 변조 post 방식으로 전송되는 데이터 변조 email과 phone필드 변경
아킬레스 변경된 데이터가 저장된 테이블 email과 phone에 저장된 내용 실제로 데이터베이스 테이블에 저장된 필드를 보면 바뀐 내용이 들어간 걸 알 수 있다.
아킬레스 로그인 아이디와 비밀번호를 입력하고 login버튼을 누르게 되면 아킬레스를 거쳐 패킷이 전송되고 웹서버에서는 다시 웹브라우저로 패킷을 전송하게 되는데 그 패킷 또한 아킬레스에서 볼수 있고 수정할 수 있다.
아킬레스 아킬레스를 이용한 패킷 데이터 변조 로그인 한 후에 main.php가 웹 브라우저에 나타나야 하지만 아킬레스를 로그인후에 웹서버 가 보내는 패킷내용 원본 패킷 수정된 패킷 로그인 한 후에 main.php가 웹 브라우저에 나타나야 하지만 아킬레스를 통해 링크를 수정할 수 있다.
Part 3 : 일반적인 입력 확인 공격
버퍼 오버플로 정의 정해진 STACK영역의 크기를 초과해서 데이터 삽입 즉, 함수의 실행후에 돌아올 리턴어드레스가 변경 이경우, 돌아올 주소에 임의의 명령어를 놓아들 경우에 해커가 원하는 명령어를 실행할수 있게 된다.
버퍼 오버플로 Perl을 이용한 버퍼 오버플로 테스트 perl –e ‘print “a” x 500’ echo –e “GET /login.php?user=faustus\nHTTP/1.0\n\n” | nc –vv www.victim.com 80 “GET /login.php?user=faustus\nHTTP/1.0\n\n”을 표준입력으로 받아서 netcat을 이용하여 www.victim.com의 80번포트, 웹서버로 전송하고 웹서버는 표준입력으로 받은 데이터를 표준출력으로 내보낸다.(정상적인 요청) echo –e “GET/login.php?user=`perl –e ‘print “a” x500’ \nHTTP/1.0\n\n | nc –vv www.wictim.com 80 login.php의 user에 faustus를 넣는 대신에 perl구문을 통하여 문자 a 500개를 전송한다 문자 500개를 보내는 과정에서 아무런 오류없이 500개의 문자가 받아들여진다면 버퍼오버플로의 취약성이 있다.
버퍼 오버플로 Perl을 이용한 버퍼 오버플로 테스트 perl을 이용하여 phone필드에 f문자 500개를 보낸다. info테이블에서 phone필드에 ‘f’가 15개 저장되어 있는걸 알 수 있다. 나머지 485개의 문자는 메모리의 어느부분엔가 들어가 있다고 추측을 할 수 있다.
동작을 위한 점 삽입 존재하지 않는 파일을 요구 $./getit.sh www.victim.com /servlet/webacc?user.html=login.htt Webacc 서블릿이 login.htt파일을 파라미터로 취하고 있다. $./getit.sh www.victim.com /servlet/webacc?user.html=gor-gor 존재하지 않는 gor-gor이란 데이터를 요구한다. getit.sh스크립트는 4장에서 보았듯이 netcat을 이용하여 GET형식으로 데이터를 웹서버의 80번포트에 전달하고 그 결과를 표준출력으로 받는다. 존재하지 않는 데이터를 요구하였기 때문에 오류를 표준출력으로 보여준다. ./getit.sh www.victim.com /servlet/webacc?user.html=gor-gor File does not exist: c:\Novell\java\servlets\com\novell\webaccess\templates/gor-gor/login.htt Cannot load file:c:\Novell\java\servlets\com\novell\webaccess\templates/ gor-gor/login.htt 이 오류에서 애플리케이션의 전체경로를 알수 있고 추가로 login.htt파일이 디폴트로 첨부되는 것을 알수 있다.
동작을 위한 점 삽입 ../를 이용하여 boot.ini파일 내용보기 ./getit.sh www.victim.com \ > /servlet/webacc?user.html=../../../../../../../boot.ini%00 [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(5)\WINNT C:\BOOTSECT>BSD=“OpenBSD” . . . . . . . . . . . . . . . . . . . . . . . . . User.html에 %00을 연결 %00은 널문자로 URL의 인코딩된 형태로써 웹서버는 ../../~~~boot.ini%00 전부를 서블릿엔진에 전달하고 %00은 널값이기 때문에 서블릿엔진은 아무값도 없는것으로 간주기 때문에 오류가 나지않고 디폴트로 login.htt를 뒤에 덧붙이게 되고 운영체제함수로 스트링을 전달한다. 하지만 운영체는 %00이후의 것들을 무시하기 때문에 ../../../../../../../boot.ini로 간주하고 이것은 netcat의 표준입력으로 들어가게 되고 boot.ini파일의 내용이 표준출력으로 나타난다.
동작을 위한 점 삽입 %00을 이용하여 /etc/passwd파일 보기 perl로 만들어진 way-board의 취약성 cgi-bin/way-board/way-board.cgi?db=Free db에는 기본적으로 Free라는 디렉토리 이름이 들어가게 되고 그 하위 디렉토리에서 설정파일을 읽어서 cgi에 전달하게 된다. Free 대신 db에 ../../../../../../etc/passwd%00를 대입 “../~~../etc/passwd%00/설정파일”이 전달되지만 %00이후 무시 /etc/passwd 파일 내용 볼수 있다.
동작을 위한 점 삽입 %00을 이용하여 /etc/passwd파일 보기
스크립트 공격 크로스-사이트 스크립팅 신뢰되지 않은 공격자로부터 웹서버가 데이터를 받아 이를 다른 사용자 어플리케이션에 넘겨주게 되는데, 이 데이터로 인해서 사용자의 어플리케이션(웹브라우저)에 피해를 줄수 있다. 악성스크립트 전송 공격자 웹 서버 악성스크립트에 의해 피해 입음 피해자
스크립트 공격 크로스-사이트 스크립팅 크로스-사이트 스크립팅은 사용자가 데이터를 넣을 수 있는 사이트에 잠재적인 위험이 있다. 찾고자 하는 키워드를 입력하는 검색 엔진 E-mail, 채팅 방, 웹 게시판 사용자가 입력하는 폼 필드 HTTP “GET” method
스크립트 공격 www.lycos.co.kr 검색엔진 검색엔진에서 키워드에 자바스크립트를 넣는다. search버튼을 누르게 되면 스크립트가 실행되는 것을 볼수 있다. 스크립트에 대한 필터링이 없는 것을 확인할 수 있고 취약성이 존재한다고 볼수 있다.
스크립트 공격 간단한 예제 게시판에 10000개의 경고메시지를 띄우는 스크립트를 올린다. 게시판 글을 읽는 순간 그 사람의 웹 브라우저에는 10000개의 경고창이 계속 띄어진다.
스크립트 공격 내장 스크립트 css공격은 애플리케이션의 다른 사용자를 대상으로 삼지만 내장스크립트 공격은 애플리케이션 자체를 대상으로 삼는다. 명령을 실행하거나 HTML출력을 엉망으로 만든다. 악성 스크립트를 전송함 으로써 웹서버에 직접 피 해를 준다. 공격자 웹 서버
스크립트 공격 내장 스크립트 hack.php <? Include ‘/etc/passwd’ ?>; passthru(“/sbin/ifconfig –a”); ?> hack.php 을 작성한후 게시판에 파일을 업로드하여 게시판내용에서 hack.php를 클릭한다. hack.php가 실행되면서 /etc/passwd파일의 내용이 출력되고 /sbin/ifconfig –a 명령어가 실행된다.
스크립트 공격 내장 스크립트 hack.php의 /etc/passwd와 /sbin/ifconfig –a 가 실행된 화면을 볼수 있다.
스크립트 공격 대응 방법 사용자 측면 웹 서버 관리자 측면 브라우저에서 스크립트 기능의 해제 링크가 아닌 직접 주소창에서 주소 입력 신뢰되지 않는 싸이트의 폼에 데이터 입력할때 주의 부적절한 확장자를 갖는 파일 업로드 금지 웹 서버 관리자 측면 웹 서버 패치 특수문자 필터링 ( <, >, “, ), (, &, +, - )
명령 실행 뉴라인(Newline)문자 return의 의미로 새로운 행으로 가라는 의미이다. URL상에서 %0a로 인코드 된다. URL/analyze.sh?-h+24&-I 임의의 변수들이 스크립트로 전달될 수 있는지 테스트 URL/analyze.sh?-h%0a/bin/ls%0a %0a를 이용하여 서버에 있는 디렉토리 목록을 반환한다.
명령 실행 Test.php 파일 내용 : <? echo `$id` ?> $id에 저장된 스트링을 `를 이용하여 스트링의 의미를 없애주고 echo명령을 이용하여 출력해준다. 변수 id에 전달된 /bin/ls%0adate는 디렉토리 목록을 반환하고 %0a는 뉴라인 즉, 엔터와 같은 의미를 가지게 되서 date란 명령을 실행하여 날짜를 출력해준다.
명령 실행 Test.php 파이프문자(%7c), 세미콜론(%3b), 스페이스(%20)을 이용한 명령 실행 /bin/ls;/bin/ls|grep main (id로 넘겨져 리눅스에서 실행되는 명령)
Part IV : 일반적인 대응 방법
일반적인 대응 방법 서버-측 입력 확인 문자 인코딩 정규 표현 강력한 데이터 타이핑 적절한 오류처리 인증 요청 사용자 최소-권한 접근
Part V : 참고문헌 웹 해킹 공격과 방어, 피어슨 에듀케이션 코리아 Perl 제대로 배우기, O’REILLY http://www.securitytechnet.com http://www.cert.org/archive/pdf/cross_site_scripting.pdf http://www.spidynamics.com/whitepapers/SPIcross-sitescripting.pdf
Part VI : Q & A