2017-01-16 8 views
1

에서 SQL 주입을 시연 select login_v('[email protected]'' OR 1=1;--','la la la');, 내 방법은 이메일 [email protected]을 사용자에게 반환해야합니다 생각합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?나는 plpgsql이 기능이 PL/pgSQL의

연습을위한 개념을 보여주기 위해 SQL 주입을 수행해야하지만 SQL 주입 및 plpgsql 가슴입니다. : |

답변

3

PL/pgSQL의 SQL 쿼리는 준비된 문과 같이 계획됩니다. 마찬가지로 과 같이 전달하는 경우 SQL 주입은 일반적으로 은 불가능합니다.입니다. 세부 : EXECUTE와 실제로 SQL 주입을 보여 취급 적절한 매개 변수없이

를 사용하여 동적 SQL.

등 (이 이 그것을 할 수없는 방법입니다!) :

이 첫 번째 변수 em가 제대로 따라서 으로 USING 절을 통과하고
CREATE OR REPLACE FUNCTION login_v(em varchar, passwd varchar) 
    RETURNS SETOF users AS 
$func$ 
BEGIN 
    RETURN QUERY EXECUTE 
     'SELECT * 
     FROM users 
     WHERE email = $1 
     AND encrypted_password = crypt(''' || passwd || ''', encrypted_password)' 
    USING em; 
END 
$func$ LANGUAGE plpgsql; 

을 위해 악용 될 수 없습니다 SQL 주입.

그러나 두 번째 변수 passwd은 올바르게 이스케이프 처리하지 않으면 잘못 연결됩니다. 따라서 사용자 입력을 SQL 코드로 변환 할 수 있습니다. SQL 주입.

절대 사용하지 마세요.하지 않는 방법을 시연 할 때를 제외하고.

클라이언트에서 SQL 문자열을 부적절하게 연결하면 비슷한 장난이 발생할 수 있습니다.