SK shieldus Rookies 16기 (애플리케이션 보안#01)

만두다섯개·2023년 11월 2일
0

SK 루키즈 16기

목록 보기
8/52

주요 정보

  • 교육 과정명 : 클라우드기반 스마트융합보안 과정 16기
  • 교육 회차 정보 : '23. 11. 2. 웹 어플리케이션 보안 과정 #01

참고 정보

시큐어 코딩을 위한 파이썬 기초지식

  • 명령문을 실행하는 내장함수 : eval, exec, compile 함수
  • eval, exec 은 코드 인젝션에 악용 가능

exec 함수

  • 파이썬 동적실행에서 사용
  • 문자열, 코드객체 인자로 사용(문자열은 분석 후 실행, 코드객체는 바로실행)
  • None 반환
  • 문법 : exec(object, globals, locals)

eval 함수

  • 표현식을 실행하고 결과값을 반환
  • 매개변수 또는 표현식을 받아 실행하는 함수. 예시 eval(1+2) 결과값 3 출력)
  • 코드 삽입 또는 실행 파라미터 입력으로 의도된 동작 실행가능
  • 자바(언어)에서는 [정규식 사용]으로 eval 함수에 안전한 값만 전달한다.
  • 취약점 발생 가능
    (사용자 요청을 get으로 받아 exec() 하는 코드)
    1. 사용자가 전달한 함수명을 검증하지 않고 실행
    2. exec(‘{}()’.format(function_name)) 코드의 function_name에 import(‘platform.’).system 입력시 시스템 정보 출력 가능

render 함수

  • loader()와 HttpResponse()를 합친 개념

바인딩이란?(소켓 바인딩)

  • 프로그램 구성 요소의 실제 값,프로퍼티(소유물)를 짝지우는 것.(함수 호출 시 실제 함수가 있는 메모리 연결, 등)
  • 특정 프로토콜은 특정 포트만 사용, 다른 포트 사용시 자원 충돌 등 발생.
    -ORM 사용시 SQL Injection 방지목적으로 외부 입력값을 바인딩 변수로 사용한다. 이때 바인딩 변수의 정의란(입력 시의 특징 : 바인딩 변수: 쿼리 구조 변경 방지, %s 로 인자를 바인딩하면 구조 변경 불가)

escape, autoescape 함수 (at Django utils)

  • autoescape on = HTML escape 시킨다.
  • 지정받은 문자열(특수문자제외) 인코딩(16진수 문자)로 모두 변환
  • 프리젠테이션화 되어있는 태그란? F12 로 확인 가능 태그
  • Django 에서 웹페이지에 HTML 출력시, 태그까지 출력.(디폴트 autoescape – ON, escape 해주기 때문이다.) 해당 값을 OFF 로 바꾸면 HTML 태그없이 그대로 출력된다. (XSS관련)
  • D가 묵음이라는 것만 동일한 또 다른 장고. (image from moive - django unchained)

redirect 함수

  • 브라우저가 A주소 URL 웹 서버 요청시, 웹 서버에서 B주소 URL로 다시 요청해라
  • URL(방향) 재 지시하는 것

보완할 점

  • 복습) 알라딘 크롤링 사이트 추가기능 (DB 연결, 썸네일 저장) -> DB lock 오류 미해결
  • SW 개발보안 방법론에서의 입력데이터 검증 및 표현 취약점과 그 대응방법 (마지막 6개항목)

무엇을 깨달았나

  • SW 개발보안 방법론에서의 입력데이터 검증 및 표현 취약점과 그 대응방법

웹 앱 보안 중요성과 공격 예시

