LOS : https://los.rubiya.kr/
✔️ 문제
문제는 다음과 같다.
지금까지 본 문제 중에서 가장 긴 코드인 것 같다.
✔️ 풀이
풀이를 위한 코드는 다음과 같다.
if(($result['email']) && ($result['email'] === $_GET['email']))
{ mysqli_query($db,"delete from prob_phantom where no != 1"); solve("phantom"); }
보이지 않는 이메일을 입력하면 되는 문제로 보인다.
해당 이메일을 입력하면 no가 1이 아닌 것을 삭제하면서 solve가 되는데..
일단 joinmail을 받을 때, duplicate 라는 문자열을 필터링 하는 것으로 보이고,
insert into 에 해당하는 삽입을 하는 것으로 보인다.
no=1 또는 ip가 $_SERVER[REMOTE_ADDR] 인 것을
현재 테이블로 보여주는 것이고,
그 뒤에 쿼리문에서 email을 조회하는 것으로 보인다.
email은 일치해야하는 값이고, 현재 조작할 수 있는 구문은
joinmail인데 내 주소와 함께 insert 구문이 동작하고 있다.
예를 들어서 joinmail에 test@test.com 이라는 값을 넣어주게 되면,
내 공인 ip와 함께 데이터가 삽입되는 것을 확인할 수 있다.
insert into에 서브쿼리를 작성해서 날리는 생각까지 했는데,
제대로 동작하지 않아서 서브쿼리에 대한 내용을 일부 찾아보았다.
mysql은 자기 테이블의 데이터를 직접 사용할 수 없기 때문에
특정 타겟으로 하는 데이터를 업데이트 할 수 없다.
그렇기에 서브쿼리 안에 실제 테이블의 데이터를 alias 별칭을
이용하여 넣어줌으로써 insert 구문을 실행시킬 수 있다고 한다.
또한, values로 받고 있는 insert 구문의 서브쿼리에
여러 서브쿼리를 입력할 수 있으므로 아무 데이터나 우선 입력하고,
뒤에 추가적인 서브쿼리를 작성하는 형태로 날리면 동작하게 된다.
(참고1) https://m.blog.naver.com/withrubiya/70173349773)
(참고2) https://blog.limelee.xyz/entry/LOS-phantom)
해당 방식이 아니고도 if(length((select ~~))>3,1,0)) #
등과 같은 페이로드를 통해 이메일의 길이와 blind를 수행할
스크립트를 작성하여 해결할 수도 있을 것 같다.
서브 쿼리에 대한 활용과 페이로드의 구성을
좀 더 많이 그리고 깊게 공부할 필요가 있어보인다.
화이팅 💪
'보안 > LOS' 카테고리의 다른 글
[LOS] ouroboros (0) | 2023.01.05 |
---|---|
[LOS] frankenstein (0) | 2023.01.04 |
[LOS] blue_dragon (0) | 2023.01.02 |
[LOS] red_dragon (0) | 2023.01.02 |
[LOS] green_dragon (0) | 2022.12.29 |