(Lord of SQLInjection) frankenstein 문제입니다.
먼저 필터링을 살펴보면 prob , _ , . , ( , ) , union 을 필터링 하고 있습니다.
다음으로 코드를 보면 위 코드와 아래코드로 나뉘어 있으며 위 코드에서는
frankenstein으로 id가 고정되어 있지만 아래코드에서 문제해결을 위해서는
id=admin 이면서 pw의 값을 정확히 일치해야만 문제가 해결된다고 합니다.
일단 id를 admin으로 변경해야 했기에
?pw=' || id='admin' and ?
위 구조처럼 pw에서 싱글쿼터(')로 먼저 id='admin'을 작성했습니다.
위코드에서 가장 아래쪽 if문을 살펴보면 error발생시 error을 출력해준다고 합니다.
이부분이 Error Based SQL 인젝션을 이용하라는 힌트입니다.
이전 Los문제에서 Error를 활용한 문제를 경험해봤기에 9e307*2를 이용해 에러를 발생키면 됩니다.
코드를 구성해보면
?pw='||if(id='admin' and length(pw)=?, 9e307*2, 0)
if문을 활용 하면 위와 같이 작성할 수 있습니다.
그러나 문제의 필터링을 보면
if(preg_match('/prob|_|\.|\(|\)|union/i', $_GET[pw])) exit("No Hack ~_~");
괄호가 필터링되어 있어 if()와 length()같은 함수를 활용하는데 문제가 생깁니다.
해서 이를 우회하기 위해
각각 case when문과 Like를 활용합니다.
Like는 비교연산자로써 < > = 등을 활용하는 것이 가능해 이전 문제에서 활용한 적이 있습니다.
위 내용을 토대로 코드를 구성해보면 아래와 같이 구성할수 있습니다.
?pw='||case when id='admin' and pw like '?%' then 9e307*2 else 0 end%23
%라는 Like의 와일드카드를 활용한 구조인데
pw의 값이 123456일때 '1%' 을 넣게되면 와일드카드로 1로 시작하는 값이라는 의미가 되어
비교했을때 true 를 출력시키게 되고 True이므로 9e307*2 에러를 발생시키는
구문이 실행되어 이를 활용한 pw를 찾아내는 코드입니다.
현재는 패스워드의 값도 길이도 모르는 상황이기에 반복하기 위해 파이썬으로 코드를 작성해보면
위와 같이 작성할 수 있습니다.
여기서 j==95를 continue한 이유는 아스키 코드 95를 확인해보면
언더바(_) 로써 Like의 와일드카드중 하나 이지만 코드에서 _ 를 필터링 하고 있기에
No Hack에 걸리기 때문에 이를 제외시키는 쪽으로 코드를 작성했습니다.
마지막으로 URL인코딩으로 %는 예약어 이므로 그대로 작성시에 정확한 전달이 되지 않습니다.
(이것 때문에 2시간 정도 고생했습니다...)
%를 URL 인코딩을 하면 %25가 되므로 %25로 작성해 코드를 작성했으며
현재 pw의 길이를 알수가 없기에 예상치로 10을 먼저 잡았습니다.
작성한 코드를 실행시켜 보면
8글자에서 더이상 출력되는 것이 없는 것으로 패스워드8자리를 찾았습니다
찾은 패스워드를 문제사이트에 제출해보면
문제가 해결되었습니다.
여러가지 부분에서 경험이나 감을 활용한 부분이 많아 추후 학습한뒤 추가로 작성하도록 하겠습니다.
'Wargame(Web) > Lord of SQLInjection' 카테고리의 다른 글
(Lord of SQLInjection) ouroboros 문제 (0) | 2022.11.21 |
---|---|
(Lord of SQLInjection) phantom 문제 (0) | 2022.11.21 |
(Lord of SQLInjection) blue_dragon 문제 (0) | 2022.11.17 |
(Lord of SQLInjection) red_dragon 문제 (0) | 2022.11.13 |
(Lord of SQLInjection) green_dragon 문제 (0) | 2022.10.28 |