-
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: 선언이 가능한가요?) -
javasciprt: 선언 우회 시 정규화 사용에 대해
javascript: 를 정규화 하면 \1\4jAVasC\triPT: 처럼 사용을 하는데요.
이 때, 실제 form 등에서는 \1, \4, \t를 실제 입력 값으로 바꿔서 넣어줘야 하더라고요. ex. \t는 실제 탭을 입력해야 함 (javascr ipt: 처럼)
이를 python에서 보낼때는 어떻게 보낼 수 있나요? (curl도 궁금하고요..)
그리고, print("\1\4\t") 해봐도 \1\4는 결과값에 나오지가 않던데.. 이 부분은 어떻게 쉽게 얻을 수 있을까요? (인터넷이 검색이 아닌 쉘 등에서 얻어보려면..)
관련하여 설명을 해주시면 감사하겠습니다.
-
자바스크립트 문법 상 unicode escape sequence가 지원되는 것이며, attribute 값 자체에는 평문
\uXXXX
로 들어갑니다.
onerror
등on~
event attribute들의 경우 이미javascript:
없이도 자바스크립트 코드로 실행됩니다. 그러나href
,src
등의 attribute는 URL 값으로 인식되기 때문에,javascript:
scheme이 필요합니다. -
해당 값은 이미 잘 출력되거나 전송되고 있었을 가능성이 높습니다.
\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 방식을 따라 직접 보내시면 됩니다.