안녕하세요 이번엔 31단계인 좀비 문제를 풀어 보겠습니다.
보니 이번에 걸러지는 게 rollup 이랑 join이랑 ace 와 @와 i을 못 쓰네요.
제가 모르는 함수가 있어서 한 번 보고 가보겠습니다.
-rollup ?
GROUP BY 절에 종종 쓰이는 구문 입니다.
예시로 이런 테이블이 있다고 가정을 하겠습니다.
Sales (Table)
--------------
Region | Product | SalesAmount
---------------------------------------
East | Product A | 100
East | Product B | 150
West | Product A | 200
West | Product B | 120
그 다음에 저희가 총합을 SUM 함수 이용해서 볼 때
SELECT Region, Product, SUM(SalesAmount) as TotalSales
FROM Sales
이런 구문을 사용 하면 됩니다. 그럼 결과 물에
TotalSales에 570이 나오게 되겠죠.
그럼 이 때 ROLLUP 구문을 넣은 다음에 실행을 하게 된다면
SELECT Region, Product, SUM(SalesAmount) as TotalSales
FROM Sales
GROUP BY ROLLUP (Region, Product);
각각 레벨 만의 총계가 집결 하게 됩니다. 그럼 결과 물은
Region | Product | TotalSales
---------------------------------------
East | Product A | 100
East | Product B | 150
East | NULL | 250 <- East 총계
West | Product A | 200
West | Product B | 120
West | NULL | 320 <- West 총계
NULL | NULL | 570 <- 전체 총계
이렇게 나오게 됩니다.
-join ?
join 구문은 간단히 말해 두 개의 테이블을 합칠 때 쓰이는 겁니다.
-ace ?
이건 함수가 아닙니다 저희가 전 문제에 풀었을 떄 Quine 기억 나시나요? 그 때 쓰이는 핵심 함수가 replace입니다.
그 ace을 막기 위해 적은 것 같네요.
그럼.. Quine이 안 통하느냐 한 번 찾아 보니
이번엔 information_schema 테이블을 이용하겠습니다.
https://dev.mysql.com/doc/mysql-infoschema-excerpt/5.7/en/
MySQL :: MySQL Information Schema
The world's most popular open source database Contact MySQL | Login | Register
dev.mysql.com
참고하세요!
Metadata를 모은 게 information_schema 테이블이라고 생각하시면 됩니다.
- 테이블 메타데이터: 테이블 이름, 열(컬럼) 이름, 데이터 유형, 제약 조건, 인덱스 정보 등의 정보를 포함합니다.
- 인덱스 메타데이터: 인덱스 이름, 인덱스 구성 열(컬럼), 인덱스 유형, 사용된 알고리즘 등의 정보를 포함합니다.
- 뷰 메타데이터: 뷰 이름, 뷰를 구성하는 쿼리, 뷰 정의 등의 정보를 포함합니다.
- 프로시저 및 함수 메타데이터: 저장 프로시저, 함수 이름, 매개변수 정보, 정의 등의 정보를 포함합니다.
- 사용자 및 권한 메타데이터: 사용자 이름, 권한 정보, 접근 권한 등의 정보를 포함합니다.
그렇다고 하네요!
이 Table은 서버를 통해 동작하고 있는 스레드의(여기선 쿼리라고 하네요) 정보를 가지는 테이블인 processlist 이 있습니다.
INFO 칼럼 안에 저희가 행한 php 코드 통한 쿼리문이 있다고 생각하시면 되요.
저희가 행한 쿼리문은 union도 있고 select도 있잖아요? 그러니 그 사이에 pw에 준 부분만 해당 되는 부분만 찾아서 짤라서 호출하면 되겠죠.
그러니 substr함수를 사용하겠습니다. INFO을 호출하는데 그 사이에 준 부분만 해당 되는 부분만 찾는 겁니다.
' union select substr(info,[숫자],[숫자]) from information_schema.processlist %23 이러면 됩니다.
숫자 란에 알맞은 값을 넣으면 답이 되겠죠
일단 정상대로 작동을 한다느 가정하고 쿼리문을 작성하면
select pw from prob_zombie where pw='' union select substr(info,XX,XX) from information_schema.processlist #
이러겠죠.(XX는 대충 두 글자 숫자 입니다.)
그리고 저희가 작성한 pw는 ' union select substr(info,XX,XX) from information_schema.processlist # 입니다.
그럼 두개 문자열 길이을 빼면 pw의 처음 시작 위치값을 알겠네요!
108자 - 71자 = 37 이네요. 그런데 37번째 자리 보면 pw='' 할 때 '' 이 사이 위치 값일 겁니다.
저희가 원하는 건 pw 다음 즉 union 준 부분만 필요하니 자리값 +1 하겠습니다. 38번째.
그 다음에 substr은 얼마나 자르는 지의 값도 필요합니다
작성한 pw의 길이만큼 자르면 되겠죠
71자 이겠죠.
' union select substr(info,38,71) from information_schema.processlist #
물론 #은 %23으로 바꿔서 보내야만 합니다.
좀비인생
'워게임' 카테고리의 다른 글
los rubiya - 30(ouroboros) (0) | 2023.06.25 |
---|---|
los rubiya - 29(phantom) 풀이 (0) | 2023.06.24 |
los rubiya - frankenstein(28번 문제) (0) | 2023.06.08 |
los rubiya - 27(blue dragon) 풀이 (0) | 2023.05.31 |
los rubiya - 26(red_dragon) 풀이 (0) | 2023.05.26 |