● 웹 보안 중요성
-참고 자료(소프트웨어 보안약점 진단가이드(2021_KISA), 파이썬 시큐어코딩 가이드(2022)

가. SW 보안약점 진단원 보수교육자료 中

  • SW는 웹, 앱 요소.

  • 글로벌 사이버 위협의 전망
    1. 부주의한 SW 구성 실수
    2. 클라우드 보안 위협 증가
    2. IoT 장치 공격 급증(샤오미)

  • 미흡한 보안 패치로 인한 사이버 공격 노출(서비스 가용성(셧다운) 저하 이유로 패치가 느려짐에 따라 공격받기도 한다.)

  • 클라우드 방향으로 변화로 해당 분야에 대한 위협 증가

나. 라온화이트햇 자료 中 2023 보안 위협 트랜드 5

  • 데이터 침해발생 원인 중, 임직원 단순실수 예(메일, 파일 작성시 암호화)
  • 스프링 프레임워크(표준 프레임워크 기반 기술) 취약점 존재
  • 아파트 월 패드 해킹(패스워드, 해킹 난이도 하)
    1. 스마트 컨트랙트 취약점 공격 기승(블록체인 기술로 온라인 계약하는 것)
    2. SW 보안 취약점 발견 건수 늘어남
    ...

구현단계 보안약점 제거 기준 유형

소프트웨어 개발보안 방법론이란? 안전한 SW 생산목적으로 필요한 보안 활동을 적용하는 개발방법.
구현단계 보안약점 제거 기준의 유형들을 3차례 나누어 학습(애플리케이션 보안 과목 1일 ~ 3일차)

#1 입력데이터 검증 및 표현

  • 프로그램 입력 데이터에 대한 검증 부족 등으로 공격 발생
  • 예시) :SQL Injection(삽입), XSS, 공격 유발..등

