어떤 문제를 풀다가 이상한 논리에 막혔다.
일단 30번 문제 ouroboros다. 빈 테이블이라는 것은 어찌저찌 시도하다가 알아냈고 union을 시도할 수 밖에 없다는 것은 알았으니 풀이를 하려면 union으로 넘겨준 비밀번호와 내가 입력한 비밀번호가 같아야 한다.
내 나름의 머리를 굴렸으나 애초에 말이 안 된다. union으로 넘어간 비밀번호는 impossible. 내 입력으로 넘겨준 비밀번호는 impossible' union select 'impossible'--+ 였으니
뭐 지금까지 풀면서 고려한 쿼리가 전혀 쓸모가 없었다. 할 수 있는게 없었다.
구글링을 계속 한 끝에 해결책을 제시해줄 수 있는 글을 찾았다.
SQL Injection & Quine
Quine은 자기 자신의 소스코드를 출력하는 프로그램이다. 이거 자체에 대해서는 위키에 잘 설명되어 있으니 개념적인 부분은 넘어간다.. 사용할 수 있는 경우가 그리 많지 않기 때문에 real world에
mineta.tistory.com
(감사합니다 ㅠㅠ 진짜로 지금 죽을 것 같아요)
Quine? 처음 들어본다. 입력 없이 자기자신의 소스 코드를 스스로 출력하는 프로그램이라고 한다. 이게 뭐람
지금도 작성하면서 연습중이다. 내가 프로그래밍에 하자가 있는건지 원래 어려운건지 상당히 난이도가 있다.
혼자 Quine을 연습해 본 결과들이다. formatting을 어떤 것으로 하느냐에 따라 결과도 상이하게 나왔다. (짱 신기함)
아무리 봐도 원래 출력되지 않는 코드들이 출력에 나오는게 진짜 신기했다. 물론 저기서 제대로 quine이 적용된 건 q 밖에 없지만 연습하느라 코드가 어떻게 동작하고 무슨 의미가 있는지 알 필요는 있었다 ㅎㅎ..
와 갑자기 알겠다. 왜 30번 문제가 ouroboros 인지 ㅋㅋㅋㅋㅋㅋ 진짜 똑똑한 것 같다 만든 사람 ㅠㅠ
그럼 이제 SQL 에서 Quine을 사용해보자! (참고로 SQL에서는 좀 더 길고 빡세다)
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),"$")')
?? 누구세요
대표적인 Quine query라고 하는데 어.. replace가 굉장히 많이 보인다. 하나하나 살펴보..기전에 이거 쿼리 색깔 내 맘대로 못하나요?? 난 그런 재주는 없으니 패스하고 설명하면 replace 함수가 바깥쪽에 하나, 안쪽에 하나가 있다. 안쪽의 replace가 먼저 실행된다.
replace('select replace(replace("$",char(34),char(39)),char(36),"$")',char(34),char(39))
우선 이 부분이 제일 안쪽 부분이다. 더 안쪽에 select 문으로 있는 거 아니냐! 라고 할 수 있겠지만 사실 이거 보시는 대부분이 저건 그냥 문자열이라는 것 쯤은 알고 계실 것이다.
초록색으로 칠해진 문자열에서 replace 함수를 사용하는데 char(34)인 " 따블 쿼리를 char(39)인 ' 싱글 쿼리로 만드는 쿼리이다. 저 쿼리로 아래와 같은 문자열이 만들어진다!
select replace(replace('$',char(34),char(39)),char(36),'$')
그럼 첫 번째 치환된 결과를 가지고 전체 쿼리를 다시 보면
select replace('select replace(replace('$',char(34),char(39)),char(36),'$')',char(36),
'select replace(replace("$",char(34),char(39)),char(36),"$")');
이와 같이 된다. 그럼 이제 최종적으로 바깥쪽의 replace 함수가 실행되면 char(36)인 $ 기호가 문자열 select replace(replace("$", char(34),char(39)),char(36),"$") 로 치환된다. 이게 진짜 뭐람;; 저기 $ 기호에 대입을 해보면
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),"$")')
진짜 원래 문자로 돌아왔다. 어지럽다.
위는 mysql에서 실제로 넣어본 쿼리 결과이다. 잘 안보이므로 클릭!!
select 문으로 결과를 넣었기 때문에 select는 제외하고 replace부터 나오는게 정상이나 Quine query에 의해 다시 돌아왔다.
'SQL Injection' 카테고리의 다른 글
MySQL - Metadata / Processlist Quine (0) | 2022.11.17 |
---|