2010-08-20 4 views
1

가능한 중복 :
XKCD SQL injection - please explainSQL 주입은 어떻게 이루어 집니까?

SQL 인젝션 뒤에 일반적인 개념은 무엇입니까?

Booking.find(:all, :conditions => [ 'bookings.user_id = ?', params[user_id]]) 

내가 맞다 - :

Booking.find(:all, :conditions => [ 'bookings.user_id = #{params[user_id]]}']) 

이 안전 안전하지 않은

레일즈 개발자가되는?

그래서 내 질문은 어떻게 SQL 주입이 완료됩니까? 그런 사람들이 어떻게 그런 짓을하는지. 누군가가 이런 종류의 물건을 보여주고있는 모든 라이브 예/튜토리얼. 논리를 아는 데 필요한 기본 사항.

1234; DROP TABLE BOOKINGS 

...

+0

가능한 복제본 [XKCD SQL injection - please please] (http://stackoverflow.com/questions/332365/xkcd-sql-injection-please-explain)와 [couple others] (http : // stackoverflow. com/search? q = sql + injection) – Gordon

+1

처음으로 내 자신의 질문을 닫는 투표 :-(.하지만 좋은. 내 stackoverflow에서 검색하기 전에 이런 질문을 내 실수. 죄송합니다. : –

답변

2

프로그래머가 게으르면 SQL 주입이 발생합니다. 취약한 쿼리는 다음과 같습니다.

DECLARE @cmd varchar(256) 

SET cmd='SELECT @col FROM Table' 
EXEC @cmd 

@col은 저장 프로 시저에 전달되는 변수입니다.

일반적으로 사용자는 해당 변수에 이미 존재하는 열을 입력합니다. 하지만 좀 더 악의적 인 사용자는 다음과 같이 입력 할 수 있습니다.

* FROM Table; DROP DATABASE data;-- 

* FROM 테이블; 이전 진술을 종료합니다. 그런 다음 DROP DATABASE 데이터; 이 경우 데이터베이스를 삭제하는 나쁜 일을하는 페이로드입니다. 마지막으로, - 쿼리의 나머지 부분을 주석 처리하여 주입시 오류가 발생하지 않도록합니다.

그래서, 대신를 실행 :

SELECT column 
FROM Table 

당신이 얻을 : 좋지 않다

SELECT * 
FROM Table; 
DROP DATABASE data; 
-- 

합니다.

그리고이 : 여기에 SQL 주입의 이론에 우수한 논문의 alt text

+1

Voted XKCD 용. 만화에서 예를 쓰고 정확히 무슨 일이 일어 날까? – KPthunder

1

모든 사용자가 입력되어 관련이있다 섬기는 사람. 예를 들어 다음과 같은 검색어가 있다고 가정 해 보겠습니다.

"SELECT * FROM products WHERE product_type = $type" 

여기서 type은 텍스트 입력란에서 변경되지 않은 사용자 입력입니다. 지금, 나는이 유형을 검색하는 경우 :

(제품에서 삭제)

당신은거야 상처의 세계에있을 수 있습니다. 따라서 DB에서 실행하기 전에 모든 사용자 입력을 sanatized로 확인하는 것이 중요합니다.

0

을 제대로 청소하고 sanatized에 데이터가, 사용자가 실행하는 자신의 SQL 코드를 얻기 위해 시도 할 수있는 경우 :

1

레일에 대해 잘 모르지만이 수치를 Booking.find(:all, :conditions => [ 'bookings.user_id = #{params[user_id]]}'])으로하면 사용자가 user_id에 값 1 OR 1=1을 부여 할 위험이 있으며, 사용자의 요청을 수정할 수 있습니다.

더 주입하면

은 기본적으로 주입 그냥 "하이재킹"당신을 추가하는 기본적인 요구이다 등 1; DROP TABLE BOOKINGS 뭔가를 할 수 있습니다.

Bobby tables

1

당신이 예약 FROM

SELECT * 같은 간단한 쿼리가있는 경우 WHERE USER_ID ASC BY USER_ID = ORDER;

사용자 ID를 확인하지 않으면 쿼리를 종료 한 다음 새로운 (유해한) ID를 시작하고 나머지를 폐기 할 수 있습니다.이를 위해 일반적으로 다음과 같이 입력하십시오.

1; 예약에서 삭제하십시오; -

초기; 좋은 쿼리를 닫고, 다음에 나쁜 쿼리가 온다. 좋은 쿼리에서 다음에 오는 것이 무엇이든 주석 처리되었는지 확인합니다. 그런 다음

SELECT * FROM 예약 WHERE user_id = 1; 예약에서 삭제하십시오; - ORDER BY user_id ASC;

관련 문제