SQL Injection

  • SQL 문법을 악용해 입력 폼, URL 입력란에 SQL 문을 삽입해 DB 정보 열람 및 수정
  • 입력 폼(컴퓨터에 입력하는 데이터 형태

DB API에서 :

  • 취약점 발생 가능
    1. 외부로부터 입력받은 값을 검증없이 사용
    2. 입력받은 값으로 동적 쿼리문 생성
    3. 동적 쿼리문 사용
  • 취약점 보완 방법
    1. 외부로부터 입력받은 값을 검증
    2. 입력받은 값으로 인자화된 쿼리 생성 (인자화 : 외부 입력 질의문 구조 변경 불가)
    3. 입력값 인자화된 쿼리에 바인딩 후 실행

ORM에서:

  • 취약점 발생 가능
    1. 외부로부터 입력받은 값을 검증없이 쿼리문 생성
    2. 쿼리문 사용

  • 취약점 보완 방법
    1. 외부로부터 입력받은 값을 검증(1개만 가져온다던가)
    2. 외부로부터 입력받은 값을 바인딩 변수로 사용(바인딩 변수: 쿼리 구조 변경 방지)
    2. 인자화된 쿼리문 사용

  • 덜 안전한 코드
    id = ‘1 or id=2’ // 공격자는 id를 다음과 같이 사용
    “SELECT from tableName where id=” + id # 원래 의도 : id에 id입력.
    “SELECT
    from tableName where id=” + ‘1 or id=2’

  • 공격자의 악용으로 “SELECT * from tableName where id= 1 or id=2’ SQL문으로 변경된다. (다른 사용자가 접근 가능)

  • 더 안전한 코드
    “SELECT * from tableName where id={}”.format(id) #입력값이

코드 삽입

  • 공격방식 : 임의의 코드삽입으로 의도된 동작을 수행 유도
  • 공격 목적 : 권한 탈취, 인증 우회, 시스템 명령어 실행
  • 프로그래밍 언어 자체 기능으로 발생해 OS 명령어 삽입 방식과 차이 발생
  • 취약점 보완 방법
    1. 동적코드 실행가능한 함수 지양
    2. 화이트리스트 기반 검증(위의 환경이라면 사용 가능한 함수만 등록)
    3. 입력값 필터링
  • 입력값 검증용 메소드
    1. str.isalpha()
    2. str.isdecimal()
    3. str.isdigit()

-장고에서 실습해보자.
뷰 작성 및 URL 매핑 (장고 PPT 참고..)
run_route.py 라는 파일에서 URL을 지정한다

route 라는 함수로 원래 의도(URL 매핑)
실제 동작 : URL을 받아 route 함수에서 매핑 동작
표현-코드삽입 : URL 에 의도적으로 특정 장소로 넘어가는 수정된 URL을 입력한다. 그리고 route 함수 매핑 결과를 웹 페이지 상에서 획득한다.

경로 조작 및 자원 삽입 방법

  • 외부 입력값으로 파일 및 서버의 시스템 자원에 대한 접근, 식별 허용시 입력값 조작으로 시스템 보호 자원 접근 가능
  • 공격 목적 : 자원 수정, 삭제, 시스템 자원 충돌로 인한 서비스 장애 유발
  • 공격자가 권한 획득으로 설정파일 변경, 실행 가능
  • 경로순회 공격 위험 문자 ( /, \, 등) 사용 금지
  • 취약점 발생 가능
    1. subprocess.popen() : 프로세스 개방함수
    2. os.pipe() 파이프 개방함수
    3. 검증없는 socket 연결
    4. 입력값으로 open 실행하는 코드에서 [../../../etc/passwd]를 전달
    5. 입력값을 검증없이 소켓 포트 번호로 사용(소켓 바인딩으로 인한 시스템 자원충돌 가능)
  • 취약점 보완 방법
    1. [ ‘ , / \ ] 등 경로순회 공격위험 문자 입력값 필터링
    2. 식별자 화이트 리스트 사용
    3. 소켓 포트 번호 화이트 리스트 사용

XSS (Cross-site scripting) Attacks

  • 공격 방법 : 웹 사이트에 악성 코드를 삽입. 사용자가 공격스크립트 포함된 게시물을 요청 및 응답받아 사용자가 해당 스크립트 실행하면, 사용자가 감염된다.
  • 웹 사이트에서 저장되거나 입력받은 데이터(사용자 입력 폼, 브라우저 전송 데이터)가 사용자에게 검증 없이 표시되는 경우에도 발생한다.
  • 공격 이용 매체 : 웹 코드, 악성코드, 플러그인, 미디어 콘텐츠 등을 이용할 수 있다.
  • 특징 : 공격자는 앱 호스트보다 사용자를 목표 지정
  • XSS 공격 유형 : Reflective XSS, Stored XSS, DOM XSS

실습

  • URL(naver.com) 과 String(naver)를 url 변수로 입력 시, (naver) 클릭시 연결된 url으로 이동하는 환경

  • 공격자가 악의적인 목적으로 javascript(url 대신) 입력 및 naver 입력하면 똑같은 (naver) 생성되지만 해당 버튼 누르면 url로 이동이 아닌 자바스크립트(경고메시지) 실행된다.

  • Django 사용으로 HTML 파일을 웹 페이지에 출력 시, HTML 태그가 노출된다.

	<br><br>장고탈출!복수하러간다!<br><br> # autoescape on, 즉 escape 된 HTML이다.
	autoescape off 지정시 태그가 사라진다.
	장고탈출!복수하러간다!
  • Django 의 HTML이 자동(auto) escaping 처리로 XSS 공격 방지

Reflective XSS

  • Non-persistent XSS 라고도 한다.
  • Stored XSS

  • Persistent XSS라고도 한다. 사용자가 악성코드가 담긴 컨텐츠를 조회 및 전달받는다. 사용자의 브라우저는 컨텐츠 내부 악성 코드를 정상적인 응답이라고 간주하고 (이건 정상적 서버의 요청이야~) 코드를 실행해 사용자 민감정보를 공격자 서버로 전달한다

DOM XSS

  • 웹 페이지에는 사용자 입력 처리 목적의 javaScript 검증 로직 존재한다. 해당 로직 무효화시키는 공격 방식이 DOM XSS이다.

  • 취약점 발생 가능
    at Django
    1. mark_safe 함수는 HTML escape 정책 따르지 않는다. 즉, 해당 값을 그대로 다음 변수로 넘겨주게 되는 것이다.
    2. escape off
    3. safe 필터 사용
    at Flask
    1. escape 함수로 HTML 엔티티코드로 치환해 표현

  • 취약점 보완 방법
    1. HTML 인코딩된 HTML 사용(치환함수 사용 등..)

    2. HTML 라이브러리 escape() 문자열 변환
    3. 사용 가능 HTML 라이브러리 화이트리스트 사용
    4. Django, Flask 프레임 자체 autoescape 디폴트 ON 으로 XSS 방지

입력 데이터 검증 및 표현 – 운영체제 명령어 삽입.

  • 공격 방식 : 불순한의도 시스템 명령어가 실행된다.
  • 공격 목적 : 권한 탈취, 변경, 시스템 동작 및 운영 악영향
  • 프로그램의 명령어 라인 파라미터, 스트림 입력등 외부 입력 사용해 시스템 명령어를 생성하는 프로그램 위주 탐색
  • 취약점 발생 가능
    1. exec, eval 함수 사용으로 명령어 삽입 공격 가능
    2. subprocess 함수 사용으로 별도 프로세스 응용 프로그램 실행 가능
  • 취약점 보완 방법
    1. 멀티라인(|, ;, &, :, `, \, !) 및 리다이렉트( >, >> ) 문자 필터링
    2. 사용 가능한 파일, 옵션 제한하는 명령어 사용
    3. 화이트리스트( 사용가능한 파라미터 지정)
    4. subprocess 함수 사용시, 1번의 문자 필터링 사용

위험한 형식 파일 업로드

  • 서버에서 실행 가능한 스크립트 파일(asp, jsp, php, sh 파일 등)이 업로드 가능 및 해당 파일을 공격자가 직접 실행 가능시 아래와 같은 공격 방식 사용.
  • 공격 방식 : 시스템 내부 명령어 실행, 외부와 시스템 연결해 내부 시스템 장악
  • 웹 셀 공격에 취약하다.
  • 취약점 보완 방법
    1. 화이트리스트(파일 유형 제한)
    2. 파일 확장자 검증
    3. 파일 개수 및 크기 제한(공격자가 URL 로 파일 실행 불가하도록)
    4. 업로드 된 파일의 이름은 무작위한 이름(공격자 추축 난해하도록)
    5. 최소 권한 부여 파일 저장, 실행 권한 삭제

신뢰되지 않는 URL 자동접속 연결

  • 공격 내용 : 공격자는 정상 웹 서버와 비슷한 타 사이트로 사용자를 우회접속 시킨다.
  • 공격 방식 : 사용자는 정상 웹 서버로 클라이언트를 통해 접속하지만, 공격자는 해당 폼 요청을 변조해 사용자가 피싱 사이트로 접속하게 유도한다.(리다이렉트)
  • 취약점 발생 가능
    1. 사용자 입력 URL 검증 없이 redirect 함수 인자로 사용
  • 취약점 보완 방법
    1. 리다이렉션 허용 URL 화이트리스트로 관리
    2. 사용자 입력 URL 리다이렉션 검증
    3. 화이트리스트 사용 불가, 사용자 입력만이 리다이렉션 URL 인자 값으로 사용될때에는 상대 URL 검증( 리다이렉션시 프로토콜, host 정보 없음)
    4. 절대 URL(프로토콜, 호스트, 경로 모두 가진 URL)사용시 서비스 URL로 시작하는지 확인

부적절한 XML 삽입

-XML이란? eXtensible Markup Language : 확장 가능 마크언 언어

  • 공격 조건 : 서버에서 XML 외부 엔티티 처리 가능 설정시 발생 가능
  • 공격 방식 : 웹 서버에 XML 요청시, 웹 서버가 DTD에 정의된 파일 시스템에 접근하고, 내부 파일시스템으로부터 데이터를 확인 가능
  • 취약점 발생 가능
    1. 취약한 XML Parser : 공격자의 외부값 참조 XML 처리로 공격 구문 동작으로 서버 파일 접근, 불필요 자원, 인증 우회, 정보 노출 가능
    2. 기본 제공 XML Parser 외부 엔티티 지원하지 않는다, 단, 다른 XML 공격에 취약
  • 취약점 보완 방법
    1. 고급 XML 기능 사용 : XML 유효성 검사
    2. 로컬 정적 DTD 사용, 외부로부터 받은 XML 문서의 DTD 비활성화
    3. 비활성화 불가 시, 외부 엔티티 문서 유형 선언을 각 파서에 맞는 방식으로 비활성화
    4. 외부 라이브러리를 통한 외부 엔티티 구문 분석 기능 사용
    5. lxml 파서(XML 파서 종류)의 resolve_entities 옵션 비활성화
  • SQL 인젝션과 메소드만 다름... sql 인젝션에서 뭘 쓰는지를 모르겠어서..
  • blingdata 함수로 메소드 처리?

LDAP 삽입

-공격 방식 : 외부 입력값을 LDAP 쿼리문, LDAP 쿼리문 결과로 사용시, 해당 LDAP

  • 주로 직원들만 사용함으로 서버가 IDC 등 깊은 곳(?) 에 있다.
    사회공학적 방법을 쓴다. : 내가 팀장인데 메일~, 급여통장 메일~ (직원 PC로 잠입 후 LDAP 삽입. ) 즉, 외부에서 바로 LDAP 삽입 공격을 하는게 아니라 (서버로) 사내 인트라넷 등을 거쳐 공격해야 한다는 것.
    LDAP(Lightweight Directory Access Protocol) : 리눅스에서 나온 디렉터리 접근 프로토콜..
    LDAP 는 DB 이기도 하다.
    예시) 중앙화 시스템 로그인 -> LDAP 에 의해 내 권한에 맞춰 접근 권한에 의해 행동범위 정해진다.
    -LDAP 대응 방법 : escape 함수란? 지정받은 문자열(특수문자제외) 16진수 문자로 모두 변환한다.

CSRF 크로스사이트 요청 위조

  • XSS 와 다른 점은 웹 서버 바로 공격이 아니라 사용자를 매개체로 이용해 악의적행위(수정, 삭제 등..)을 수행(요청)하게 한다.
  • 보통 폼에서 올린다. 폼태그에 딩고에서 CSRF 토큰 기능을 지원한다. 해당 토큰이 없다면 CSRF 공격 가능.
  • CSRF 토큰 사용 이유?
    CSRF 공격과 CSRF Token에 대하여 · 도전하는 개발자 (minkukjo.github.io)

HTTP 응답분할

  • 입력값에 개행문자와 요청문을 넣어 2개의 응답을 받는다. (첫번째 응답을 종료, 두 번째 응답을 공격용으로 사용한다 ) 서버는 응답헤더에 값을 넣어 보내 공격자는 이를 악용하는데 쓴다
  • 방어방법 : get으로 가져온 값을 필터링

정수형 오버플로우

  • 공격자가 입력값에 오버플로우 발생시키는 값을 사용해 정수형 오버플로우를 발생시킨다.
  • 파이썬 3.x부터 long 타입을 없애고 정수 타입의 자료형에 ~방식을 이용해 오버플로우 방지한다.
  • ~방식이란?
  • 패키지별 , 데이터 타입별 입력받는 수 크기 확인
  • numpy란 데이터구조, 수치계산을 위한 파이썬 라이브러리

보안기능 결정 사용되는 부적절한 입력값

  • 쿠키, 환경변수 히든 필드와 같은 입력값이 조작될 수 없다고하지만 조작 및 변경 가능하고 탐지 안될 수도 있음.
  • 쿠키를 탈취해 관리자 권한인척 주요정보 가져온다
  • 방지방법 : 쿠키보다는 세션을 사용해라.

포맷스트링 삽입 방법

  • 내부 정보를 포맷 문자열(포맷팅 방식)을 사용해 문자열로 만든 후 공격코드 실행하는 방식으로 공격한다.
  • 외부 입력값 검증 부재 및 입*출력 함수 포맷 문자열을 그대로 사용시 발생하는 보안약점이다
  • 취약 프로세스 공격, 메모리 읽기로 취약한 프로세스 권한 취득을 통한 임의 코드 실행
  • 안전한 방식 : 포맷 문자열 사용시, 사용자 입력값을 직접 포맷 문자열로 사용하거나, 포맷 문자열 생성에 포함시키지 않아야 한다.
  • 사용자로부터 입력받은 데이터를 서식 지정자를 포함하지 않거나 파이썬의 내장함수 혹은 내장변수가 포함되지 않도록 해야 한다.
profile
磨斧爲針

0개의 댓글