텍토 구현이라면 해커 공격의 즐거움이 되기 쉬운 Ruby 라이브러리 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을 넘었을 때인가. . . 더 늘릴 방법 없을까-.
Reference
이 문제에 관하여(텍토 구현이라면 해커 공격의 즐거움이 되기 쉬운 Ruby 라이브러리 open-uri), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jabba/items/7e018139fff586b4a06d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)