만족

[정보보안] 인터넷 정보보안: HTTP 기본 개념과 웹 해킹 공격 본문

[정보보안] 인터넷 정보보안: HTTP 기본 개념과 웹 해킹 공격

기타 CS 이론/IT Security Satisfaction 2021. 10. 16. 21:45

HTTP Protocol

 

웹 상에서 정보를 주고받기 위한 프로토콜이다.

 

클라이언트가 요청(request)을 보내고, 서버가 응답(response)을 보낸 후 종료되는 프로토콜로

무상태성(Stateless)의 특성을 갖으며, 평문으로 통신한다.

 

통신 보안을 위해 현재는 Secure layer(SSL/TLS)가 추가된 HTTPS도 많이 사용된다.

 

HTTP: Request

GET, POST, PUT, PATCH, DELETE 등 HTTP Method를 가지며,

각 메서드 별 역할이 정의되어 있다.

 

https://developer.mozilla.org/ko/docs/Web/HTTP/Methods

 

HTTP 요청 메서드 - HTTP | MDN

HTTP는 요청 메서드를 정의하여, 주어진 리소스에 수행하길 원하는 행동을 나타냅니다. 간혹 요청 메서드를 "HTTP 동사"라고 부르기도 합니다. 각각의 메서드는 서로 다른 의미를 구현하지만, 일부

developer.mozilla.org

 

HTTP: Response

응답 코드로 2xx, 3xx, 4xx, 5xx 가 정의되어 있으며

각 첫째 자리 수마다 응답의 종류가 결정된다.

 

https://developer.mozilla.org/ko/docs/Web/HTTP/Status

 

HTTP 상태 코드 - HTTP | MDN

HTTP 응답 상태 코드는 특정 HTTP 요청이 성공적으로 완료되었는지 알려줍니다. 응답은 5개의 그룹으로 나누어집니다: 정보를 제공하는 응답, 성공적인 응답, 리다이렉트, 클라이언트 에러, 그리고

developer.mozilla.org

 

SSS(Server Side Script)와 CSS(Client Side Script)

 

컨텐츠의 동적 변경 진행하는 주체에 따라 달라진다.

 

SSS의 경우 JSP, PHP 등 처럼 문서 내용을 서버에서 변경한다.

 

CSS의 경우 JS로 이미 응답으로 받은 HTML문서를 변경한다.

 

웹 해킹

정보 수집-> 취약점 분석-> 공격-> 뒤처리 순으로 이루어진다.

 

스캐닝 툴이 존재하여 웹 서버의 취약점을 손쉽게 알아낼 수 있으며,

서버 파일의 확장자를 이용해 어떤 언어를 사용중인지 알아낼 수도 있다.

 

웹 해킹: Directory Listing

웹 브라우저에서 특정 디렉토리로 접근하면 해당 디렉토리의 모든 파일 리스트가 표시되는 기능이다.

 

인증을 제대로 구현하지 않았을 경우 로그인 우회를 통해 페이지 임의 접속이 가능하며,

공개되면 안 되는 파일이 외부로 빠져나갈 수도 있다.

 

또한 이를 통해 편집기의 임시 저장 파일 등이 표시될 경우 사용자가 임의로 다운로드받아 소스코드를 조회할 수 있게 된다.

 

따라서 디렉터리 리스팅 기능을 비활성화해야 한다.

 

웹 해킹: 임의 파일 접근

만약 파일 다운로드 시 /files?fileName=... 처럼 접근하여 사용한다면 

공격자가 fileName=/etc/passwd 처럼 절대경로와 상대경로 키워드를 사용해 임의 경로에 접근할 수 있게 된다.

 

파일 이름을 입력받을 때엔 .., / 과 같은 특수문자는 비허용해야 한다.

 

웹 해킹: 서버 스크립트 업로드 및 실행

파일 업로드 기능이 있는 url에서 서버 스크립트 파일을 업로드하고, 해당 파일 위치를 유추한다.

 

위치를 알아낸 경우 해당 경로로 접속하면 업로드한 스크립트 파일이 실행된다.

(ex: php에서 프로젝트 루트가 /var/www/html이고, 업로드 파일은 /var/www/html/upload/에 저장될 경우

/upload/your_php_upload_file.php로 접속할 경우 임의 스크립트를 서버에서 실행할 수 있다)

 

이는 업로드 파일 확장자를 제한하고, 업로드 시 파일 이름을 임의 변경하거나

특정 폴더의 실행 기능 해제(ex: /var/www/html/upload 내 파일들은 실행할 수 없다; 읽기/쓰기만 가능),

