2018년 3월 19일 월요일

[보안] 2017년 OWASP TOP!0

OWASP (The Open Web Application Security Project) 
웹 애플리케이션 취햡점 중에서 빈도가 많이 발생하고, 보안상 영향을 크게 줄 수 있는 부분 중 Top 10을 선정하여 발표한다.

4년 마다 한번 씩 (2004년 시작으로) 발표하였으며 그 중 2017년에 발표된 부분에 대한 요약을 아래 정리하여 보았다.

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

2. Broken Authentication and Session Management (인증 및 세션 관리 취약점)
인증과 세션 관리와 관련된 애플리케이션 기능을 정확하게 구현되지 있지 않아서, 공격자가 패스워드, 키 또는 세션 토큰을 해킹하거나 다른 구현 취약점을 공격하여 다른 사용자 계정을 일시적 또는 영구적으로 탈취하는 것을 허용한다.

3. Sensitive Data Exposure (민감 데이터 노출)
많은 웹 애플리케이션들이 신용카드, 개인 식별 정보 및 인증 정보와 같은 중요한 데이터를 제대로 보호하지 않는다. 공격자는 신용카드 사기, 신분 도용 또는 다른 범죄를 수행하는 등 약하게 보호된 데이터를 훔치거나 변경할 수 있다. 중요 데이터가 저장 또는 전송 중이거나 브라우저와 교환하는 경우 특별히 주의하여야 하며, 암호화 같은 보호조치를 취해야 한다.

4. XME External Entities (XXE)
오래되고 설정이 많은 XML 프로세서들은 XML 문서 내에서 외부 개체 참조를 평가한다.
외부 개체는 파일 URI처리기, 내부 파일 공유, 내부 포토 스캔, 원격 코드 실행과 서비스 거부 공격을 사용하여 내부 파일을 공겨하는데 사용할 수 있다.

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

6. Security Misconfiguration
좋은 보안은 애플리케이션, 프레임워크, 애플리케이션 서버, 웹 서버, 데이터베잇 서버 및 플랫폼에 대해 보안 설정이 정의되고 적용되어 있다. 기본으로 제공되는 값은 종종 안전하지 않기 때문에 보안 설정은 정의, 구현 및 유지되어야 한다. 또한 소프트웨어는 최신의 상태로 유지해야 한다.

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

8. Insecure Deserialization(안전하지 않은 역직렬화)
 안전하지 않은 역질렬화는 종종 원격 코드 실행으로 이어진다. 역질렬화 취약점이 원격 코드 실행 결과를 가져오지 않더라도 이는 권한 상승 공격, 주입 공격과 재생 공격을 포함한 다양한 공격 수행에 사용될 수 있다.

9. Using Components with Known Vulnerabilities (알려진 취약점이 있는 컴포넌트 사용)
컴포넌트, 라이브러리, 프레임워크 및 다른 소프트웨어 모듈은 대부분 항상 전체권한으로 실행된다. 이러한 취약한 컴포넌트를 악용하여 공격하는 경우 심각한 데이터 손실이 발생하거나 서버가 장악된다. 알려진 취약점이 있는 컴포넌트를 사용하는 애플리케이션은 애플리키에션 방어 체제를 손상하거나, 공격 가능한 범위를 활성화하는 등의 영향을 미친다.

10. Insufficient Logging & Monitoring (불충분한 로깅 및 모니터링)
불충분한 로깅과 모니터링은 사고 대응의 비효율적인 통합 또는 누락과 함께 공격자들이 시스템을 더 공격하고, 지속성을 유지하며, 더 많은 시스템을 중심으로 공격할 수 있도록 만들고, 데이터를 변조, 추출 또는 파괴할 수 있다. 대부분의 침해 사례에서 침해를 탐지하는 시간이 200일 넘게 걸리는 것을 보여주고 이는 일반적으로 내부 프로세스와 모니터링보다 외부 기관이 탐지한다.

참고자료 : https://ko.wikipedia.org/wiki/OWASP




2017년 11월 22일 수요일

[알고리즘] Tree 5 - B tree

- 한 노드가  N개의 데이터와  N+1개의 자식 노드를 가질 수 있다.
- 노드 내의 데이터는 반드시 정렬된 상태여야 한다.
- Root노드는 적어도 2개 이상의 자식을 가져야 한다.
- Root노드를 제외한 모든 노드는 적어도 N/2의 올림 수 만큼의 자식을 가지고 있어야 한다.
- Leaf 노드는 모두 같은 레벨에 존재한다.
- 입력 자료는 중복되지 않는다.

자료의 입력

























자료의 삭제








2017년 11월 20일 월요일

[알고리즘] Tree 4 - AVL tree

- 이진 트리이다.
- 각각의 노드마다 왼쪽과 오른쪽 sub-tree의 높이 차이에 대한 정보를 가지며 부분 트리의 높이 차이가 1보다 크지 않은 성질을 가진다.
- O(lon n) 의 시간 복잡도로 검색, 삽입, 삭제를 할 수 있다.
- 삽입, 삭제 시 원하는 노드를 찾기 위해 2개의 경로가 필요하기 때문에 레드-블랙 트리 만큼 효율이 좋지 않아 자주 쓰이지 않는다.
- 노드가 삽입, 삭제 될 때 회전(rotation)을 통해 트리를 재구성 한다.

[회전]

균형이 맞지 않은 경우 (양쪽 서브트리의 높이 차이가 2이상 나는 경우)
아래와 같이 네가지 회전 방법을 통해 균형을 맞춰 준다.

LL

