User Tools

Site Tools


Sidebar

  • Learn about Wiki
  • Lectures
  • Study
  • Tips
    • tips:clojure:security

      웹사이트 보안

      클로저로 만들어진 웹사이트에서 일반적인 취약점의 종류와 제거할 수 있는 function이나 syntax를 설명합니다.

      XSS(Cross Site Script)

      * Client 의 web browser 에서 의도하지 않은 스크립트 실행으로 사용자 정보 침해나 타 사이트로의 정보 전송이 가능

      * CSRF(Cross Site Request Forgery)에 의해 Server 공격 또는, 관리자 권한을 이용한 데이터 침해로 이어질 수 있음.

      일반 출력

      (def value "<script>(alert('XSS')</script>")
      (str value)
      ;"<script>(alert('XSS')</script>"

      취약한 문자열 제거

      (use '[clojure.string])
      (defn xssFilter [s]
            (replace s "<" "")
       )
       (xssFilter value)
       ;"script>(alert('XSS')/script>"

      xssFilter 함수의 예

      (defn xssFilter [s]
            (replace s "script" "")
       )
      (xssFilter value)
      ;"<>(alert('XSS')</>"
      (defn xssFilter [s]
            (replace s ">" "")
       )
      (xssFilter value)
      ;"<script(alert('XSS')<script/"
      (defn xssFilter [s]
         (replace (replace (replace value "<" "") ">" "") "script" "")
       )
      (xssFilter value)
      ;"(alert('XSS')/"

      SQL Injection

      * DBMS 에 질의할 때, 정상적인 질의어 외의 인자나 파라미터를 삽입함으로써, 의도하지 않은 동작 및 정보를 노출시킴

      (jdbc/with-query-results res ["SELECT * FROM authors WHERE id = ?" val]
      (doall res)))

      val 이 외부 유입 변수라 할 때, 함수를 이용해 필터링을 하는 방식이 권장된다.

      (defn sqlFilter [s]
            (replace s "union" "")
      )
      (defn sqlFilter [s]
            (replace s ";" "")
      )
      (defn sqlFilter [s]
            (replace s "--" "")
      )
      (defn sqlFilter [s]
            (replace s "select" "")
      )

      이 밖에도 OWASP 에서 제공하는 cheat sheet 를 활용해 함수를 작성할 수 있으며, Clojure Programing 에서 다룬 대로 Hibernate를 활용해 DB 연동이 이루어졌다면,

      https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

      HQL 관련 예제를 사용할 수 있다.

      Hibernate Query Language (HQL) Prepared Statement (Named Parameters) Examples

      Query unsafeHQLQuery = session.createQuery("from Inventory where productID='"+userSuppliedParameter+"'");
       
       Here is a safe version of the same query using named parameters
       
       Query safeHQLQuery = session.createQuery("from Inventory where productID=:productid");
       safeHQLQuery.setParameter("productid", userSuppliedParameter);

      Header Manipulation

      * Client 나 Server 에 전달하는 초기 정보로 redirection을 결정하거나 contents type 에 따라 동작이 결정되는 페이지에 의도하지 않은 기능으로 작용할 수 있다.

      * 주요 파일 노출 및 공격자의 페이지로 이동시킬 수 있다.

      redirect

      (defn redirect
      [id]
      (if-let [url (url-for id)]
      (ring.util.response/redirect url)
      {:status 404 :body (str “No such short URL: ” id)}))

      file download

      (defn serve-file [request]
        {:status 200
        :headers {"Content-Type" "application/pdf"}
        :body (FileInputStream. "file.pdf")})

      id와 “file.pdf” 에 유효한 파라미터와 인가되지 않은 경로 접근에 관련된 문자를 제거한다.

      (defn HMFilter [s]
            (replace s "../" "")
      )
      (defn HMFilter [s]
            (replace s "etc" "")
      )
      (defn HMFilter [s]
            (replace s "$" "")
      )
      (defn HMFilter [s]
            (replace s "/" "")
      )

      Command Injection

      * 웹 애플리케이션에서 HTML 형식이나 쿠키, URL 파라미터 형식으로 시스템 명령어를 삽입 허용함으로써 웹 상에서도 시스템 명령을 실행할 수 있는 취약점이다.

      * 주요 파일을 엑세스하거나, 계정 생성 및 악의적인 침해가 가능하다.

      psk 님의 정의한 유틸리티 함수를 예로 든다.

      (defn mysh [& cmd] 
        (:out (apply 
                (partial clojure.java.shell/sh "/bin/sh" "-c") 
                cmd)))

      주요 파일을 열람할 수 있다.

      (def out (mysh "cat /etc/passwd"))

      아래와 같이 주요 디렉터리를 필터링하거나 |(파이프)를 이용한 명령 사용을 차단한다.

      (defn CMDFilter [s]
            (replace s "etc" "")
      )
      (defn CMDFilter [s]
            (replace s "passwd" "")
      )
      (defn HMFilter [s]
            (replace s "|" "")
      )
      tips/clojure/security.txt · Last modified: 2019/02/04 14:26 (external edit)