웹 서버 구동 시 일반 사용자 권한으로 구동 등을 통해 막을 수 있다.

 

웹 해킹: 리버스 텔넷

웹 서버는 방화벽에 의해 보호받기 때문에 특히 외부에서 들어오는 패킷에 대한 검사가 엄격하다.

 

그러나 상대적으로 외부에서 나가는 패킷에 대한 검사는 느슨하다는 점을 이용한다.

 

웹 서버에 파일 업로드로 서버 측에서 텔넷 커맨드를 실행시키고

서버가 공격자에게 실행 권한을 넘긴다.

 

공격자가 특정 포트를 열어두고, 서버에게 리버스 텔넷 툴을 열어 공격자에게 전달하도록 한다.

빨간 줄 아래로는 이제 서버의 텔넷 서비스를 제어할 수 있게 되었다.

 

방어를 위해서는 마찬가지로 파일 업로드 확장자를 제한하고, 내부에서 외부로 나가는 패킷 역시 규칙을 설정해 주어야 한다.

 

웹 해킹: 인증 우회

특정 권한을 위해 필요한 인증을 회피하는 행위이다.

 

주로 테스트 계정이나 관리자 계정의 비밀번호가 유추하기 쉬운 것(test/test, admin/1234)으로 되어 있거나

로그아웃과 세션 파기 등의 기능이 구현되어 있지 않은 경우 발생한다,.

 

디폴트/테스트 계정을 파기하고, 유추하기 쉬운 비밀번호를 변경한다.

 

또한 로그아웃과 세션 파기를 구현하고 쿠키값 역시 확인해야 한다.

 

웹 해킹: 패킷 변조

웹에서 서버로 보내지거나 서버에서 웹으로 오는 패킷을 변조하는 행위이다.

 

특정 값을 서버로 보내 오작동을 일으키는 방식으로 해킹을 시도한다.

 

웹 해킹: XSS(Cross Site Scripting)

url이나 입력 폼에 스크립트 코드를 삽입함으로써,

공격자가 원하는 스크립트 코드를 웹 상에 삽입하여 공격하는 기법이다.

 

가령 게시판 글 작성 기능에 <script>while(true) alert("HELLO"); </script> 를 입력한다면

그 글을 읽는 다른 사람들은 계속해서 경고창을 보게 된다.

 

이를 통해 클라이언트 쿠키/정보를 탈취하거나 서버에 과부하를 일으켜 서버를 다운시킨다.

 

방어를 위해서는 특수한 문자(<, /, > 등)를 이스케이핑(&lt;, &gt; 등)한다.

 

웹 해킹: SQL Injection

공격자가 입력 폼을 통해 원하는 SQL을 동적으로 구성하는 공격 방법.

 

예를 들어 사용자의 아이디와 비밀번호를 받아 로그인 하는 화면에서

SELECT * FROM User WHERE id='$your_id' AND pw='$your_pw'라는 코드가 있을 때,

공격자가 your_id=hello, your_pw= hi' OR 1=1; -- 를 입력하게 되면

SELECT * FROM User WHERE id='hello' AND pw='hi' OR 1=1; --' 로 변하게 되어

무조건 로그인에 성공하게 된다.

 

심지어 구버전 MS-SQL에서는 cmd코드를 SQL 내에서 사용할 수도 있었다.

 

이 경우 공격자가 SQL Injection을 이용해 cmd 커맨드를 마음대로 제어할 수 있게 되므로 피해는 더 커진다.

(SELECT * FROM User WHERE id='hello' AND pw='hi'; exec master ..xp_cmdshell 'CMD COMMAND' --)

(CMD COMMAND에 원하는 커맨드를 입력하면 그 커맨드가 관리자 권한으로 실행된다)

 

입력값에 대해 문자열 이스케이핑(따옴표, 세미콜론, 슬래시 처리 등)을 추가하거나

PreparedStatement를 사용하여 동적 SQL 구성을 막을 수 있다.

 

또한 웹 서버가 사용하는 권한을 적절히 제어하여 피해를 최소화할 수 있어야 한다.

 

https://satisfactoryplace.tistory.com/162?category=893795 

 

[PHP] Magic Quote는 정말 SQL Injection을 완벽 방어할까?

SQL Injection이란? SQL 주입(삽입)이라고도 부르며, 개발자의 의도대로 동작하지 않는 구문을 추가하여 피해를 입히는 공격 방식이다. SQL Injection 예시 const removeAccount= (accountId)=>{ database.execut..

satisfactoryplace.tistory.com

 



Comments