[LOS] 28번 문제 풀이(phantom)

최대 1 분 소요

💡 los.rubiya.kr 28번 문제에 대한 풀이입니다.

28번(phantom)

문제

image

풀이

joinmail 값에 들어온 값을 통해서 email정보를 저장하는 기능을 하고 있습니다. 이때, joinmail 변수에 필터링이 충분히 걸려있지 않습니다. 우선 joinmail에 test값을 넣으면 다음과 같이 email에 test값이 들어갑니다.

image

이제 insert 문을 인젝션 하여 원하는 값을 email에 추가적으로 넣는다면 db에 있는 정보를 빼올 수 있습니다.

본 문제에서는 no=1에 해당하는 email을 찾아내면 클리어 할 수 있습니다.

다음과 같이 insert 되는 email의 내용을 prob_phantom 테이블에서 no=1인 이메일정보를 가져와서 넣으면, no=1인 이메일 값을 알 수 있습니다.

insert into prob_phantom values(0,'58.122.121.25','test'),(0,'58.122.121.25',(select email from prob_phantom as t where no=1))%23')

이때 주의할 점은 수정이나 삽입을 할 테이블 내에서, 서브 쿼리로 해당 테이블의 정보를 불러와서 사용하고 싶을때는 위의 쿼리문 처럼 별칭을 이용해서 테이블을 불러와야 합니다.(as t)

그렇지 않고 바로 불러오게 되면 다음과 같은 오류가 나옵니다.

![image](https://user-images.githubusercontent.com/33647663/160226854-728f250d-8d77-4c84-b04e-c82a3aca82b9.png) ![image](https://user-images.githubusercontent.com/33647663/160226874-c80051c5-6b9c-4f51-89a5-a04dca19393a.png) 그래서 위의 쿼리를 통해서 insert injection을 수행하면, 테이블 내에 있는 no=1의 이메일 값을 성공적으로 알아낼 수 있습니다. ![image](https://user-images.githubusercontent.com/33647663/160226886-3dcbd257-26f9-4624-b1b8-3d1833350ad7.png) email = admin_secure_email@rubiya.kr ![image](https://user-images.githubusercontent.com/33647663/160227027-50c64204-c52d-49a6-a64d-03cd3e36ed43.png)

댓글남기기