2009-11-25 2 views
2

어제 우리 사이트가 SQL 주입에 취약하다는 사람으로부터 이메일을 받았습니다. 이메일은 말했다 : SQL 주입 취약점 발견

내가 서버에 대한 몇 가지 고전적인 SQL 주입을 시도했다. 위의 URL에서, 난 내 실제 도메인을 노출하지 않고 mysite.com로 대체 한 것을

http://www.mysite.com/ppreview.php?id=611111161%20and%201=0%20UNION%20all%20SELECT%201,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user_id,70,71%20%20from%20admin--&u=10064&t=users_cars

참고 :이 URL은 결과가 포함되어 있습니다.

위의 URL은 내 사이트가 해당 종류의 URL 및 귀하의 사이트에도 취약하기 때문에 어떤 의미인지 설명 할 수 있습니까?

URL을 디코딩하는 방법은 무엇입니까?

+1

사용자 입력을 신뢰하지 마십시오. 필터링되지 않은 사용자 입력을 절대로 표시하지 마십시오. 더 이상 사이트를 만들기 전에 기본 웹 사이트 보안을 읽어보십시오. 일부 다른 사이트는 취약한 사이트입니다. – llamaoo7

+0

나는 이것에 대해 연구하지 않았다. 그것은 동료 개발자인데, 중학교 였지만 지금까지는 내 사이트가 전혀 취약하지 않았 음을 감사한다. – Sarfraz

+0

블로그에서 귀하의 사이트 중 임의의 하나를 선택하여 약 XSS 익스플로잇을 발견했다. 3 분. – llamaoo7

답변

8

문제는 쿼리 문자열의 SQL 명령을 SQL 명령에 연결한다는 것입니다.

아마도 코드는 말한다

"select * from preview where ID=" + Request.QueryString["id"] 

같은 당신이 그것을 쿼리 문자열하는 EG

select * from preview where ID=611111161 and 1=0 
UNION ALL 
SELECT 1,2,3,4,password,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,user=id,70,71 
FROM admin 

이되는 것을 사용하면 : 그는 당신의 관리자 계정 로그인이 미리보기 페이지에 표시 만들어졌다.

사용자로부터받은 모든 입력을 SQL에서 이스케이프 처리하거나 매개 변수가있는 쿼리를보다 잘 사용하도록 서버에서 처리해야합니다. SQL 서버의 언어 나 유형을 알지 못하면 실제로 어떤 코드의 방향으로 당신을 가리킬 수 없습니다.

+0

내 코드는 다음과 같습니다. \t $ id = $ _GET [ 'id']; \t $ user_id = $ _GET [ 'u']; 당신은 내가 슈퍼 글로벌 변수를 직접 사용하지 않는다는 것을 알았습니다. 먼저 변수에 할당 한 다음 SQL 쿼리에서 사용하십시오. 어떤 제안이 좋습니까? 이게 잘못된거야? – Sarfraz

+1

다른 변수에 먼저 할당하면 최종 SQL이 변경되지 않고 여전히 문자열이 쿼리 끝에 추가됩니다. 실제로이 URL에서 준비된 PHP 문을 사용하는 방법에 대한 좋은 글이 있습니다. http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php - 이것이 최선의 해결책입니다. 이 경우에는 숫자와 같은 해결 방법이 있지만 현실적으로 해결 방법을 사용하면 모든 구멍을 닫을 수 없습니다. 준비된 문 사용하기 100 %는 사용자가 필드를 값이 아니라 실행 가능한 SQL이 아니라는 것을 서버에 알리기 때문에 100 % 보호합니다. – fyjham

1

당신은 아마 (내가 PHP 구문을 모르는)과 같은 코드가 있습니다 :

string sql = "select * from mytable where customerid = " + Request.QueryString("id");

이제부터 당신은 페이지의 쿼리 문자열에 바로 ID보다 더 많은 추가 우송 사람 당신의 SQL 문은 같은 같은 것입니다 : select * from mytable where customerid = 6111111661 and union all the tables that you don't want.

는 항상 조회에 매개 변수를 사용하고 사용자 입력을 확인! 가능하면 동적 SQL을 피하십시오.

+0

아니오 직접 SQL에서 vars를 사용하지 마십시오. 나는 vars를 읽고 vars에 할당하고 쿼리에 사용합니다. 예를 들면; $ id = $ _GET [ 'id']; $ user_id = $ _GET [ 'u'] 이제 쿼리에서 두 개의 변수를 사용합니다. – Sarfraz

0

이렇게 작동하도록 코드를 변경하십시오.

$id = $_GET['id']; 
$user = mysql_real_escape_string($_GET['user']); 

if(is_numeric($id)) 
{ 
    mysql_query($query); 
} 

이제 코드가 유효하지 않은 사용자 ID를 수락하지 않습니다 그리고 당신은 내가 마련했습니다 방법을 사용하여 모든 문자열을 살균 당신은 너무 오래 SQL 주입에 문제가되지 않습니다.

+0

을 사용하면 var에 정수가 있어야한다는 것을 알 때'is_numeric()'이 INT :'$ id = (int) $ _ GET [ 'id']; – dnagirl