Wargame(Web)/Lord of SQLInjection

(Lord of SQLInjection) godzilla 문제

P_Squirrel 2022. 12. 1. 13:23

(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를 문제사이트 전달해보면

문제가 해결되었습니다!

댓글수0