4주차_CTF과제(Dreamhack : baby-union)

2024. 5. 4. 10:10hacking : p_study/Dreamhack

baby-union | 워게임 | Dreamhack

 

baby-union

Description 로그인 시 계정의 정보가 출력되는 웹 서비스입니다. SQL INJECTION 취약점을 통해 플래그를 획득하세요. 문제에서 주어진 init.sql 파일의 테이블명과 컬럼명은 실제 이름과 다릅니다. 플래

dreamhack.io

 

📌 CTF 문제 풀이

 

두번째 문제를 풀겠다.

문제 설명을 보니 로그인 시 계정의 정보가 출력되는 웹 서비스이고, sql injection취약점을 통해 플래그를 획등하는 것이다.

sql injection에 대해 공부하긴 했었는데, 다까먹어서 공부를 추가로 해야할 것 같다.

 

일단은 문제파일 다운로드 받고, 웹서버를 생성했다.

 

 

이렇게 생겼다.

query보니까 sql 인젝션이 생각이 조금씩 나는 것 같기도하고 일단 아무거나 대입해봤다.

 

 

 

아무런 변화가 없었고, 코드를 살펴보았다.

 

 

위 정보를 통해 admin, apple을 입력했을 때 아래와 같이 뜨는데,  db에 이렇게 쌓이는 건가보다.

 

 

 

 

문제 설명에서 주어졌던 , 문제에서 주어진init.sql파일의 테이블명과 컬럼명은 실제 이름과 다릅니다. 

라는 부분이 마음에 걸린다.. 

 

진짜 이름이 flag is , DH{sam , ple, flag 인건가요...?

일단 여기까지 해보고 더이상 진전이 없어서 찾아봤다.

 

admin' or '1'='1를 uid에 넣고 upw에는 아무 값을 넣고 제출하면 아래 처럼 나오므로 sql인젝션이 가능한 사이트 라는 것을 알 수 있다한다.

그렇기때문에 union구문과 information_schema 함수를 사용하여 플래그가 저장된 테이블과 컬럼명을 알아 낼 수 있을 것 같다고 하는데, union구문이 뭘까?

 

 

uid에 **admin' union select table_name,null,null,null from information_schema.tables where table_schema = 'secret_db'-- -**를 넣으면 secret_db에 있는 테이블이 출력되는데,

위 코드에서 null이 들어가는 이유는 union 구문은 컬럼 개수가 일치해야하기 때문이라고 한다.

 

위에서 출력된 테이블 중 플래그가 있는 테이블은 ‘onlyflag’ 라는 테이블이란 것을 알 수 있는데,

코드를 살짝 바꾸어 ‘onlyflag’ 테이블의 컬럼을 출력하는 코드를 작성할 수도 있다.

**admin' union select column_name,null,null,null from information_schema.columns where table_name = 'onlyflag'-- -**이를 uid에 넣고 제출하게 되면 아래와 같이 출력된다.

 

 

근데 난 왜 admin이 없지 .. 무튼 이렇게 나오게 된다.

 

우선, 위를 통해 ‘onlyflag’에 플래그가 있다는 사실을 알았고, ‘onlyflag’테이블에 있는 칼럼은 idx, sname, svalue, sflag, sclose 인것을 알 수 있다.

정보를 종합해보면, ‘onlyflag’ 테이블에 있는 컬럼을 출력하면 플래그를 얻을 수 있겠구나 라는 생각에 이르러야한다.

→ gruop_contact 함수를 사용하여 모든 각 컬럼에 저장된 플래그 조각을 출력할 수 있다고한다.

 

admin' union select sname,group_concat(svalue,sflag,sclose),null,null from onlyflag-- -

코드는 위와 같고 이 코드를 uid에 넣고 제출을 하게 되면 플래그 값이 나오게 된다고한다.

 

 

 

위에서 혼자 풀어나갈땐, 뭔가 생각보다는 수월한 것 같고, 잘 풀리는 듯 보였으나, sql인젝션과 관련된 내용을 다 까먹은 상태라 접근자체가 어려웠던 것 같다.

생각보다 되게 복잡하다는 걸 느꼈고,, 추가적인 공부가 필요할 것같다.

 

 

 

 

[ 참고한 학습 자료 ]

[LEVEL-1] baby-union — 쿼카가 코딩을 하면? (tistory.com)

 

[LEVEL-1] baby-union

import os from flask import Flask, request, render_template from flask_mysqldb import MySQL app = Flask(__name__) app.config['MYSQL_HOST'] = os.environ.get('MYSQL_HOST', 'localhost') app.config['MYSQL_USER'] = os.environ.get('MYSQL_USER', 'user') app.confi

ja2hy20k.tistory.com

 

SQL Injection 이란? (SQL 삽입 공격) — 보안과 개발을 다 하고싶은 욕심쟁이 (tistory.com)

 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection 1.1 개요 Ÿ SQL InjectionSQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는

noirstar.tistory.com