본문 바로가기

워게임

los rubiya - 31(zombie)

안녕하세요 이번엔 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 테이블이라고 생각하시면 됩니다.

 

  1. 테이블 메타데이터: 테이블 이름, 열(컬럼) 이름, 데이터 유형, 제약 조건, 인덱스 정보 등의 정보를 포함합니다.
  2. 인덱스 메타데이터: 인덱스 이름, 인덱스 구성 열(컬럼), 인덱스 유형, 사용된 알고리즘 등의 정보를 포함합니다.
  3. 뷰 메타데이터: 뷰 이름, 뷰를 구성하는 쿼리, 뷰 정의 등의 정보를 포함합니다.
  4. 프로시저 및 함수 메타데이터: 저장 프로시저, 함수 이름, 매개변수 정보, 정의 등의 정보를 포함합니다.
  5. 사용자 및 권한 메타데이터: 사용자 이름, 권한 정보, 접근 권한 등의 정보를 포함합니다.

 

그렇다고 하네요!

 

이 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