주요 웹 보안 취약점 정리

2 분 소요

OWASP(The Open Web Application Security Project - 국제 웹 보안 표준 기구) 에서 위험도가 높거나 발생 빈도가 높은 취약점 10가지 순위를 발표했습니다.

OWASP TOP 10 (2017)

  • A1 - Injection(인젝션)
  • A2 - Broken Authentication and Session Management (인증 및 세션 관리 취약점)
  • A3 - Sensitive Data Exposure (민감한 데이터 노출)
  • A4 - XML External Entities (XXE) (XML 외부 개체 (XXE))
  • A5 - Broken Access Control (취약한 접근 통제)
  • A6 - Security Misconfiguration (잘못된 보안 구성)
  • A7 - Cross-Site Scripting (XSS) (크로스 사이트 스크립팅 (XSS))
  • A8 - Insecure Deserialization(안전하지 않은 역직렬화)
  • A9 - Using Components with Known Vulnerabilities (알려진 취약점이 있는 구성요소 사용)
  • A10 - Insufficient Logging & Monitoring(불충분한 로깅 및 모니터링)

A1. Injection

SQL, OS, XXE(Xml eXternal Entity), LDAP 인젝션 취약점은 신뢰할 수 없는 데이터가 명령어나 쿼리문의 일부분으로써, 인터프리터로 보내질 때 발생한다. 공격자의 악의적인 데이터는 예상하지 못하는 명령을 실행하거나 적절한 권한 없이 데이터에 접근하도록 인터프리터를 속일 수 있다.

SELECT * FROM admin where email = {email} and password = {password}

이러한 코드가 있을때 사용자는 아래처럼 파라미터를 보내 데이터에 바로 접글할수 있음 'test' or 1=1

SELECT * FROM admin where email = 'test' and password = 'test' or 1=1


해결방법

  • 동적 쿼리 대신 parameter bind 사용..
  • 서버단에서 SQL 특수문자 검증..
  • LIMIT 같은걸 이용해서 제한두기..

A5. Broken Access Control

취약한 접근 제어는 인증된 사용자가 수행할 수 있는 것에 대한 제한이 제대로 적용되지 않는 것을 의미한다. 공격자는 이러한 취약점을 악용하여 사용자의 계정 액세스, 중요한 파일 보기, 사용자의 데이터 수정, 액세스 권한 변경 등과 같은 권한 없는 기능, 또는 데이터에 액세스할 수 있다.

http://example.com/admin/?role=user
http://example.com/bbs/view/12345

이런식으로 파라미터를 조작하고 URL을 탐색할수 있을때

http://example.com/admin/?role=admin
http://example.com/bbs/modify/12345

이렇게 권한에 접근 할 수 있는지 확인해 볼 수 있다.

해결방법

  • 인증 프로세스를 잘 구축하자..

A7. XSS

XSS 취약점은 애플리케이션이 신뢰할 수 없는 데이터를 가져와 적절한 검증이나 제한 없이 웹 브라우저로 보낼 때 발생한다. XSS는 공격자가 피해자의 브라우저에 스크립트를 실행하여 사용자 세션 탈취, 웹 사이트 변조, 악의적인 사이트로 이동할 수 있다.


게시판 등록같은 기능이 있을때 위의 값을 그대로 DB에 저장시킨후, HTML에 저장된 값을 그대로 뿌리면 스크립트가 실행 됩니다. 이런식으로 스크립트를 실행시킬수 있으면 여러 공격에 당할 수 있습니다.

해결방법

  • XSS방어 라이브러리 사용..
  • 보통 서버언어에 XSS방어해주는 함수가 있음..
  • react 같은 프레임워크는 방어기능 있음..
  • 엔티티로 인코딩해서 저장되도록.. <

Cross-Site Request Forgery (CSRF)

사용자가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 하는 공격을 말한다.

<form action="/password/modify">
    <input type="password" name="password">
    <input type="password" name="passwordCheck">    
</form>

이러한 비밀번호 변경 사이트가 있다고 했을때..

http://example.com/password/modify?password=1234&passwordCheck=1234

이렇게 요청하면 비밀번호가 변경된다는걸 유추 할 수 있다.

<a href="http://example.com/password/modify?password=1234&passwordCheck=1234">클릭해봐</a>

게시판같은곳에 저런 a 태그를 등록하고 다른 사용자가 누른다면 자기의 의도와 상관없이 비밀번호가 변경될수 있다.

해결방법

Security Token

  1. 사용자의 세션에 임의의 난수값을 저장하고 사용자의 요청에도 난수값을 넘겨줌
  2. 서버에서 request 받을때 해당 난수값이 일치해야만 적상작동 하도록 셋팅

아래는 Laravel CSRF 예시



댓글남기기