Lord Of SQL injection 43단계-yeti
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' 등으로 바꿔줘야한다.