본문 바로가기

Language/Go

[Go] - web programming : 상황 인지, XSS 공격 막기

상황 인지

- Go 템플릿 엔진에서 콘텐츠가 표시될 때, 상황에 따라 변할 수 있다.

- 콘텐츠가 표시될 때, escape 처리를 한다. ( 콘텐츠가 html이면 html을 escape, js이면, js를 escape)

- Go 템플릿 엔진은 콘텐츠가 URL인지, CSS인지 등 콘테츠의 타입을 인지할 수 있다.

 

example - 액션 위치에 따른 콘텐츠 생성의 차이

 

main.go - 템플릿 엔진에 <i>Hello world!</> 라는 문자가 포함된 문자를 전송

package main

import (
	"html/template"
	"net/http"
)

func process(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("index.html")
	content := "asked : <i>Hello world!</i>"
	t.Execute(w, content)
}

func main() {
	server := http.Server{
		Addr : "127.0.0.1:8080",
	}
	http.HandleFunc("/process", process)
	server.ListenAndServe()
}

index.html - 여러 action의 위치를 설정

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Go Web Programming</title>
</head>
<body>
    <div>{{ . }}</div>
    <div><a href="/{{ . }}"></a></div>
    <div><a href="/?q={{ . }}"></a></div>
    <div><a onclick="f('{{ . }}')"></a></div>
</body>
</html>

 

 

개발자 도구로 확인한 html

 

XSS 공격 막기

 

 XSS?

  - XSS(cross-site scripting)은 웹 애플리케이션에서 나타나는 취약점으로 관리자가 아닌 이가 웹 페이지에 악성 스크립트를 삽입 할 수 있는 취약점

  - 여러 사용자가 보게 되는 전자 게시판에 악성 스크립트가 담긴 글을 올리는 형태

  - 사용자로부터 입력 받은 값을 제대로 검사하지 않고 사용할 경우 나타난다.

  - 해커가 사용자의 정보(쿠키, 세션 등)을 탈취하거나, 자동으로 비정상적인 기능을 수행하게 할 수 있다.

 

 example - 1번 html에서 스크립트를 작성하여 2번 html에 xss공격을 하는 예제

 

 main.go - process에서 Request 값을 확인하고 템플릿 엔진에 넘겨준다.

package main

import (
	"html/template"
	"net/http"
)

func process(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("index.html")
	t.Execute(w, r.FormValue("comment"))
}

func form(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("form.html")
	t.Execute(w, nil)
}

func main() {
	server := http.Server{
		Addr : "127.0.0.1:8080",
	}
	http.HandleFunc("/process", process)
	http.HandleFunc("/form", form)
	server.ListenAndServe()
}

 

form.html - 값을 입력받아, post method로 /process에 전송

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Go Web Programming</title>
</head>
<body>
<form action="/process" method="post">
    Comment: <input name="comment" type="text">
    <hr/>
    <button id="submit">Submit</button>
</form>
</body>
</html>

 

index.html - 1개의 action을 받음 (form에서 입력받은 값을 action 인자에 할당)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Go Web Programming</title>
</head>
<body>
<div>{{ . }}</div>
</body>
</html>

 

 결과

 

코드 스크립트를 전송(XSS 공격 예제)

 

Go 템플릿 엔진이 입력을 escape 처리한 것을 확인

 

form에서 작성한 script내부에 작성된 코드가 Go 템플릿 엔진에서 자동으로 escape 처리 해준것을 확인할 수 있다.

 

 

 

언이스케이프(unescape) 처리

 

- 코드가 자동으로 이스케이프되지 않도록 하고 싶을 때 사용

func process(w http.ResponseWriter, r *http.Request) {
	t, _ := template.ParseFiles("index.html")
    t.Excute(w, template.HTML(r.FormValue("comment"))
}

 

 

*reference

xss: https://en.wikipedia.org/wiki/Cross-site_scripting