문제 형식은 앞전의 문제 ouroborus 와 매우 유사하다. 필터링에 'ace' 라는 문자열이 포함되어있어 Quine 은 사용하지 못할 것 같다. 이번 문제에는 table에 데이터가 존재할 수도 있을 것 같다. 확인해보자.
pw=' or 1%23
음. 없다. 이번 문제에도 테이블에 아무런 데이터가 존재하지 않는다. Quine도 사용하지 못한다.
replace 함수를 다른 함수로 대체할 수 있는지 찾아보았지만 그런 것은 존재하지 않았다. 어떤 기술을 발휘해야 이 난관을 뚫을 수 있을까.
이전에 SQL Injection 에 대한 공부를 할 적에, Real World 환경에서의 SQL Injection 을 테스트 사이트에서 진행한 적이 있었다. DB 시스템에서 사용하는 메타데이터들의 집합, information_schema 를 사용해야 할 것 같다. information_schema 에 대한 내용은 아래에 정리해 놓았다.
https://awes0me.tistory.com/entry/Real-World-SQL-Injection
우리가 information_schema 에서 사용할 테이블은 processlist 이다. processlist 테이블에서는 메모리 사용량(MEMORY_USED_MB), ID, HOST(host ip), USER, INFO(현재 실행 중인 query), TIME_MS(소요 시간) 등, query 실행과 관련된 주요 데이터 column 들이 옹기종기 모여있다.
우리가 써야 할 것은 바로 INFO 이다. INFO의 데이터를 substr 함수를 이용하여 부분적으로 자른다면 select 로 반환할 데이터가 우리가 GET 방식으로 전달한 query 문과 일치할 것이다.
자 이제 게임을 시작해보자. 우리는 information_schema 에서 INFO column 을 이용할 것이다. 그렇다면 query 는 다음과 같은 방식으로 전달해야 할 것이다.
select INFO from information_schema.processlist where user='zombie'
이제 문제의 형식에 맞추어보자.
pw=' union select info from information_schema.processlist where user='zombie'%23
위와 같이 query문의 전체가 return 된 것을 볼 수 있다. 여기서 우리가 작성한 부분만 substr 함수를 이용하여 잘라주면 될 것 같다.
pw=' union select substr(info,38,90) from information_schema.processlist where user='zombie'%23
주석 문자 '#'을 전달할 때에는 '%23'으로 입력하지만 실제 query 문이 처리될 때에는 '#'이므로 계산에만 유의하면 된다.
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - ouroborus (0) | 2021.10.02 |
---|---|
Lord of SQL Injection - alien (0) | 2021.10.02 |
Lord of SQL Injection - frankenstein (0) | 2021.09.01 |
Lord of SQL Injection - phantom (1) | 2021.09.01 |
Lord of SQL Injection - red_dragon (0) | 2021.08.29 |