텍토 구현이라면 해커 공격의 즐거움이 되기 쉬운 Ruby 라이브러리 open-uri

open-uri는 제대로 구현하지 않으면 어쩐지 위험한 향기가 나네요, 라는 이야기.

Ruby 2.4.0 참조 설명서 module OpenURI

예를 들어 외부 API를 두드려야합니다.
require "open-uri"

로 사용하고 있었다고 한다.
폼으로부터 받은 파라미터를 넣어 open(무엇인가)로 하는 경우, 그대로 뭐든지 open() 안에 넣으면 꽤 위험.

예를 들어 이것은 양식에 넣은 URL에 따라 그 웹사이트에 가서 뭔가 가져오는 예.



코드로 말하면 이런 느낌.
require "open-air"

class PagesController < ApplicationController
  def search
    @page = open(search_params[:url])
  end

  private

  def search_params
    params.permit(:url)
  end
end

아마 이런 보안 개방적인 구현은 하지 않는다고 생각하지만, 이것을 해킹해 보면 이렇게 된다.



Ruby의 경우 파이프를 전달하면 그대로 외부 명령을 실행할 수 있습니다.
| ls

결과는 이것입니다.



제대로 ls 명령의 결과로서 Gemfile이나 보이는군요. 해커들이 ls커맨드의 결과를 본 것만으로 떠나는, 따위 행의가 좋다. 커맨드를 실행할 수 있다고 알면 알레도 이것도 행해지는 것은 상상하기 어렵지 않다.

그래서 대책으로 params를 확인합시다. 그렇지만 그것이 단순히 「정규 표현등으로 http를 포함하고 있는 경우만 open을 실행」이라고 돌파는 간단

이렇게 ||를 붙이면 OK


| cat /etc/passwd || http://son_of_a_bxxxh

A || B 의 의미는 A를 실행하고 에러가 나왔을 경우에만 B를 실행해 주세요, 라는 의미. 말할 필요도 없이 명령의 의도는 http....는 단순한 URL풍의 표정으로/etc/passwd를 보여주세요, 라고.

그 결과가 이것.



훌륭하게/etc/passwd가 보이기도 하고 고소하다.

별로 open-uri가 안되는 라이브러리라고 말하고 싶은 것은 아니다. 요점은 어떤 라이브러리라도 그 사용 나름이라고 하는 것으로 충분히 주의합시다, 라고.

이전에 이런 해커적인 테크닉을 사용한 퍼즐을 만들려고 하고 있고, 결과적으로 생긴 퍼즐이 이것.

대부분의 엔지니어에게는 풀릴 수 있지만 하위 10 %의 쓸데없는 엔지니어에게만 풀 수없는 퍼즐?

이 퍼즐에 등록해 주신 해답자수가 겨우 5300을 넘었을 때인가. . . 더 늘릴 방법 없을까-.

좋은 웹페이지 즐겨찾기