(Lord of SQLInjection) godzilla 문제입니다.

제공되는 코드를 살펴보면 자주 봐왔던 pw를 찾는 문제입니다.
if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("godzilla");
DB에 저장된 pw와 쿼리에 전달한 pw가 일치하면 해결되는 문제입니다.
이전 cthulhu문제부터 CRS 방화벽이 걸려있었고
death문제는 CRS라는 언급이 없었지만 걸려있었기에
이번 문제도 CRS가 걸려있다는 전제로 문제를 풀었습니다.
이전 문제를 풀때 사용했던 값을 가져와 쿼리에 전달해보면

admin을 출력하는 것에는 성공했습니다.
하지만 우리가 찾아야 하는 것은 id가 admin인 값의 pw입니다.
이전 LOS문제를 풀때 사용했던 substr()과 length() 함수를 이용해 payload를 구성해보면
id=-1'<@=1 OR id!='guest' and {a%201}=1 and length(pw)>1 OR '
위와 같은 payload로 구성할 수 있습니다.
값을 전달해보면

pw의 길이를 찾을수 있게 되었습니다.
위 내용을 이용해 substr()과 length()로 파이썬 코드를 구성하면
아래와 같이 구성이 가능합니다.

쿼리에 전달할 값만을 보면
?id=-1%27<@=1%20OR%20id!=%27guest%27%20and%20%7ba%201%7d=1%20AND%20length(pw)={l}%20OR%20%27
?id=-1%27<@=1%20OR%20id!=%27guest%27%20and%20%7ba%201%7d=1%20AND%20ascii(substr(pw,{i},1))={j}%20OR%20%27
id='-1' <@=1 로 False를 OR로 연결해
id!='guest' id가 guest가 아니면서(and) {a 1}=1 로 True 이면서(and) length(pw)=?
정리하면 id가 admin인 값의 pw의 길이를 알아내게 됩니다.
substr()을 사용하는 부분도 앞의 조건은 동일하고
length()대신 substr(pw,?,1)로 pw의 각 자릿수에 해당하는 값을 추출한뒤
ascii()함수로 바꿔 48~127까지의 값을 비교해 pw를 찾아냅니다.
작성한 파이썬 코드를 실행시켜 보면

pw의 길이는 8이며
pw의 값은 a18a6cc5라고 합니다.
찾은 pw를 문제사이트 전달해보면

문제가 해결되었습니다!
'Wargame(Web) > Lord of SQLInjection' 카테고리의 다른 글
(Lord of SQLInjection) chupacabra 문제 (0) | 2022.12.04 |
---|---|
(Lord of SQLInjection) cyclops 문제 (0) | 2022.12.03 |
(Lord of SQLInjection) death 문제 (0) | 2022.12.01 |
(Lord of SQLInjection) cthulhu 문제 (0) | 2022.11.30 |
(Lord of SQLInjection) alien 문제 (0) | 2022.11.28 |