WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 42 - Revenant

레버넌트이다. 영화로도 나왔던 거 같은데; 기억이 잘 안나네... 코드를 확인하자

< 출처 : 몬스터 위키 팬덤 https://monster.fandom.com/wiki/Revenant >


코드

일단 nessie와 비슷한 형태이다. 사실 거의 똑같다. 메타정보와 waitfor 등이 막혀있고, 2가지 쿼리를 쓰지 못하게 세미콜론(;)이 막혀있다. 주석으로는 5번째 칼럼을 pwn 해야 한다고 한다.


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=aa68a4b3fb327dee07f868450f7e1183

일단 어째 $result['4']라는걸보니 칼럼명이 0,1,2,3,4 일거 같은 직감이 든다.(아닌가? 조건절은 또 id니까 아닐 수도 있겠네) 저번처럼 에러 메시지는 웹페이지에 그대로 노출이 된다. 따라서 칼럼명을 확인할 수 있는 에러를 발생시키면 좋을 거 같은데, 가장 무난하고 만만한 방법은 그루핑 함수를 통한 query이다. 다음은 group by에 대한 설명이다.

신기한 점은 그루핑은 행을 특정한 식에 부합하게 압축하는 기능이기에, 그 조건에 부합하지 않는 칼럼이 있으면 동작하지 않는다. 예를 들면 id로는 그루핑이 되어도 다른 칼럼도 그루핑이 지정되지 않으면 오류가 날 수 있다는 점이다.

try : ?id=1' group by id --%20

다음 열인 pw를 찾을 수 있다.

try : ?id=1' group by id,pw --%20

그다음 열은 45a88487이고 그다음 열은 시도 해보면(할 때 45랑 a88487이랑 별도로 해석되니, 큰따옴표로 묶는 게 정신건강에 이롭다) 다음 열은 13477a35이다. 그렇게 해서 5번째 열을 확인하면

try : id=1' group by id,pw,"45a88487","13477a35" --%20

5번째 열은 9604b0c8이다. 이를 Nessie와 같이 문자열 변환 에러를 발생시켜서

try : ?id=1' or "9604b0c8"=1--%20

휴 다들 수고했다.

어? 아; 위에 try에서 id가 admin임을 명시하지 않았기에 3b~는 다른 행의 pw이다. 

try : ?id=admin' and "9604b0c8"=1 --%20

이제 진짜 끝났다. 딱 대


허튼짓이란 허튼짓은 다해 두고 문제를 풀었다. 여러분들은 똑똑하게 문제를 풀었기를 바란다.