SQL Injection (10)

밍기적·2022년 12월 29일
0

웹해킹

목록 보기
21/35

이전까지는 SQL 인젝션을 찾기위해 수동으로 직접 URL이나 텍스트 상자에 코드를 입력했다

하지만 효율성이 낮아지며 찾으려고 노력하는 시간동안 다른일을 할 수 있기 때문에 자동화된 툴을 이용한다

대표적으로 sqlmap이 존자한다

sqlmap은 자동화된 툴로 여러가지 데이터베이스 유형에 사용이 가능하며 하나의 출력만 보여주는 웹사이트의 경우 모든 출력을 반복하여 완전한 출력을 가지도록 수행한다

사용법은 간단하다

sqlmap -u "TARGET URL"

자동으로 데이터베이스 유형과 SQL 인젝션이 가능한 부분을 분석해서 보여준다

username이 취약하다고 보여주며 인젝션을 위한 여러가지 예시도 보여준다
결과는 로그파일로 저장된다

이전에 진행했던 순서대로 진행했다

먼저 데이터베이스를 모두 가져온다

데이터베이스를 owasp10로 선택했다

그 다음 데이터베이스에 존재하는 테이블을 모두 가져온다

테이블에서 accounts 테이블을 선택 후 Column들을 가져온다

이제 dump 옵션을 통해 파일에 테이블에 존재하는 모든 데이터를 저장할 수 있다

sqlmap은 이 뿐만아니라 여러가지 기능을 제공한다

현재 데이터베이스에 사용중인 사용자도 추출이 가능하다

sqlmap -u [TARGET URL] --cureent-user

그리고 현재 사용중인 데이터베이스도 추출이 가능하다

sqlmap -u [TARGET URL] --cureent-db

sqlmap을 통해 쉘도 획득이 가능하다


--os-shell 옵션

  • 운영체제 시스템 쉘과 상호작용이 가능한 프롬포트를 실행한다


현재 애플리케이션이 사용하는 언어를 선택하라고 요청합니다

PHP를 사용한다는 것을 알고 있으므로 선택합니다

하지만 404 오류가 발생하며 실패합니다

  • 이유로 mySQL 사용자가 파일을 업로드 하지 못하기 때문이다

대신 SQL 쉘도 획득할 수 있습니다


--sql-shell 옵션

  • SQL을 통해 실행하는 것처럼 SQL을 사용할 수 있다
  • SQL 쿼리를 실행하는 것을 더 쓰기 쉽고 읽기가 쉽다


사용하고 있는 애플리케이션들의 버전을 보여주며 Shell이 나타납니다

  1. current_user()

현재 사용자는 root입니다

  1. user()

  2. database()

  3. SQL 구문 사용

  • 원하는 sql 명령을 실행할 수 있다
  • information_schema 테이블을 참조하여 실행할 수 있다


SQL 인젝션으로부터 보호하기

SQL 인젝션은 매우 위험하며 발생하기 쉽습니다
또한 어디서나 쉽게 찾을 수 있습니다

인젝션을 보호하기 위해 첫 번째 방법은 필터를 사용하여 막으려고 시도했습니다

  • 하지만 필터는 다른 유형으로 인코딩하거나 프록시 툴을 사용하여 우회가 가능하다

또 다른 방법으로 블랙리스트를 사용했습니다

  • 블랙리스트와 반대되는 개념인 화이트 리스트를 사용하여 우회가 가능하다

결론적으로 코드를 허용하지 않는 방식으로 웹 애플리케이션을 프로그래밍 하는 것이 제일 좋습니다

즉 데이터와 코드가 분리되고 매개변수화된 명령문을 사용하는 것입니다

select * from accounts where username='$textbox1'

기본적인 SQL 구문이고 textbox1에는 사용자가 입력한 문장이 들어갑니다

  • 매우 취약하며 쉽게 인젝션이 가능하다

가장 좋은 방법으로 매개변수를 사용하는 것입니다

"select * from accounts where username= 'textbox1'"

우리가 입력을 하면 SQL 구문은 username에 하나의 문장으로 처리합니다

  • 그러므로 SQL문이 실행되는 것이 아닌 username으로 입력이 되므로 하나의 문장으로 먼저 처리를 한다
  • 이후 처리된 문장은 SQL 구문으로 이동하여 실행이 된다

이렇게 두 부분으로 나누는 것이 최선이다

0개의 댓글