SQL Injection과 SQL Injection (2)는 Low레벨에 대해 다뤘음
이번에는 SQL Injection의 Medium, High 레벨, 그리고 impossible레벨의 대응방안에 대해 다뤄볼 것임.
Medium레벨
- 기본적인 Form 구성. 이번엔 Input박스아 아닌, select option 메뉴인것을 확인할 수있음.
- 정상적으로 값을 선택하면 값에 대한 사용자 ID결과가 나옴.
- 추가적으로 쿼리 스트링이 보이지않는 것을 보니 GET방식을 사용하는 Low레벨과 다르게 POST방식을 사용함.
(페이지 소스보기로도 확인 할 수 있음. 요청 Method 가 POST. 입력폼이 input text가 아닌 select option)
- 즉, Burp Suite가 필요하단 생각이 듬.
- User ID 가 1일떄의 요청을 Intercept한 것. Medium 레벨은 요청자원이 URL에 나오지않는 POST방식이고, INPUT BOX
가 아니고 Select Option 메뉴 형식이라 Burp로 요청 파라미터를 변조해야함.
- 하지만 오류가 뜨는 것을 확인할 수 있음.
- 그 이유는 서버로 넘어간 id 값이 내부적으로 String이 아닌, Numeric 하게 처리되서 그런것. 때문에 ' 가 필요없음.
(burp로 변조한 id값이 그대로 Numeric하게 처리되는 소스코드를 볼 수 있음.)
- 즉, 1' or 1=1 # 이 아닌 1 or 1=1을 삽입해주면 Low레벨과 동이라헥 정상적으로 모든 레코드를 출력해줄 수 있음.
- 또한 Low 레벨과 동일하게 회원정보를 탈취할 수 있음.
High 레벨
- 기본적인 Form 구성. low레벨과과 다르게 입력Form을 새로운 창에서 띄우는 것만 달라진것 같음.
- 정상적인 값을 입력하면 원래의 창에서 결과를 출력해줌.
- Low레벨과 입력폼만 다른것이지 모든것은 Low레벨과 같은 것 같음.
- union도 정상적으로 통하는 것을 확인 가능
결국은 클라이언트단게에서는 SQL Injection을 막을수는 없고 서버쪽에서 해결해야 하는것 같다
Impossible 레벨 대응방안
- SQL Injection과 같은 모든 파라미터 입력값 조작으로 이루어지는 공격은 입력값 검증을 통해 대응할 수 있음.
impossible 레벨에서는 prepare()과 bindParm, execute()를 사용해서 쿼리문을 실행하고 있음. 이러한 방법을
Prepared Statement라고 함.
- 우선, 입력폼에서 넘어온 $id 파라미터가 숫자인지를 체크하여 필요한 데이터타입을 검사하여 입력값검증을하고있음.
- 또한, prepare()함수에서 서버에서 실행될 쿼리문을 담아두고있음.
- 입력값인 id부분을 bindParam에서 지정하여 어떤 부분이 코드이고 데이터인지 알 수 있고, 입력값을 모두 문자열
로 인식하기때문에 SQL인젝션에 대응할 수 있음.
'WebHacking > DVWA' 카테고리의 다른 글
[DVWA] XSS (Reflected) (0) | 2022.01.13 |
---|---|
[DVWA] Command Injection (0) | 2022.01.12 |
[DVWA] SQL Injection (Blind) (0) | 2022.01.12 |
[DVWA] SQL Injection (2) (0) | 2022.01.12 |
[DVWA] SQL Injection (1) (0) | 2022.01.11 |