-
[L.O.S] Level 22 - dark_eyesWargame/L.O.S 2022. 12. 12. 19:43반응형
Level 22 - dark_eyes를 풀어보자.
문제의 코드를 보면 앞의 iron_golem에서 col과 if, case, when이 추가로 필터링된다.
비슷한 문제인 듯 하니, 이번에도 참과 거짓을 통한 에러를 이용하면 되지 않을까??

<dark_eyes의 php 코드 내용> 우선 에러가 나도록 입력을 해보자.
pw에 싱글쿼터(')만 입력을 했더니, 빈 페이지가 나왔다.
이번 문제는 mysqli_error 시 빈 페이지로 exit를 하도록 설정되어 있다.

<에러 시 빈 페이지 출력> 그리고 앞의 문제와 마찬가지로, 참을 입력해도 출력되는 문구가 없다.
이번에는 if 문을 사용하지 못하는데 어떻게 해결을 해야될까??
(case ~ when도 if 문과 비슷하게 활용할 수 있지만 여기에서는 사용할 수 없다.)

<참 입력 시 화면> 앞의 문제는 if 문을 활용해 참과 거짓일 때, 에러와 정상을 표현했다.
이번에는 참과 거짓과는 상관없이 에러와 정상을 표현해 문제를 해결하도록 하자.
필요한 것은 조종할 수 있는 에러문이다.
여기서 조종할 수 있다는 것은, 수를 통해 길이를 구하고 문자를 표현할 수 있어야 한다는 것이다.
이것을 위해 사용할 것은 union select 이다.
아래의 사진을 보면 (select 1 union select 1) #을 입력하였다.
이것을 입력하면 sql 내부에서는 Table에서 1을 select하여 Column의 한 Row에 1을 출력한다.
(or는 where 절에 대한 것으로 앞의 id와 pw는 거짓, 뒤의 id와 select는 참이므로 뒤의 입력이 표현된다.)

<union select를 이용한 정상 입력> 이것은 select와 union select에서 구하는 것이 모두 1이기 때문이다.
중복되는 Row는 합쳐져 하나만 표현을 하는 것이다.
이번에는 (select 1 union select 2) #을 입력하면 에러로 인해 빈 페이지가 나타난다.
1과 2는 중복되지 않기 때문에 1과 2의 두 개의 Row가 표현이 되면서 생기는 에러이다.
(원래 에러 구문은 'Subquery returns more than 1 row'로 서브쿼리에서는 값이 한 줄을 넘으면 안된다.)
union all을 사용하면 조금 더 이해가 쉬울 것이다.
union all select는 중복되는 Row도 모두 표현을 한다.
아래의 사진을 보면 (select 1 union all select 1) #을 입력했는데 에러가 발생하였다.
이것은 1로 된 두 개의 Row가 출력되면서 발생한 에러이다.

<select 1 union select 2의 에러> 
<union all select의 에러> 문제의 원리는 알았으니, 코드를 작성해 빠르게 문제를 해결해보도록 하자.
pw의 길이를 구할 건데, select와 union select의 값이 다를 때, 길이가 늘어나도록 구성하자.
그 후 아무 문구가 포함된 페이지가 나타났을 때의 길이가 pw의 길이가 되도록 한다.
코드를 실행하면 pw의 길이로 8이 나온다.

<pw의 길이 코드> 이제 pw의 값을 구하면 되는데, 마찬가지로 select와 union select를 이용해 구하면 된다.
아래의 사진에서 나오듯 pw의 값은 '5a2f5d3c'라고 한다.


<pw의 값> 페이지로 돌아와 pw에 구한 값을 입력하면 DARK_EYES Clear!가 출력되며 문제가 해결된다.
반응형'Wargame > L.O.S' 카테고리의 다른 글
[L.O.S] Level 24 - evil_wizard (0) 2022.12.17 Level 23 - hell_fire (0) 2022.12.14 [L.O.S] Level 21 - iron_golem (1) 2022.12.09 [L.O.S] Level 20 - dragon (0) 2022.12.08 [L.O.S] Level 19 - xavis (1) 2022.12.07