[30] ouroboros
문제
풀이
쿼리의 결과와 사용자의 입력값이 일치하는 지 검증하는 문제다.
pw를 찾아내면 쉽게 풀 수 있는 문제이기 때문에 아마 테이블 내부에 pw 값이 없을 것 같았다…
확인을 위해 where절을 True로 만들어줄 수 있는 쿼리를 주입해보았다.
테이블에 pw가 있다면 값이 뜰텐데… 감감무소식이었다.
아무래도 예상했듯 테이블에 pw가 없는 것 같았다.
다음은 union을 사용해 1을 기존 테이블에 붙여보았다.
이런 식으로 pw를 넣어주면 될 것 같은데…
문제는 쿼리의 결과인 pw 값과 사용자 입력값이 같아야한다는 점에 있다.
어떻게 해주면 될 지 답이 안나와서 힌트를 서치해보았다.
답은 Quine이었다.
Quine이란 자기자신의 소스 코드를 그대로 반환하는 프로그램을 말한다.
Sql로도 Quine을 만들 수가 있는데, 사실 직접 로직을 생각해내는 것 보다는 서치의 힘을 빌려야하는 것 같다.
다음은 대표적인 Quine Query의 예시다.
1
SELECT REPLACE(REPLACE('SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$")',CHAR(34),CHAR(39)),CHAR(36),'SELECT REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$")');
이를 적용하여 만든 최종 쿼리문은 다음과 같다.
1
'union select replace(replace('"union select replace(replace("$",char(34),char(39)),char(36),"$")%23',char(34),char(39)),char(36),'"union select replace(replace("$",char(34),char(39)),char(36),"$")%23')%23