본문 바로가기

웹해킹/개념

웹해킹 개념 복습

핵시움 본선 전.. 시스템 말고 웹해킹 개념도 조금씩 복습을 해야 할 것 같아서 정리합니다.

 

XSS

XSS는, Cross-Site Scripting의 약자로 웹페이지에 사용자의 입력이 포함될 수 있을 때 발생합니다. 종류는 크게 3가지가 존재합니다.

Stored XSS

악성 스크립트가 DB에 저장되고, 다른 사용자가 해당 페이지를 열 때 자동으로 실행되는 XSS

ex) 게시판에 XSS 공격 코드를 저장해두면, 사용자가 그 게시판을 열람할 때마다 공격이 수행됩니다.

Dom-based XSS

서버가 아닌 클라이언트 측 JavaScript 코드가 사용자 입력을 처리할 때 발생합니다.

Reflected XSS

악성 스크립트가 요청 파라미터(URL 등)에 포함되어 있고, 서버에서 이를 반영해 페이지에 출력하면서 실행됩니다.

http://site.com/search?q=<script>alert('XSS')</script>

 

이런식으로  XSS 공격 코드가 파라미터에 포함될 수 있다면, 서버에서 이를 반영해서 공격이 수행됩니다.

CSRF

CSRF란, Cross-Site Request Forgery의 약자로 인증된 사용자의 권한을 악용해서 사용자가 의도하지 않은 요청을 다른 사이트로 전송하게 만드는 공격입니다.

 

예를 들어서, 특정 사용자의 권한으로만 작동되는 페이지가 있을 때, 만약 그 권한을 얻을 수 있다면 그 사용자의 권한으로 페이지에서 작업을 수행할 수 있습니다.

SQL Injection

SQL 구문으로 작동되는 페이지가 있을 때, 임의의 SQL 구문을 삽입해서 의도하지 않은 동작을 일으키는 것을 SQL Injection이라고 합니다. 예를 들어서 다음과 같이 작동하는 웹 페이지가 있다고 가정하겠습니다.

 select * from users where uid = "{userid}" and upw = "{userpassword}"

이 때 만약 userid 부분에 다음과 같이 넣어주면, 뒤에 오는 userpassword의 값에 상관없이 무조건 통과됩니다.

admin" --

-- 로 인해서 뒷 부분이 주석처리되기 때문입니다.

SSRF

클라이언트가 아닌, 서버 스스로가 요청을 보내는 공격입니다. 예를 들어 아래와 같은 코드가 있다고 가정하겠습니다.

        url = request.form.get("url", "")
        urlp = urlparse(url)
        if url[0] == "/":
            url = "http://localhost:8000" + url
        elif ("localhost" in urlp.netloc) or ("127.0.0.1" in urlp.netloc):
            data = open("error.png", "rb").read()
            img = base64.b64encode(data).decode("utf8")
            return render_template("img_viewer.html", img=img)
        try:
            data = requests.get(url, timeout=3).content
            img = base64.b64encode(data).decode("utf8")
        except:
            data = open("error.png", "rb").read()
            img = base64.b64encode(data).decode("utf8")
        return render_template("img_viewer.html", img=img)

 

이 코드에서는 url을 인자로 받아서 요청을 보내는데, 만약 이 인자로 받는 url이 또 다른 사이트의 주소라면, 그 주소로 요청을 보내게 되는 SSRF 취약점이 발생합니다.