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

선행학습
MySQL 서버 내에 존재하는 DB의 테이블, 컬럼 등 스키마 정보를 모아둔 DB를 information_schema라고 한다.
table_name, column_name으로 테이블 이름과 컬럼 이름을, database()로 데이터 베이스 이름을 확인한다.
DB > table > column
0. 문제

uid와 upw를 입력받고, submit으로 제출할 수 있다.
1. 코드

데이터 베이스를 초기화 할 때 사용한 init.sql 파일의 내용이다.
이 파일에는 DB의 초기값이 저장되어 있다.
이 파일을 보았을 때 총 4개의 컬럼과 사용한 DB로 추정되는(secret_db) DB를 알 수 있다.

전체적인 코드를 보면 다음과 같다.
코드를 나눠서 살펴보면

submit 버튼을 눌렀을 때(POST) uid와 upw를 입력받고

uid, upw가 잘 입력되었다면 mysql을 통해 아래의 구문이 실행된다.
DB에 데이터가 있는 경우에는 user.html을 없는 경우에는 "Wrong!"과 함께 index.html을 리턴한다.
SELECT * FROM users WHERE uid='{uid}' and upw='{upw}';
users 테이블에서 uid가 {입력한 uid}이고, upw가 {입력한 upw}인 것을 가져온다.
우선은 'or 1 = 1#로 어떤 테이블이 있는지 확인해 보았다.
'or 1 = 1#
: '로 문자열 인식이 되지 않고 or 1 = 1로 반드시 참이되도록 하며 #으로 뒤에 오는 명령어를 주석처리한다.
∴ SELECT * FROM users WHERE uid=''or 1 = 1#' and upw=aaaa이 되어 users 테이블의 모든 값들을 가져온다.


2. exploit




init.sql에서 본 users 테이블의 4개의 컬럼이 있었기 때문에 'UNION SELECT 1, 2, 3, 4 FROM users;로 확인해보았다.
이후 information_schema.tables에서 모든 테이블의 이름을 확인하고자 다음 sql문을 작성했다.
'UNION SELECT table_name, 2, 3, 4 FROM information_schema.tables;


많은 양의 테이블이 검색되었고 그 중에서 onlyflag 테이블이 가장 먼저 눈에 띄었다.
'UNION SELECT 1, column_name, 3, 4 FROM information_schema.columns WHERE table_name = "onlyflag";
먼저 컬럼 개수(4개)를 맞추고 두 번째가 잘 보일 것 같아 column_name으로 설정했고
information_schema.colums에서 테이블 이름이 onlyflag인 컬럼을 가져왔다.

그 결과 총 5개가 출력됐다. 하지만 앞의 init.sql에서 idx가 pk라는 정보와 sname이 flag is라는 것을 얻었기 때문에
svalue, sflag, sclose만 사용할 것이다. 단, 3번째 컬럼은 화면에 보이지 않았기 때문에 숫자 3을 넣어주었다.
'UNION SELECT svalue , sflag, 3, sclose FROM onlyflag;

'WriteUp > 드림핵' 카테고리의 다른 글
| error based sql injection (0) | 2024.05.13 |
|---|---|
| command-injection-chatgpt (0) | 2024.04.12 |
| what-is-my-ip (0) | 2024.04.08 |
| simple_sqli (0) | 2024.04.01 |
| XSS-1, XSS-2 (0) | 2024.03.21 |