WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 29 - Phantom

팬텀이다. 그림자라는 뜻도 있고 한 포덕하는 필자에게는 아래팬텀이 더 익숙하다. 코드를 바로 만나보자

 

<출처 : 나무위키 https://namu.wiki/w/%ED%8C%AC%ED%85%80(%ED%8F%AC%EC%BC%93%EB%AA%AC%EC%8A%A4%ED%84%B0) >

 


코드

 

 

다른 문제들에 비해서는 코드가 비교적 긴편에 속하는 거 같다. 일단 SERVER REMOTE_ADDR도 가져오는 거 같고 테이블도 눈에 보이고, 신경 써야 될 부분이 많아 보인다. 아래 delete DML도 보인다.  바로 해결방법을 생각해보자


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?email=admin_secure_email@rubiya.kr

우리가 구해야할것은 no1=인 루프백 ip(127.0.0.1)가 들어가 있는 email값이다.(테이블에서 **********로 나오는 거) 

신기한 건 처음 insert문의 join메일이 들어가는 것에 대한 필터링이 제대로 안되어 있다. 이 소리는 무엇이냐....

insert into ~ values은 values가 여러개 들어갈 수 있다. 이를 이용하여 다음의 시도를 하면 먹힌다!

시도 1 :? joinmail=123'), (44, "My IP", "something")--%20;

*쿼리의 실행결과는 echo "<hr> query : <strong>{$query}</strong><hr>";가 나온 것으로 알 수 있다. 테이블에 출력 안되었다고 당황 말자

 

이를 이용해서 두 번째 values에 something을 admin의 email을 가져오는 서브 쿼리로 넣어주면 된다. 

시도 2 : ?join?joinmail=123'), (957,"My ip",(select email from prob_phantom where no=1))--%20;

응? 안되는 것이 이상하다. 이유인즉슨

같은 테이블에서 insert와 서브 쿼리 select가 일어나면 오류가 발생한다.

 

시도3 : ?joinmail=123'), (958,"My ip",(select email from prob_phantom tb_tmp where no=1))--%20;

 

* no는 계속 바꾸어 써주어야 한다! PK처럼 사용되고 있어서 중복 insert는 허용되지 않는다.

이를 통해 no=1인 email을 알 수 있다.

 

 


이번 문제가 되어서야 드디어 select 말고 다른 dml이 나왔다. 아직 우리는 배울 것이 많다. 다음 관문에서 여러분들을 기다리겠다.