풀이 중 질문 (스포 있으니 문제 풀고 보세요)
  1. Unicode escape sequence 사용 시
    이를 통해 우회 시, Unicode escape sequence 해석을 위해 javascript: 선언 선행이 필수인가요?
    예를 들면 꼭 <a href="javascript:, <iframe src:"javascript: 처럼 javascript:로 시작해야하는지요.
    <img> 태그 등에서 javascript: 없이 onerror=locati\u006fn.href... 이런식으로는 동작 안하더라고요.
    혹은 img 태그 등에서도 javascript 없이 Unicode escape sequence를 사용하는 법이 있거나 할까요?
    (아니면 img 태그에서도 javascript: 선언이 가능한가요?)

  2. javasciprt: 선언 우회 시 정규화 사용에 대해
    javascript: 를 정규화 하면 \1\4jAVasC\triPT: 처럼 사용을 하는데요.
    이 때, 실제 form 등에서는 \1, \4, \t를 실제 입력 값으로 바꿔서 넣어줘야 하더라고요. ex. \t는 실제 탭을 입력해야 함 (javascr ipt: 처럼)
    이를 python에서 보낼때는 어떻게 보낼 수 있나요? (curl도 궁금하고요..)
    그리고, print("\1\4\t") 해봐도 \1\4는 결과값에 나오지가 않던데..  이 부분은 어떻게 쉽게 얻을 수 있을까요? (인터넷이 검색이 아닌 쉘 등에서 얻어보려면..)

관련하여 설명을 해주시면 감사하겠습니다.

#web
작성자 정보
답변 1
avatar
Xion
대표 업적 없음
  1. 자바스크립트 문법 상 unicode escape sequence가 지원되는 것이며, attribute 값 자체에는 평문 \uXXXX로 들어갑니다.
    onerroron~ event attribute들의 경우 이미 javascript: 없이도 자바스크립트 코드로 실행됩니다. 그러나 href, src 등의 attribute는 URL 값으로 인식되기 때문에, javascript: scheme이 필요합니다.

  2. 해당 값은 이미 잘 출력되거나 전송되고 있었을 가능성이 높습니다. \1과 같은 문자는 출력 가능한 문자가 아니라 터미널에서는 보이지 않을 수 있습니다.

    $ cat test.py 
    print("\1\4\t")
    $ python3 test.py | xxd
    00000000: 0104 090a                                ....
    

    python을 이용하여 이 값을 보내고 싶은 경우에도 일반적인 문자열을 사용하듯이 그대로 사용해도 대부분의 경우 무방한데, 사용하는 라이브러리(아마도 requests)가 알아서 적절하게 인코딩 한 다음 서버로 전송합니다.

    # Example 1: URL Query Parameter
    requests.get('http://localhost:12345/', params={'a': '\1\4\t'})
    
    ##### RESULT #####
    GET /?a=%01%04%09 HTTP/1.1
    Host: localhost:12345
    User-Agent: python-requests/2.28.1
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: keep-alive
    
    # Example 2: JSON body
    requests.post('http://localhost:12345/', json={'a': '\1\4\t'})
    
    ##### RESULT #####
    POST / HTTP/1.1
    Host: localhost:12345
    User-Agent: python-requests/2.28.1
    Accept-Encoding: gzip, deflate
    Accept: */*
    Connection: keep-alive
    Content-Length: 23
    Content-Type: application/json
    
    {"a": "\u0001\u0004\t"}
    

    curl을 사용하실 때에도 위와 같은 encoding/escaping 방식을 따라 직접 보내시면 됩니다.

2023.03.20. 15:32
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기