[HTB] Neonify Writeup
주어진 페이지에 접속해보자. 문자열을 입력하면 네온사인처럼 빛나게 출력해주는 웹 페이지가 나타난다.
상세 소스를 분석해보자.
ruby언어로 이루어져 있으며, neon파라미터의 값이 ERB.new() 처리가 되는데, 선행되는 조건은 입력값이 영어대소문자, 스페이스, 숫자 로만 이루어져야 한다.
class NeonControllers < Sinatra::Base
configure do
set :views, "app/views"
set :public_dir, "public"
end
get '/' do
@neon = "Glow With The Flow"
erb :'index'
end
post '/' do
if params[:neon] =~ /^[0-9a-z ]+$/i
@neon = ERB.new(params[:neon]).result(binding)
else
@neon = "Malicious Input Detected"
end
erb :'index'
end
end
우선, ERB는 ruby언어에서 활용되는 템플릿의 일종으로, SSTI공격이 가능하다. 아래 페이지를 비롯한 많은 자료에서 내용을 확인 할 수 있다.
https://medium.com/@bdemir/a-pentesters-guide-to-server-side-template-injection-ssti-c5e3998eae68
A Pentester’s Guide to Server Side Template Injection (SSTI)
Server-side template injection is a vulnerability where the attacker injects malicious input into a template to execute commands
medium.com
필터링을 우회하여 특수문자를 입력 할 수 있다면 SSTI Injection 공격을 통해 플래그를 획득 할 수 있을 것이다.
여러 시도를 해보다가, 사용자 입력 값에 개행문자를 포함시키면, 개행 이후의 값들에 대해서는 정규식 필터링이 적용되지 않는 현상을 발견했다.
사실 나는 이것저것 시도해보다가 해당 현상을 발견해서 문제를 해결한 케이스였는데, 사실 현상에 대해 명확하게 이해가 되지 않았다.
개행문자도 특수문자인데 왜 필터링되지 않을까에 대한 이해가 되지 않아서 문제 해결 후 추가적으로 조사를 해본 결과 ^ 나 $ 을 통해 문자열의 시작과 끝을 지정 한 경우 기본적으로 한 줄을 인식하며, 여러 줄을 표기하려는 경우 /m 옵션을 별도로 써야 한다고 한다.
https://ko.javascript.info/regexp-multiline-mode
앵커 ^와 $의 여러 행 모드, 'm' 플래그
ko.javascript.info
ruby doc에도 유사한 내용이 안내되어 있었다.
https://ruby-doc.com/docs/ProgrammingRuby/html/language.html
Programming Ruby: The Pragmatic Programmer's Guide
def a print "Function 'a' called\n" 99 end for i in 1..2 if i == 2 print "a=", a, "\n" else a = 1 print "a=", a, "\n" end end
ruby-doc.com
다시 문제로 돌아와서 우회 기법을 파악했으니
Dir.entries() 구문을 통해 플래그의 경로를 확인 하고,
File.open()을 통해 플래그를 획득 할 수 있었다.
FLAG = HTB{r3pl4c3m3n7_s3cur1ty}