WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 45 - Kraken

으으 문어다. 필자는 연체동물을 먹지 못한다. 몸이 거부반응을 일으킨다. 토한 게 한두 번이 아니다. 빨리 코드를 보고 무찌르자

< 출처 : 나무위키 https://namu.wiki/w/%EC%9D%B4%EB%B3%BC%EB%B8%8C/%EB%AA%AC%EC%8A%A4%ED%84%B0/%ED%81%AC%EB%9D%BC%EC%BC%84 >


코드

코드에 따르면 mssql기반의 문제이다. GET파라미터로 전달될 id와 pw에 대해서 master와 information을 필터링하고 있다. 그 후 table인 member에서 id를 query 해서 결과를 echo 하고, pw로 전달된 값이 $krakenFlag로 나오면 된다.

* 주석으로 flag는 member테이블이 아닌 'flag_{$hash}'의 테이블에 있다고한다. 메타 테이블에 접근을 해야 되겠다.


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=FLAG

if($result ['id'])라는 조건이기에, id가 있기만 하면 되는 거여서 union을 통한 조작이 가능하다.

 

또한 저번 문제를 기억하는 사람들은 이번 메타 테이블 접근에 sys가 필터링이 안되어있는 것을 눈치챘을 것이다.

mssql에는 "sysobjects"라는 메타 테이블이 존재한다. "sysobjects"에는 DB에서 생성된 개체들의 모든 정보가 들어있다. 그중 xtype과 type에는 각 개체의 유형을 저장하고 있는데, 그중 우리는 "U"타입(사용자 테이블)을 가져올 것이다.

try : ?id=1' union select name from sysobjects where type='U'--%20

으흠; 역시 호락호락하지 않다. a_dummy_table이라는 테이블이 행으로 있는 거 같다. 간단한 막일로 처리하자

try2 : ?id=1' union select name from sysobjects where type='U' and name like 'flag%'--%20

그렇다. 물론 이와 같은 방법 말고 깔끔한 방법도 많을 것이다. flag_table은 알았으니 테이블에서 정보를 빼보자.

try3 : ?id=1' union select * from flag_ccdfe62d--%20

이렇게 flag를 알 수 있었다.


mssql의 메타 테이블인 sysobjects에 대해서 알 수 있는 문제였다. 이제 다음 관문으로 넘어가자