Today I Learned …

[Lord of SQL Injection] 30번 ouroboros 풀이 본문

Wargame/Lord of SQL Injection

[Lord of SQL Injection] 30번 ouroboros 풀이

염베리 2022. 1. 2. 01:54

* 개인적인 공부 내용을 기록한 글입니다.


이전 문제

https://choco4study.tistory.com/127

 

[Lord of SQL Injection] 29번 phantom 풀이

* 개인적인 공부 내용을 기록한 글입니다. 이전 문제 https://choco4study.tistory.com/122 [Lord of SQL Injection] 28번 frankenstein 풀이 * 개인적인 공부 내용을 기록한 글입니다. 사담 와 진짜 처음부터 끝..

choco4study.tistory.com


30번 문제 ouroboros 분석 및 풀이

 

 

30번 문제는 다음과 같다.

 

 

쿼리의 결과와 사용자의 입력값이 일치하는 지 검증하는 문제이다.

pw를 찾아내면 쉽게 풀 수 있는 문제이기 때문에 아마 테이블 내부에 pw 값이 없을 것 같았다...

확인을 위해 where절을 True로 만들어줄 수 있는 쿼리를 주입해보았다.

 

테이블에 pw가 있다면 값이 뜰텐데... 감감무소식이었다.

아무래도 예상했듯 테이블에 pw가 없는 것 같았다.

다음은 union을 사용해 1을 기존 테이블에 붙여보았다.

 

 

이런 식으로 pw를 넣어주면 될 것 같은데...

문제는 쿼리의 결과인 pw 값과 사용자 입력값이 같아야한다는 점에 있다.

어떻게 해주면 될 지 답이 안나와서 힌트를 서치해보았다.

 

답은 Quine이었다.

Quine이란 자기자신의 소스 코드를 그대로 반환하는 프로그램을 말한다.

Sql로도 Quine을 만들 수가 있는데, 사실 직접 로직을 생각해내는 것 보다는 서치의 힘을 빌려야하는 것 같다.

 

다음은 대표적인 Quine Query의 예시이다.

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),"$")');

이를 적용하여 만든 최종 쿼리문은 다음과 같다.

 

'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

 

답을 넣어보면,

 

 

30번 문제가 풀린다.

프로필사진
berry
FE Developer, loves React & better DX
Comments