Lord of SQL Injection 포스팅을 이번 주까지 마무리하려 그랬는데, 남은 3개의 문제가 비 관계형 데이터베이스 문제이다. 필자가 이걸 할 줄 몰라서 배우고 오려면 시간이 조금 걸릴 거 같다. CEH시험 바우처가 얼마 안 남아서 5월에 시험을 계획하고 있는데, 이후에 남은 문제들을 정리하려고 한다.
코드에 따르면 mssql기반의 문제이다. GET파라미터로 전달될 id와 pw에 대해서 master와 information을 필터링하고 있다. 그 후 table인 member에서 id를 query 해서 결과를 echo 하고, pw로 전달된 값이 $krakenFlag로 나오면 된다.
* 주석으로 flag는 member테이블이 아닌 'flag_{$hash}'의 테이블에 있다고한다. 메타 테이블에 접근을 해야 되겠다.
해결방법
Answer Url : los.rubiya.kr/chall/XXXX.php?pw=FLAG
if($result ['id'])라는 조건이기에, id가 있기만 하면 되는 거여서 union을 통한 조작이 가능하다.
또한 저번 문제를 기억하는 사람들은 이번 메타 테이블 접근에 sys가 필터링이 안되어있는 것을 눈치챘을 것이다.
mssql에는 "sysobjects"라는 메타 테이블이 존재한다. "sysobjects"에는 DB에서 생성된 개체들의 모든 정보가 들어있다. 그중 xtype과 type에는 각 개체의 유형을 저장하고 있는데, 그중 우리는 "U"타입(사용자 테이블)을 가져올 것이다.
try : ?id=1' union select name from sysobjects where type='U'--%20
으흠; 역시 호락호락하지 않다. a_dummy_table이라는 테이블이 행으로 있는 거 같다. 간단한 막일로 처리하자
try2 : ?id=1' union select name from sysobjects where type='U' and name like 'flag%'--%20
그렇다. 물론 이와 같은 방법 말고 깔끔한 방법도 많을 것이다. flag_table은 알았으니 테이블에서 정보를 빼보자.
try3 : ?id=1' union select * from flag_ccdfe62d--%20
이렇게 flag를 알 수 있었다.
mssql의 메타 테이블인 sysobjects에 대해서 알 수 있는 문제였다. 이제 다음 관문으로 넘어가자
이번에는 미라다. 수많은 용들과 전설 속의 네스호의 괴물까지 무찌르고 만난 것이 고작 미라라는 게 조금 김 빠지는 이야기이다. 코드를 만나보자
< 출처 : 위키백과 https://en.wikipedia.org/wiki/Mummy >
코드
mssql 기반의 문제이다. query로 받아오는 파라미터에 대해서 master, sys, information등 메타 테이블의 접근을 필터링하고 있다. 그 후 가져온 query를 길이에 맞게 반복 순회를 하면서 query에서 ord값이 32 이하인 문자가 발견되면 exit을 사용한다. 그 후 파라미터로 날아온 query에 대해서 직접 $result를 받아와서 결과적으로는 정확한 pw를 요구하고 있다.
저번 레버넌트와 같은 mssql문제이다. id와 pw에 대해 master, sys, information 등 메타 테이블 접근을 차단한 것이 눈에 띈다. admin의 정확한 pw를 알아야 하는 걸 봐서 blind sql injection을 시행하거나, 새로운 방법을 시도해야 될 거 같다.
일단 어째 $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
이제 진짜 끝났다. 딱 대
허튼짓이란 허튼짓은 다해 두고 문제를 풀었다. 여러분들은 똑똑하게 문제를 풀었기를 바란다.