일단 이 문제를 풀기 위해 필요한 sql injection의 여러 방식과 구문들을 알아보겠다.
Boolean-based SQL injection
블라인드 SQL 인젝션의 한 유형으로, 웹 애플리케이션이 SQL 쿼리 실행 결과로 데이터베이스의 실제 내용을 직접 출력하지 않고 참과 거짓의 결과에 따라 웹 페이지의 응답이 달라지는 것을 이용하는 것이다.
>>가장 많이 쓰인다( 특히 브루트포싱 )
Time Based SQL Injection
블라트트 SQL 인젝션의 한 유형으로, 시간 지연을 이용하여 쿼리가 참인지 거짓인지 판별하는 공격이다. 결과는 항상 동일하게 나오므로 결과를 보고 공격의 성공 여부를 결정하는 것이 아닌 시간 지연이 되는지를 보고 성공 여부를 결정한다.
>> boolean-based SQLi를 사용할 수 없는 특수 상황에 많이 쓰인다
UNION SQL Injection
블라인드 SQL 인젝션의 한 유형으로, UNION SQL Injection은 기존의 SELECT문에 UNION SELECT문을 추가하여 원하는 정보를 데이터베이스에서 추출하는 공격이다.
UNION 연산자는 두 개 이상의 SELECT문에 대한 결과를 하나의 결과로 추출한다.
UNION은 기본적으로 중복을 제거한 결과를 보여준다. 중복을 포함한 결과를 추출할 경우 UNION ALL을 사용하면 된다.
공격자는 이러한 점을 이용하여 기존의 SELECT문에 원하는 데이터를 추출하기 위한 UNION SELECT문을 추가하여 쿼리 결과를 확인할 수 있다.
UNION 연산자를 사용하기 위해서는 두 가지 조건을 만족해야 한다.
- 기존의 SELECT문과 UNION SELECT문의 컬럼 수가 동일해야 한다.
- 컬럼 수가 동일하지 않을 경우 에러 메시지를 반환한다.
- 각각의 컬럼은 순서 별로 동일한 데이터형이어야 한다.
- 각 컬럼의 데이터형이 동일하지 않을 경우 에러 메시지를 반환한다.
- 단, MySQL의 경우 자동 형 변환이 이루어지기 때문에 데이터형이 일치하지 않아도 된다.
information_schema
information_schema는 MySQL, MariaDB, PostgreSQL 등에서 자동으로 존재하는 시스템 DB이다
이 DB 안에는
- 어떤 데이터베이스가 있는지
- 어떤 테이블이 있는지
- 어떤 콜럼이 있는지
- 어떤 계정이 어떤 권한을 갖는지 등
데이터베이스 전체의 구조 정보를 담고 있는 데이터가 들어있음.
즉, 간단히 말하면 “데이터베이스의 데이터베이스” 라고 보면 됨.
여러 SQL에 기본적으로 내장 되어있다(문법은 조금씩 다를수 있음)
- MSSQL
- sys 구문
- MYSQL, MariaDB, PostgreSQL, oracle
- imformation_schema 구문
- sqlite
- sqlite_master 구문
일단 이번 baby-union 문제는 mysql을 사용하기에 imformation_schema를 더 알아보겠다
imformation_schema를 이용한 sqli를 할때 가장 많이 쓰이는 기능 두가지가 있다
- information_schema.tables
- 데이터 베이스 내의 모든 테이블 목록을 보여줌
- information_schema.columns
- 각 테이블의 콜럼의 이름과 속성을 보여줌
그러면 이제 baby-union 문제를 풀어보겠다
baby-union 문제

일단 메인 화면이다
로그인을 할수있는 사이트 같고 코드를 보겠다

일단 mysql을 사용하는 것을 알 수 있고
그래서 sql 파일을 보면

먼저 계정이 보이고
db 이름도 secret_db 라는 것을 알 수가 있다
또한 이미 만들어진 users 라는 table이 보이고
순서는 idx, uid, upw, descr이라는 것도 알 수가 있다

그리고 아래를 보면 테이블 이름과 총 4개의 콜론의 이름과 각각이 가진것을 알 수가 있다
fake_col1 = 'flag is '
fake_col2 = 'DH{sam'
fake_col3 = 'ple'
fake_col4 = 'flag}'

