LOS : https://los.rubiya.kr/
✔️ 문제
문제는 다음과 같다.
✔️ 풀이
풀이를 위한 코드는 다음과 같다.
if(($result['pw']) && ($result['pw'] === $_GET['pw'])) solve("ouroboros");
패스워드만 찾아내면 되는 간단한 문제라고
생각이 들기에는 단계가 높아진 상태인데,
페이로드를 다 넣어봤지만, 아무것도 되는게 없었다.
이번에는 union 필터링이 없으니까 한번 넣어보았다.
단서를 하나 얻었다.
조회를 하게 되면 pw 값이 내가 입력한 select 1이 출력되는 것을
확인할 수 있는데 이는 위에서 본 것처럼 pw가 존재하지 않기 때문이다.
그렇다면, pw 값을 입력($_GET['pw'])하면서 동시에 $result['pw']와
어떻게 어떤 방식으로 일치하게 만들 수 있을까?
사용자가 전달하는 값과 쿼리의 결과 값이 같은지에 대한
검사 로직이 존재할 때 이를 악용할 수 있는 sql injection 방법이 존재했다.
바로 Quine SQL Injection이라는 것이다.
Quine은 소스코드를 그대로 출력으로 반환하는 프로그램을 의미한다고 한다.
자세한 내용은 https://aboutsc.tistory.com/147 글과
https://aidencom.tistory.com/325 글을 참고하였다.
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 sql 구문을 활용해서 문제를 풀어야 하는데,
union이 사용가능한 해당 문제에서는 ' union select [Quine] # 과 같은
페이로드로 구성할 수 있게 된다.
그렇다면 해당 위에 나온 구문에 select 앞에 ' union을 붙혀주고,
총 3개의 select 구문 뒤에 #을 붙혀주어서 페이로드를 완성해보자.
주의할 점은 replace 구문의 싱글쿼터 내부는 더블쿼터로 완성해야한다.
' union select replace(replace('" union select replace(replace("$",char(34),char(39)),char(36),"$") #',char(34),char(39)),char(36),'" union select replace(replace("$",char(34),char(39)),char(36),"$") #') #
이제 해당 구문을 url encoding하여 pw로 날려보자.
우리가 입력한 pw와 result에서 받은 pw가 일치하면서
문제가 풀리게 된다.
이에 대한 이해는 다음 글을 보면서 더욱 자세하게 이해가 가능하다.
sql injection의 기법이 더 다양하다는 것을 느끼게 된 문제였다.
화이팅 💪
'보안 > LOS' 카테고리의 다른 글
[LOS] phantom (0) | 2023.01.04 |
---|---|
[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 |