programing

MongoDB는 SQL 주입 혼란을 어떻게 피합니까?

nasanasas 2020. 11. 28. 09:37
반응형

MongoDB는 SQL 주입 혼란을 어떻게 피합니까?


나는 믿을만한 O'Reilly 책을 읽고 Mongo가 본질적으로 SQL 인젝션과 같은 결함의 모욕을 피하는 방법에 대한 구절을 발견했습니다.

내 직감에 나는 이것을 이해한다고 생각한다. 삭제되지 않은 변수가 쿼리에 전달 UNION되면 JOIN,, 쿼리로 전환 된 주석 등 을 사용하여 문서 지향 쿼리 구조에서 벗어날 수 없습니다 .

MongoDB는 SQL 주입 혼란을 어떻게 피합니까? 이 쿼리 구문의 특성 때문입니까?


MongoDB는 구문 분석을하지 않음으로써 잠재적 인 문제를 방지합니다.

구문 분석되는 형식화 된 텍스트로 사용자 데이터를 인코딩하는 모든 API는 호출자와 호출 수신자가 해당 텍스트를 구문 분석하는 방법에 동의하지 않을 가능성이 있습니다. 이러한 불일치는 데이터가 메타 데이터로 잘못 해석 될 때 보안 문제가 될 수 있습니다. HTML로 된 사용자 생성 콘텐츠를 포함하여 printf 형식 문자열에 대해 이야기하든 SQL을 생성하든 마찬가지입니다.

MongoDB는 구조화 된 텍스트를 구문 분석하여 수행 할 작업을 파악하지 않기 때문에 사용자 입력을 지침으로 잘못 해석 할 가능성이 없으므로 보안 허점이 없습니다.

덧붙여서 파싱이 필요한 API를 피하는 방법은 http://cr.yp.to/qmail/guarantee.html의 항목 5입니다 . 보안 소프트웨어를 작성하는 데 관심이 있다면 다른 6 가지 제안도 살펴볼 가치가 있습니다.


업데이트 (2018) : 내가 제공 한 원래 답변은 내가 아는 한 사실로 유지됩니다. MongoDB로 전송되는 시점부터 다시 전송되는 시점까지 SQL 주입 공격은 없습니다. 내가 알고있는 주입 공격은 MongoDB 외부에서 발생하며 실제로 외부 언어 및 라이브러리가 MongoDB로 전달 될 데이터 구조를 설정하는 방법에 문제가 있습니다. 또한 취약점의 위치는 데이터 구조가되는 과정에서 데이터를 구문 분석하는 방법에 있습니다. 따라서 원래 답변은 주입 공격을 피하는 방법과 그 위험에 처한 요소를 모두 정확하게 설명합니다.

그러나 이러한 정확성은 자체 코드에서 명확하지 않은 결함으로 인한 주입 공격을받는 프로그래머에게 냉정한 위안입니다. 우리 중 일부는 외부 도구와 코드와 해당 외부 도구 사이의 모든 계층을 구별합니다. 그리고 주입 공격을 예상하고 차단하기 위해 우리 측의 경계가 필요하다는 사실은 여전히 ​​남아 있습니다. 모든 도구로. 그리고 이것은 가까운 미래에도 계속 될 것입니다.


MongoDB 문서 를 요약하려면

BSON

클라이언트 프로그램은 MongoDB에서 쿼리를 어셈블 할 때 문자열이 아닌 BSON 객체를 빌드합니다. 따라서 기존의 SQL 주입 공격은 문제가되지 않습니다.

그러나 MongoDB는 인젝션 공격에 영향을받지 않습니다 . 동일한 문서에서 언급했듯이 MongoDB 작업을 통해 임의의 JavaScript 표현식이 서버에서 직접 실행될 수 있으므로 주입 공격이 여전히 가능합니다. 문서는 이에 대해 자세히 설명합니다.

http://docs.mongodb.org/manual/faq/developers/#javascript


PHP를 사용하면 mongoDB가 No-SQL 주입에 취약해질 수 있습니다.

http://www.idontplaydarts.com/2010/07/mongodb-is-vulnerable-to-sql-injection-in-php-at-least/

http://www.php.net/manual/en/mongo.security.php


데이터베이스는 콘텐츠를 구문 분석하지 않을 수 있지만 취약한 코드 영역이 있습니다.

https://www.owasp.org/index.php/Testing_for_NoSQL_injection


SQL 주입으로부터 보호하기 위해 클라이언트는 MongoDB의 언어 API를 사용할 수 있습니다. 이렇게하면 모든 입력이 단순한 값입니다. 명령을 삽입 할 수 없습니다. 자바 예 :

collection.find(Filters.eq("key", "input value"))

단점은 필터를 쉽게 테스트 할 수 없다는 것입니다. Mongo의 셸에 복사하여 테스트 할 수 없습니다. 더 크고 복잡한 필터 / 쿼리에서 특히 문제가됩니다.

그러나!!! 필터의 API를 사용하지 않는 API도 있습니다. 모든 json 필터를 구문 분석 할 수 있습니다. 아래 Java 예제 :

collection.find(BasicDBObject.parse("{key: "input value"}"));

필터를 MongoDB 셸에 직접 복사하여 테스트 할 수 있기 때문에 좋습니다.

그러나!!! (마지막으로 약속하지만) 이것은 NoSql 주입에 취약합니다. 입력 값이 인 Java 예제 {$gt: ""}.

collection.find(BasicDBObject.parse("{key: {$gt: ""}}"));

이 마지막 예에서는 반환 할 특정 레코드 만 의미했지만 모든 것이 반환됩니다.

필터를 직접 사용할 때 SQL 삽입에 대한 자세한 설명 여기를 참조 하십시오 .

마지막 한가지. 원시 필터를 모두 사용하고 여전히 SQL 주입으로부터 보호하는 방법이 있다고 생각합니다. 예를 들어 Java에서는 Jongo의 매개 변수화 된 쿼리를 사용할 수 있습니다 .

참고 URL : https://stackoverflow.com/questions/5021456/how-does-mongodb-avoid-the-sql-injection-mess

반응형