SQL injection/lord of SQL

Lord Of SQL injection 43단계-yeti

ys.k 2022. 2. 22. 02:36

LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.

43단계 소스코드이다.

id와 pw를 파라미터로 받으며 메타데이터에 접근하지 못하도록 필터링 되어있다.

이번엔 에러를 표출하지않는다. 따라서 에러기반 주입은 진행할 수 없다. 

하지만 필터링에서 시간기반 명령어들은 필터링 되어있지 않기에 힌트정도는 얻을 수 있다.

입력받은 pw와 id가admin인 pw가 일치하면 문제는 해결된다.

이제 풀어보자

이번에도  문제는 mssql환경에서 진행된다.

일단 pw길이부터 추출해보자

쿼리: ?pw='if(len((select pw from prob_yeti where id='admin'))=8)waitfor delay'0:0:3'--+-

pw의 길이는 8이다.

하지만 이 과정에서 오랜 시간이 걸렸다.

그 이유는 바로 두 쿼리의 차이에 있다.

정답쿼리: ?pw='if(len((select pw from prob_yeti where id='admin'))=8)waitfor delay'0:0:3'--+-

오답쿼리: ?pw='if(len(select pw from prob_yeti where id='admin')=8)waitfor delay'0:0:3'--+-

차이를 논리적으로 구분할 수 있나?

나는 못했다.

글을 작성하는 지금도 무슨 차이가 있는지 모르겠다.

그냥 len()을 소괄호로 한번 더 감싸준 것 뿐인데 왜 결과가 달라지는지 모르겠다.

아마 mssql의 문법에서 발생한 문제같다.

일단 문제해결에 초점을 두자.

이제 pw값을 추출할 차례이다.

쿼리: ?pw='if(ascii(substring((select pw from prob_yeti where id='admin'),1,1))>1)waitfor delay'0:0:2'--+-

위 쿼리를 기본으로 삼아 인젝터를 작성한다.

6425b725가 정답이라 출력되었다.

문제해결!

시행착오

1. 일단 mssql는 문법공부를 조금 더 해야겠다. substr() -> substring(), length() -> len(), sleep() -> waitfor delay '0:0:2' 등으로 바꿔줘야한다.