User Tools

Site Tools


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)