하지만 문제 설명에 나와있듯
fake_col과 fake_table_name은 진짜 이름이 아니기에 information_schema.tables를 이용해 알아보면 될것 같다
일단 마저 코드를 보면

이부분 때문에 일단은 '를 로그인 할때 사용해 봐야겠다 라는 생각이 들었다.
바로 해보면

500 에러가 터지며, sqli가 통한다는것을 알 수가 있다
풀이
admin' union select 1, 2, 3, 4 -- 1 구문을 넣어줬다
해석을 해보면 admin으로 로그인 하고 '로 sqli를 유발 시키고, union select 1,2,3,4 를 이용해
원래 select의 결과 대신 콜럼값에 1,2,3,4를 반환하게 했다
( 왜 1~ 4냐 하면 숫자는 그냥 보기 쉽게 명시적인 예시로 든거고 4개 뿐인 이유는
위에 users table을 보면 콜럼이 4개인걸 알수있다)
그러면

이렇게 나오는 것을 보니 알수 있는것이 참 많다
아까 user table을 봤을때 콜럼 4개에 순서는 idx, uid, upw, descr이라는 것도 알 수가 있었는데
방금 admin' union select 1, 2, 3, 4 -- 1 구문을 넣은 것으로
idx - 1 - 출력 성공
uid - 2 - 출력 성공
upw - 3 - 출력 실패
descr - 4 - 출력 성공
라는 결과를 보고 upw는 출력 되지 않는다는 것을 알 수가 있다
그러면 일단 flag를 알아내기 위해 먼저 테이블 명을 알아내야 한다
admin' union select 1, 2, 3, table_name from information_schema.tables where table_schema = 'secret_db' -- 1
그래서 위에 있는 구문을 넣어주었다
또 해석 해보면 아까 설명 한것은 건너 뛰고
4를 뺴고 table_name from information_schema.tables where table_schema 'secret_db'
즉 secret_db에 있는 모든 table를 출력 하게 했다
그러면

이렇게 table 이름들이 전부 나오게 된다
users는 우리가 이미 아는 table이니까 넘어가고 우리가 중점적으로 볼것은 onlyflag이다
당연히 두개중 하나는 아는거면 나머지 하나가 flag가 있는 table일것이다
그러면 이제 우리에게 남은것은 콜럼 알아내기니까
admin' union select 1, 2, 3, column_name from information_schema.columns where table_name='onlyflag' -- 1
즉, 4대신 onlyflag table에 모든 콜론 이름이 출력되게 하였다
그러면

아주 잘 나오는 것을 볼 수가 있다
idx는 인덱스 용도니 가뿐히 무시해주고
sname, svalue, sflag, sclose를 중점적으로 보자
admin' union select sname,svalue,sflag,sclose from onlyflag -- 1
그래서 일단은 콜럼들을 출력 해주기위한 코드이다
그러면

이런 결과가 나오는데
잘못보면 이게 잘 나온 결과라는 심각한 착각을 할수도 있다
하지만 flag is 라는 말이 왜 나왔겠는가?
그리고 우리 기억으로는 4가지 콜럼을 출력해도 3번째 콜럼은 출력되지 않는다
>> 즉 sname 이라는 쓰래기 콜럼이 출력 되었고, 정작 중요한 sflag 콜럼은 출력되지 않았던 것이다!!
그래서 코드를 수정하여
admin' union select svalue,sflag,sname,sclose from onlyflag -- 1
이 코드를 써주면

이렇게 플래그가 아주아주 잘 나오는 것을 볼 수가 있다.
뭔가 라업을 너무 의식의 흐름대로 적은것 같기도 하다....
'web > 웹 해킹' 카테고리의 다른 글
| sql injection bypass WAF Advanced 문제 풀이 (1) | 2025.11.08 |
|---|---|
| simple_sqli_chatgpt 문제 풀이 (0) | 2025.11.06 |
| BypassIF 문제 풀이 (0) | 2025.11.06 |
| sqli, command injection 문제 풀이 (1) | 2025.11.05 |
| XSS , CSRF 문제 풀이 (0) | 2025.11.04 |