programing

쿼리를 거의 완전히 구성할 수 있는 경우 SQL 주입 제한

itsource 2022. 10. 5. 23:41
반응형

쿼리를 거의 완전히 구성할 수 있는 경우 SQL 주입 제한

웹 응용 프로그램에서 SQL 쿼리의 예약된 덤프를 수행해야 합니다.처음에는 테이블 전체였지만(테이블 이름만 설정 가능), 설정 가능한 WHERE 절이 열의 서브셋과 함께 추가되었습니다.

필요한 구성 가능한 옵션은 다음과 같습니다.

  • 테이블명
  • where 절

이쯤 되면 그냥 전체 쿼리일 수도 있지?!

는 SQLi에 의해 어느 될 수 것을 있습니다.java.sql.PreparedStatement단, 컴파일 시 컬럼과 데이터 타입을 알고 있어야 합니다.

구성 가능한 항목은 최종 사용자에게 노출되지 않습니다.이 파일들은 다음 중 하나의 속성 파일에 저장됩니다.WEB-INF/classes그래서 여기서 방어하는 사용자는 생각만큼 좋지 않은 sysadmins입니다.

제가 너무 조심스러웠나요?

에는 할 수 없다, 할 수 있다, 할 수 있다java.sql.PreparedStatement WHERE 이 WHERE 인 경우되지 않도록 .Robert'); DROP TABLE students;--

준비된 진술로는 이 문제를 해결할 수 없습니다.준비된 문을 사용하면 테이블 이름, 열 이름 또는 전체 where 구가 아닌 파라미터만 쿼리에 안전하게 추가할 수 있습니다.

특히 후자는 아무런 제약이 없으면 주입을 막는 것이 사실상 불가능하다.열 및 테이블 이름 매개 변수는 데이터베이스 구조에 따라 정적으로 정의되거나 동적으로 정의된 유효한 값 목록과 비교할 수 있습니다.where 파라미터에 대한 기본적인 regex 체크를 수행할 수 있지만 이는 명백한 SQL 주입에만 도움이 됩니다.SELECT FROM WHERE 형식으로 제공하는 유연성으로 다음과 같은 쿼리를 받을 수 있습니다.

SELECT mycolumn FROM mytable WHERE id = 1 AND 'username' in (SELECT username FROM users) 

JOOQ와 같은 기능을 통해 사용자가 쿼리할 수 있는 대상을 제한할 수 있는 안전한 동적 쿼리 구축을 제공할 수 있습니다.어떤 식으로든 사용자를 제한하는 것이 중요합니다.그렇게 하지 않으면 SQL 주입뿐만 아니라 성능 문제도 걱정해야 합니다.예를 들어 시각적(드래그 앤 드롭) 쿼리 작성기를 제공합니다.

"다 따라 달라"

사용자가 where 구를 자유 텍스트로 입력할 수 있는 응용 프로그램이 있는 경우 SQL Injection 공격을 구성할 수 있습니다.또한 대규모 데카르트 결합을 선택하여 서버를 정지시킬 수도 있습니다.

시각적 쿼리 작성기를 만들 수 있습니다. 스키마 메타데이터를 사용하여 테이블 목록을 표시하고 테이블을 선택한 후 열과 각 열에 대해 유효한 비교를 수행할 수 있습니다.그런 다음 쿼리를 매개 변수화된 쿼리로 구성하고 비교 값으로 사용자 입력을 제한할 수 있습니다. 비교 값은 다시 매개 변수로 사용할 수 있습니다.

많은 작업이 필요하지만, 모든 규모의 프로덕션 시스템에서 사용자가 이러한 종류의 쿼리를 실행하도록 하는 것은 일반적으로 그다지 유용하지 않습니다.

사용자가 임의 쿼리를 실행하도록 허용하는 것은 안전하지 않습니다.이것은 에퀴팩스에서 볼 수 있는 그런 종류의 것이다.허락하고 싶지 않잖아

준비된 문은 SQL 식을 안전하게 만드는 데 도움이 되지 않습니다.준비된 문장에서 매개 변수를 사용하면 값을 안전하게 만들 수 있습니다.파라미터는 숫자, 따옴표로 묶인 문자열 또는 따옴표로 묶인 날짜와 같이 일반적으로 상수 값을 넣는 장소에서만 사용할 수 있습니다.

가장 쉬운 해결책은 요청 시 임의 쿼리 또는 식을 허용하지 않는 것입니다.

대신 사용자가 검토를 위해 사용자 지정 쿼리를 제출할 수 있도록 허용합니다.

쿼리는 사용자에 의해 검토되며, 사용자는 저장된 쿼리를 사용자(또는 다른 사용자)에 의해 실행되도록 승인할 수 있습니다.자동검증기를 개발할 수 있다고 생각하신다면, IMHO는 자격을 갖춘 데이터베이스 관리자가 검토하는 것보다 훨씬 더 많은 작업이 필요할 것입니다.

이후 사용자는 저장된 쿼리를 필요에 따라 실행할 수 있지만 해당 ID만 사용할 수 있습니다.

여기 또 다른 아이디어가 있습니다. 커스텀 쿼리를 실행하려는 사용자는 데이터베이스 복제본을 가져오거나 자신의 컴퓨터에서 호스트하기 위해 신청할 수 있습니다.표시 권한이 부여된 데이터 서브셋의 덤프를 가져옵니다.그리고 데이터를 폐기하는 쿼리를 실행하거나 컴퓨터를 녹이는 것은 그들의 일입니다.

언급URL : https://stackoverflow.com/questions/46771452/limiting-sql-injection-when-query-is-almost-entirely-configurable

반응형