조건
왼쪽 서브트리의 높이가 오른쪽 서브트리 높이보다 2이상 크고
왼쪽 서브트리의 왼쪽 서브트리가 오른쪽 서브트리의 높이보다 큰 경우 
- left - left 로 길어짐으로 LL이라 명명한다.
- 오른쪽으로 돌려준다.

- 균형이 틀어진 노드를 NodeA라 하고 왼쪽 서브트리 쪽 첫번째 노드를 NodeB라 할 경우
  NodeA.left = NodeB.right
  NodeB.right = NodeA















RR

조건
오른쪽 서브트리의 높이가 왼쪽 서브트리 높이보다 2이상 크고
오른쪽 서브트리의 오른쪽 서브트리가 왼쪽 서브트리의 높이보다 큰 경우 
- right - right 로 길어짐으로 RR이라 명명한다.
- 왼쪽으로 돌려준다.

- 균형이 틀어진 노드를 NodeA라 하고 왼쪽 서브트리 쪽 첫번째 노드를 NodeB라 할 경우
  NodeA.right = NodeB.left
  NodeB.left = NodeA















LR

조건
왼쪽 서브트리의 높이가 오른쪽 서브트리 높이보다 2이상 크고
왼쪽 서브트리의 오른쪽 서브트리가 왼쪽 서브트리의 높이보다 큰 경우 
- left - right 로 길어짐으로 LR이라 명명한다.
- 서브트리를 왼쪽으로 돌려주고 다시 전체를 오른쪽으로 돌린다.

- 균형이 틀어진 노드를 NodeA라 하고 왼쪽 서브트리 쪽 첫번째 노드를 NodeB라 할 경우
  RR(NodeB)
  NodeB.right = NodeA













RL

조건
오른쪽 서브트리의 높이가 왼쪽 서브트리 높이보다 2이상 크고
오른쪽 서브트리의 왼쪽 서브트리가 오른쪽 서브트리의 높이보다 큰 경우 
- right - left 로 길어짐으로 RL 이라 명명한다.
- 서브트리를 오른쪽으로 돌려주고 다시 전체를 왼쪽으로 돌린다.

- 균형이 틀어진 노드를 NodeA라 하고 왼쪽 서브트리 쪽 첫번째 노드를 NodeB라 할 경우
  LL(NodeB)
  NodeB.left = NodeA











[삽입]

- BST와 같은 방식으로 삽입 후 균형이 맞지 않으면 회전으로 맞추어 준다.

[삭제]

- 삭제되는 노드가 leaf 노드인 경우 삭제만 하면 된다.
- 삭제되는 노드가 leaf 노드가 아닌 경우
  왼쪽 서브트리의 가장 큰 값 혹은 오른쪽 서브트리의 가장 작은 값으로 대체한다.
  leaf 노드가 될 때까지 반복하다 leaf 노드가 되면 삭제한다.
- 삭제 후에 균형이 맞지 않으면 회전으로 맞추어 준다.



[소스]







2017년 11월 16일 목요일

[알고리즘] Tree 3 - Binary Serch Tree

- 각 노드에 값이 있으며 키값은 모두 달라야 한다. 값들은 순서가 있다.
- 노드의 왼쪽 서브트리에는 그 노드의 값보다 작은 값들을 가진 노드로 구성된다.
- 노드의 오른쪽 서브트리에는 그 노드의 값보다 큰 값들을 가진 노드로 구성된다.
- 좌우 하위 트리는 각각이 다시 이진 탐색 트리여야 한다.
- 중복된 노드가 없어야 한다.

노드 추가


노드 검색











노드 삭제
1. 자식 노드가 없으면 그냥 삭제한다.
2. 자식 노드가 하나면 자식 노드를 해당 노드 자리에 대체하고 삭제한다.
3. 자식 노드가 두개면 왼쪽 서브 트리의 가장 오른쪽 값이나, 오른쪽 서브 트리의 가장 왼쪽 값으로 대체하고 삭제한다.
노드 삭제 3번째 경우










최악의 경우















구현

2017년 11월 15일 수요일

[알고리즘] Tree 2 - 트리의 종류

1. 이진트리
 - 부모 노드 밑에 자식 노드가 최대 2개 올 수 있다.














2. B트리
 - 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 크다.
 - 데이터베이스와 파일시스템에 널리 사용된다.




2017년 11월 14일 화요일

[알고리즘] Tree 1 - 그래프

그래프

그래프는 꼭지점과 그 꼭지점을 잇는 변으로 이루어진다.
(이 때 꼭지점의 위치와 변의 길이는 상관하지 않는다.)











트리

 - 그래프의 일종
 - 여러 노드가 한 노드를 가리킬 수 없다.
 - 회로(Cycle)가 없다.
 - 서로 다른 두 노드를 잇는 길이 하나뿐이다.








2017년 11월 12일 일요일

[이클립스] 디버깅

브레이크 포인트 걸기

  • 해당 소스 줄의 앞을 더블 클릭
  • 해당 줄에 커서를 놓은 뒤 Ctrl + Shift + B
  • 해당 줄에 커서를 놓은 뒤 메뉴에서 Run > Toggle Break 선택





디버깅 진행
F5 : 진행 시 메서드 호출이 있는 경우 메서드 안으로 들어간다. (Step Into)
F6: 메서드 호출이 안으로 들어가지 않고 다음 라인으로 이동한다. (Step Over)
F7: 현재 메서드에서 더이상 차례로 진행하지 않고 리턴한다. (Step Return)
F8: 다음 브레이크 포인트로 이동한다. (Resume)