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

 

etc-image-0


Blind SQL Injection

 

administrator의 비밀번호를 획득하면 문제 해결

테이블명은 users, 컬럼명은 username, password, 사용자 계정은 administrator

패스워드는 알파벳 소문자와 숫자로만 구성되어있음

정상적으로 실행될때는 Welcom back 문구를 포함하고 있음

[기본 설정] 프록시 설정, ACCESS THE LAB의 주소를 Burp Suite에 설정

 

(1) burp suite에서 패킷을 확인합니다.

쿠키를 보면  TrackingId와 session 값이 있는데 TrackingId는 추적쿠키, session은 사용자 인증 값이라고 유추해 볼 수 있습니다. 

etc-image-1

 

(2) 해당 패킷을 Repeater로 보내고 TrackingId에 값을 넣어 SQL Injection이 되는지 확인해봅니다.

입력 > TrackingId=원본값'

입력 > TrackingId=원본값' and 1=2

결과 > Response에 Welcome back이 출력되지 않으므로 실패

etc-image-2

입력 > TrackingId=원본값' and 1=1-- 

입력 > TrackingId=원본값' and 'a'='a  

결과 > Response에 Welcome back이 출력되므로 성공

etc-image-3

=> SQL 쿼리조작이 가능함을 확인함

 

(3) users라는 테이블이 있는지 확인합니다. (문제에 테이블명을 알려줌: users)

입력 > TrackingId=원본값' and (select 'a' from users limit 1) = 'a

"select 'a' from users limit 1" 값이 참이면 a를 반환하고 끝에 있는 a와 비교하여 같다면 Welcom back 문구를 반환합니다.

etc-image-4

=> user 테이블이 있음을 확인함

 

(4) administrator라는 사용자가 있는지 확인합니다.  (문제에 사용자 계정을 알려줌: administrator)

입력 > TrackingId=원본값' and (select 'a' from users where username='administrator') = 'a

etc-image-5

=> administrator 사용자가 있음을 확인함

 

(5) 이번에는 and 조건을 하나 더 추가하여 패스워드 길이를 확인합니다. (문제에  패스워드 컬럼명을 알려줌: password)

입력 > TrackingId=원본값' and (select 'a' from users where username='administrator' and length(password) > 1) = 'a

etc-image-6

(5)-1 하나씩 값을 넣어 (1,2,3...) 패스워드 길이를 확인합니다. 

이 과정이 귀찮기 때문에 자동화 하기 위해 Intruder를 사용합니다.

자동으로 값을 바꾸고자하는 1을 드래그 >  Add 클릭 > 1 양 옆에 기호 확인 > Payloads 클릭

etc-image-7

Payload type을 Numbers로 지정 > 몇번까지 돌릴 건지 설정(From: 1, To: 30; 1부터 30까지 자동화) > Start attack 클릭

etc-image-8

아래 검색칸에 Welcome back을 입력하고 1번부터 확인합니다.

또는 Lenght로 확인할 수 있습니다. 19보다는 큰 것을 확인할 수 있습니다. 

etc-image-9

=> 패스워드 길이는 20자리 확인

 

(6) 다시 Repeater로 가서 패스워드의 실질적인 값을 확인해야합니다.

입력 > TrackingId=원본값' and (select substring(password,1,1) from users where username='administrator') = 'a

SQL문을 해석하면 "password의 값을 첫번째부터 1개를 추출할건데 그 값이 a인가?" 라는 의미입니다.

etc-image-10

=> DBMS에 따라 사용할 수 있는 함수가 다릅니다.

=> MySQL : SUBSTR(), SUBSTRING()

=> Oracle : SUBSTR()

=> SQL Server : SUBSTRING()

 

(6)-1 하나씩 값을 넣어 패스워드 값을 확인합니다. 

이 과정 또한  Intruder를 사용합니다.

자동으로 값을 바꾸고자하는 a를 드래그 >  Add 클릭 > a 양 옆에 기호 확인 > Payloads 클릭

etc-image-11

메모장에 a~z까지, 0~9까지 입력하여 바탕화면에 저장합니다. (힌트 확인: 패스워드는 소문자와 숫자로만 구성)

etc-image-12

Payload type을 Simple list로 지정 > Load를 클릭하여 만들어둔 txt파일을 open > Start attack 클릭

etc-image-13

아래 검색칸에 Welcome back을 입력하고 확인합니다.

또는 Lenght로 확인할 수 있습니다. c값만 Length가 다른 것을 볼 수 있습니다. 

etc-image-14

=> 패스워드 첫번째 자리는 t

=> 이런 방법을 20번을 해서 비밀번호를 찾아냅니다...

=> substring(password,1,1), substring(password,2,1), substring(password,3,1) ....

=> 찾은 비밀번호: tohi2jf5n3q2sc648ay3

 

(7) 블로그에서 로그인이 되는지 확인합니다.

etc-image-15
etc-image-16