웹해킹 실습 - 3. SQL 인젝션

roon-replica·2022년 6월 13일
0

웹보안

목록 보기
4/8

생각들

  • SQL 인젝션 공격이 요즘에도 통함??
    옛날에 만들어진 프로그램들이 계속 남아있어서 그런가

  • DB로 전달되는 SQL문을 사용자가 임의로 조작할 수 있는 경우 발생한다는데 이러한 조작이 어떻게 가능함?

SQL 인젝션 공격

  • 사용자가 입력한 값이 쿼리문의 일부로 사용되면 SQL 인젝션 취약점이 존재한다고 함..

WHERE 구문 우회?

  • 사용자 ID를 입력하면 사용자 정보를 보여주는 페이지 예시 (이런 페이지가 있나?)
 SELECT name, email 
 FROM user
 WHERE id = {id} or '1'='1'; // 1=1 때문에 항상 참이 되서 모든 유저 정보가 반환됨

UNION 공격?

 SELECT name, email
 FROM user
 WHERE id = {id}
 UNION
 SELECT name, pw 
 FROM user#
  • UNION 공격이 강력하다고 함..

실습

  • 입력이 쿼리 결과에 영향을 주는지 살펴보기
    영향을 주면 SQL 인젝션 취약점 존재 가능성 높음 (매우 드물것으로 예상)

  • UNION 공격할 때 원래 SQL이 몇 개의 컬럼을 반환하는지 알아야 한다고 함
    ORDER BY로 컬럼 개수 알아낼 수 있음

     UNION SELECT 1,2
  • blind? sql injection attack
    입력한 값이 sql 쿼리문에 영향을 미치는 것은 동일.
    기존의 sql 인젝션 공격처럼 결과를 직접적으로 알 순 없어도
    간접적으로 어떤 정보를 알아내는 방법

  • sqlmap 프로그램
    sql 인젝션 공격을 자동화하는 프로그램.

     // 예시, url, cookie는 개발자 도구에서 얻을 수 있음 (쿠키는 httpOnly면 못 얻을듯?)
     sql -u {url} --cookie {cookie}
    // 현재 db 알아내기
     sql -u {url} --cookie {cookie} --current-db
     // db의 테이블들 알아내기
     sql -u {url} --cookie {cookie} -D {알아낸 db명} -tables
     // 모든 유저 알아내기
     sql -u {url} --cookie {cookie} -D {알아낸 db명} -T {유저 테이블명} -dump

대응 방안

  • 입력값 검증
    화이트리스트 검증 (뭐더라..)
  • 시큐어하게 코딩
    입력값이 SQL 쿼리에서 데이터로만 사용되고, 쿼리문의 구조에는 영향을 줄 수 없도록 하기
    (java의 preparedStatement)
profile
집중 ➝ 프로세서↑ 시간 투자 ➝ 디스크↑

0개의 댓글