티스토리 뷰

LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.

45단계 소스코드이다.

id와 pw를 파라미터로 받고 기본적인 필터링이 되어있다.

그리고 pw가 krakenFlag와 일치하면 문제는 해결되지만 익숙한 주석이 보인다.

flag는 member에 없으니 다른 곳에서 찾으란 뜻이다.

그럼 진행해보자.

쿼리 : ?id='or id>'a'--+-

guest 이외의 id를 찾아봤지만 guest 하나밖에 나오지 않았다.

따라서 admin은 다른 테이블에 있다는 걸 확인했다.

이번 문제에서는 master가 필터링되었기에 메타데이터에 접근하는 또 다른 방식인 sysobjects를 사용한다.

테이블 이름을 조회해보자.

쿼리: ?id='union select name from sysobjects--+-

딱 봐도 필요 없어 보이는 이름이 추출되었다...

다음 행을 검색해보자

쿼리 : ?id='union select name from sysobjects order by 1 offset 2 rows--+-

2번의 시도후에 필요해 보이는 값을 찾게 되었다.

table이름을 알게 되었으니 칼럼명을 추출하고 값을 추출해보자.

라고 생각하며 시도를 했는데 문제를 해결할 수 없었다.

그 이유는 바로 어떤 방식으로 메타데이터에 접근하느냐의 문제였다.

sysobjects를 사용할 경우 object_id를 사용할 수 없고

sys.objects를 사용할 경우에는 object_id를 사용할 수 있었다.

sysobjects <-> id

sys.objects <-> object_id

쿼리 : ?id='union select object_id from sys.objects where name='flag_ccdfe62b'--+-

object_id를 찾았다.

이를 통해 칼럼명을 추출해보자.

쿼리: ?id='union select name from sys.columns where object_id=901578250--+-

칼럼명까지 추출했다.

이제 문제는 모두 해결되었다.

바로 flag를 추출하자.

해결

시행착오

1. sysobjects <-> id,  sys.objects <-> object_id처럼 사용해야 한다. 아니면 안 됨

2. 테이블명을 찾을 때 order by 1 offset 2 rows를 사용해 3번째 에서 필요한 테이블을 찾았지만 object_id를 추출할 때에는 3번째에서 찾으면 안 되고 조건절에서 테이블의 이름으로 찾는 게 정확하다.

3. order by 1 offset 1 rows를 union select top 1 name으로 사용할 수 있다. (쿼리 길이가 확 줄어드는 이점이 있음)

4. mssql에서는 union select에서 하나의 값만 불러올 때 string_agg(name, ' ')를 통해 문자열을 합쳐서 불러올 수 있다.

댓글