[TryHackMe] SQL Injection - 2.3

코준·2025년 7월 14일

TryHackMe

목록 보기
26/32

Time Based Blind SQLi

시간 기반 블라인드 SQL 인젝션은 boolean 기반 인젝션과 유사하다.

리퀘스트는 같지만, 쿼리가 맞았는지, 틀렸는지에 대한 시각적인 지표가 없고 쿼리의 완료 시간에 대한 정보만 있다.

자주 쓰였던 UNION명령어와 함께 SLEEP(x) 같은 내장 함수를 사용하면 알 수 있다. 해당 함수는 UNION SELECT 구문이 성공적으로 실행될 때만 실행되기 때문이다.

5초의 시간을 정지하지 않고 시간이 측정된다면, 쿼리가 성공적이지 못하다는 것으로 판단할 수 있다. OK가 보여도말이다.

그럼 column의 수를 늘려서 확인할 수 있는데, 정확히 5초가 추가된 것을 알 수 있다.
실제로 응답이 5초가량 늦게 뜬 것을 확인했다.

그래서 이걸로 뭘 확인할 수 있느냐, 앞서 boolean 인젝션에서 한 것처럼 테이블 이름을 찾거나 유저의 이름, 비밀번호 등을 찾을 때 해당 구문을 같이 쓰는 형식으로 응답을 대신하는 셈 칠 수 있다.

sqli_까지 찾고 현재 레벨이 4이므로 four를 추가했더니 우연히 맞았다.

referrer=admin123' UNION SELECT SLEEP(1),2 FROM information_schema.tables WHERE table_schema = 'sqli_four' and table_name like 'a%';--

이제 테이블의 이름을 알아내야하므로 검색하자 a로 시작하는 것 같다.

테이블 이름이 analytics_referrers인데, 우리는 로그인이 하고 싶으니까 뭔가 사용자의 아이디나 username같은 정보가 있는 테이블이 있어야한다.

그래서 analytics_referrers 를 제외하고 테이블을 찾는데 u로 시작하는 테이블이 있다.

referrer=admin123' UNION SELECT SLEEP(1),2 FROM information_schema.tables WHERE table_schema = 'sqli_four' and table_name = 'users';--
sqli_four 데이터베이스의 users 테이블을 찾았다.

결국 username column을 찾았는데, 테이블이 여러개인 상황에서 정보의 위치를 파악한다는 것은 추측에 기반하거나 결국 하나하나 찾는 노력에 기반한 것이다.

admin이라는 유저를 찾았고, 비밀번호만 찾으면 될 것 같다.
적어놓지는 않았지만 테이블의 필드는 id, username, password를 찾았고, 전 문제와 같았기 때문에 username, password로 로그인을 시도해본다.

(중략)

유저의 이름이 admin이며 비밀번호는 4961인 아이디를 찾았다.

profile
Hi !

0개의 댓글