(Lord of SQLInjection) goblin 문제입니다.
문제사이트에 접속하면 일단 소스코드부터 해석해봐야 겠죠?
첫 필터링은 이전 문제들과 같은 필터링으로 DB공격을 막는건데
다음 필터링이 새로보는 문제입니다.
' " `를 막는 필터링입니다.
즉 이전문제에서 사용한
' -- and pw=' ' 같은 형태는 어렵다고 해석이 가능합니다.
게다가 쿼리를 자세히보면
where id ='guest' and no= 형태로
id값은 guest로 고정되어 있는데 우리가 접속해야하는 id는 admin 입니다.
이부분이 힌트이자 문제인데
우리는 no만을 입력해야하지만
and 형태로 연결되어 있으므로 다른 방식이 가능합니다.
T and F or T 형태 인데요
and 는 T T 일때 T를 출력하는데
or 은 T F 일때도 T를 출력하는 방식을 이용한 공격입니다.
(자세한 공격기법 이름이 기억안나는데 좀더 공부를 해야겠습니다.)
이를 이용하면 id=guest and pw=1 or id=admin 형태로 작성이 가능한데
id값 guest는 T
pw값은 우리가 임의로 정한 1이기에 F
id값 admin으로 접속하라고 했기에 존재하는 아이디이므로 T가 출력됩니다.
그럼 인젝션 해보겠습니다.
어째서 인지 접속이 실패했습니다.
그래서 하나씩 구문을 입력하다
이런 어처구니 없는일이...SQL에서 1은 True값으로 치환될 수 있다는 걸 잊었습니다.
그래서 앞의 구문이 T로 실행되어 뒤의 or 구문이 실행되지 않았던 것입니다.
그러면 F를 출력가능한 0으로 대입해 다시 해보겠습니다.
어째서인지 로그인에 실패했습니다...
좀더 검색을 해보니 SQL에서는 문자열을 입력할때는 변수이름 = ' ' 형태로 입력해야 한다는 것을 찾았습니다.
그러나 우리는 ' ' 가 필터링 되어 있어서 막혀있는 상황입니다.
이러한 경우의 우회방법을 찾아보니 문자열을 16진수로 바꿔 입력하는 방법이 있었습니다.
즉 id=0x~~~~ 형태로 입력하면 16진수를 자동으로 치환해 값을 읽어
문자열 입력 필터링의 우회가 가능해집니다.
그럼 admin의 16진수 값부터 찾아야해서 변환기를 사용했습니다.
admin의 16진수 값은 0x61646d696e 이라는 군요
URL의 입력시에 꼭 0x를 붙혀 16진수라고 표현을 해줘야 합니다...
작성자는 실수로 안해서 5분가량 삽질했습니다.
그럼 최종 구문 no=0 or id=0x61646d696e
로 인젝션 해보겠습니다.
문제가 해결되었습니다!
'Wargame(Web) > Lord of SQLInjection' 카테고리의 다른 글
(Lord of SQLInjection) darkelf문제 (0) | 2022.08.16 |
---|---|
(Lord of SQLInjection) wolfman문제 (0) | 2022.08.16 |
(Lord of SQLInjection) orc 문제 (0) | 2022.08.12 |
(Lord of SQLInjection) cobolt 문제 (0) | 2022.08.01 |
(Lord of SQLInjection) gremlin 문제 (0) | 2022.08.01 |