2024. 5. 4. 10:10ㆍhacking : p_study/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
'hacking : p_study > Dreamhack' 카테고리의 다른 글
5주차_CTF과제(Dreamhack : simple-web-request) (0) | 2024.05.10 |
---|---|
5주차_CTF과제(Dreamhack : pathtraversal) (0) | 2024.05.10 |
4주차_CTF과제(Dreamhack : phpreg) (0) | 2024.05.04 |
3주차_CTF과제(Dreamhack : Flying Chars) (0) | 2024.04.17 |
3주차_CTF과제(Dreamhack : php7cmp4re) (0) | 2024.04.17 |