2022. 3. 29. 22:42ㆍSite/LOS
이번시간에는 GOBLIN에 대하여 작성하겠습니다
아직 공부하는 입장이니 틀린 것이 있더라도 양해부탁드리겠습니다
소스코드를 보니 $db변수에 db를 연결해서 저장을 하고있고
preg_match함수를 통해 get으로 받은 no값중에 /prob, _, ., (, ) 가 있으면 No Hack ~_~을 출력하고
두번째 preg_match함수는 get으로 받은 no값중에 ', ", ` 가 있으면 No Quotes ~_~을 출력합니다
$query에 prob_goblin 테이블에서 get으로 받은 id값이 guest이고 get으로 받은 id값을 no에 대입하여 일치는 id값을 저장을 합니다. 그리고 $result의 id값이 있다면 Hello result[id]값 출력하고 id값이 admin이라면 클리어입니다
정리하면 이번에는 모든 쿼터부분을 필터링하기 하고
admin의 id값을 알아내는것이 핵심인 것 같습니다...
먼저 no에 1을 주었습니다
그랬더는 Hello guest라고 출력이 됩니다
-> guest의 id값 = 1 인 것을 확인
이번에는 no에 0을 입력했는데 아무것도 출력이 안되네요
-> 0값을 가진 id가 없다는 것을 확인
지금까지를 정리하면은 0값을 가진 id는 없고 1은 guest의 id값인 것을 확인했습니다
여기서 좀 생각을 해봤는데 이 문제를 풀기위해서는 admin의 id값이 필요한데 관리자가 db를 생성할때 guest의 id가 1이라면 admin의 id값도 순차적으로 근처에 있지 않을까라고 생각이 들었습니다
따라서 admin의 id값을 2로 가정을 하고 no=0 or no=2 라는 쿼리를 입력하겠습니다
이렇게 되면은 where id='guest' and no=0 or no=2 쿼리문이 작성이 됩니다
이미 guest로 정해진 id값은 바꿀 수 없으므로 쓰레기 값으로 확인한 0을 no에 넣어주면은 당연히 guest의 id값 1과 일치가 되지않으므로 false값이 나올겁니다
where id='guest' and no=0 or no=2
위처럼 false값을 넘기고 or 연산자에 들어와 이하에 있는 no=2을 true값으로 반환하여 admin의 id값이 추출될 것 같습니다
공백에 url인코딩값 %20을 넣어주어 url에 작성하니 클리어 되었습니다
cf) webhacking.kr level 18[old] 문제랑 비슷한 원리인 것 같습니다