복붙노트

[SQL] SQL 주입은 위험이 오늘인가?

SQL

SQL 주입은 위험이 오늘인가?

나는 SQL 주입 공격에 대해 읽어 봤는데 내가이 "끔찍한"예를, 예를 들어, 주어진 일을하는 것 결코 수 있지만, 어떻게 그들을 피하기 위해 이 게시물을 참조하십시오.

나는 $ _GET 통과 밥 ')을 수행하여 테이블을 삭제하려고 값을 가지고, 데이터베이스의 PHP 파일과 테이블을 생성; 테이블 학생을 드롭; - 그것은 작동하지 않았다. PHP는 자동으로 \ '을 탈출하고 쿼리 오류, 완료 해를 끼치있다. 같은 문제와 같은 복제 로그인 "공격"을 시도 AND WHERE 1 = 1 등을 할 때

예제 코드 :

<?php
$id = $_GET['id'];

$sql = "INSERT INTO Users (Username) VALUES ($id)";
echo $sql;
mysql_query($sql) or die(mysql_error());

? 그리고 나는 sql.php ID = 1)를 통과 할 것; 사용자에서 삭제; -

그래서이 PHP3 또는 무언가의 일에 적용하는 데 사용되는 몇 가지 날짜가 기입 된 것, 그리고 요즘도 초보자 마법 따옴표 같은 것들로부터 보호?

우분투에 PHP5를 사용하고 있습니다.

해결법

  1. ==============================

    1.꽤 대조적 인 것. 매직 따옴표는 PHP5에서 사용되지 않으며 그들은 좋은보다가 프로그래밍의 세계에 더 많은 혼란을 가져으로 완전히 PHP 5.4에서 제거 될 예정입니다. 마법 따옴표가 활성화되어 있는지 확인하고, 필요한 경우 꼼꼼하게 모든 SQL 입력을 탈출하는 것은 여전히 ​​매우, 매우 중요합니다 ... 어떤 이유는 나쁜 생각을 느낄 수 없다, 우리는 모두 거기, 내 무지의 엉덩이는 수많은 마법 따옴표로 저장 한 것 시간 :

    꽤 대조적 인 것. 매직 따옴표는 PHP5에서 사용되지 않으며 그들은 좋은보다가 프로그래밍의 세계에 더 많은 혼란을 가져으로 완전히 PHP 5.4에서 제거 될 예정입니다. 마법 따옴표가 활성화되어 있는지 확인하고, 필요한 경우 꼼꼼하게 모든 SQL 입력을 탈출하는 것은 여전히 ​​매우, 매우 중요합니다 ... 어떤 이유는 나쁜 생각을 느낄 수 없다, 우리는 모두 거기, 내 무지의 엉덩이는 수많은 마법 따옴표로 저장 한 것 시간 :

    마법 따옴표에 PHP 매뉴얼은 모든 것을 설명합니다.

  2. ==============================

    2.없음이 여전히 매우 관련이있다.

    없음이 여전히 매우 관련이있다.

    으로는 XSS 및 CSRF이다. 적절한 입력 필터링의 중요성을 과소 평가하지 마십시오.

  3. ==============================

    3.훗, 당신은 "ON"에 magic_quotes_gpc의 설정을함으로써이 경우에 저장하고 있습니다.

    훗, 당신은 "ON"에 magic_quotes_gpc의 설정을함으로써이 경우에 저장하고 있습니다.

    곧 망하는 것입니다.

  4. ==============================

    4.역사에서 가장 큰 도용은 SQL 주입 취약점을 이용하여 2007 년에 달성되었다 : 페이지의 "하트 랜드을 주도 SQL 주입 공격을 Hannaford에서 위반"(컴퓨터 월드, 2009년 8월 18일).

    역사에서 가장 큰 도용은 SQL 주입 취약점을 이용하여 2007 년에 달성되었다 : 페이지의 "하트 랜드을 주도 SQL 주입 공격을 Hannaford에서 위반"(컴퓨터 월드, 2009년 8월 18일).

    OWASP는 주입 공격은 (이 중 SQL 주입 한 예입니다) 가장 일반적인 소프트웨어 보안 문제 중 하나가 될 계속 2007 년에보고했다.

    또한 최근의 SQL 주입 뉴스를 검색하고 대부분의 경우 매달보고 찾을 수 있습니다.

    그러나, XKCD 만화의 예는 공격의 가장 일반적인 유형은 필요하지 않습니다. 중요한 데이터의 방법으로 많은 공격자를 얻을하지 않을 아마 하나 개의 요청에 두 번째 SQL 문을 실행하여 테이블을 삭제, 그냥 파괴 될 것이다.

    또한, 일부 쿼리 인터페이스는 어쨌든 기본적으로 멀티 쿼리를 허용하지. 즉, 데이터베이스 클라이언트 API에 관계없이 세미콜론, SQL 문자열을 주어진 단 하나의 문을 실행합니다. 이 만화의 예를 패배.

    주의 : PDO의 쿼리 () 메소드는 기본적으로 멀티 쿼리를 지원하는 것으로 알려져있다. 그래서는 XKCD 스타일의 공격에 취약하다.

    다른 사람들이 지적했듯이, 더 많은 가능성이 위험은 SQL 주입 SQL 식의 논리를 변경하고, 의도 그 외에 별도의 행에 쿼리를 적용 할 것입니다.

    예를 들면 :

    $sql = "UPDATE Users SET PASSWORD = MD5('" . $_POST["password"] . "'||salt) " . 
           "WHERE user_id = " . $_POST["userid"];
    

    내가 문자열 (123) 또는 사용자 ID = 456 매개 변수 사용자 ID 세트 요청을 보낼 때 어떻게됩니까? 나는 내 자신의 암호 (사용자 ID 123)뿐만 아니라 심지어이 방지하지 않을 사용자 별 소금으로 암호를 해시 사용자 ID 456의 암호를 재설정 할 것입니다. 지금은 하나의 계정에 로그인 할 수 있습니다.

    자행 할 수있는 방법의 SQL 주입 많이 있습니다.

  5. ==============================

    5.매직 인용 계정으로 문자 인코딩을, 따라서 멀티 바이트 문자를 기반으로 공격에 취약하지 않습니다.

    매직 인용 계정으로 문자 인코딩을, 따라서 멀티 바이트 문자를 기반으로 공격에 취약하지 않습니다.

    그것은 위험이 오늘 인에 관해서는, 구글 검색은 수많은 취약한 사이트를 켜십시오. 는 SQL 인젝션 취약점이 9 월 10 일 그래서 주위 버그질라에 대한보고, 그래, 사이트는 위험에 여전히. 그들은해야 하는가? 도구는 그래서, 주입이 방지 할 수 없습니다.

  6. ==============================

    6.특정 공격은 단 하나의 문을 실행할는 mysql_query로,하지 작업을 수행합니다.

    특정 공격은 단 하나의 문을 실행할는 mysql_query로,하지 작업을 수행합니다.

    난 아직도하지만 코드를 악용 할 수 있습니다, 예를 들어, 나는 사용자 이름 = '관리자가'나는 ​​몇 가지 내부 정보를 노출하도록 시스템을 얻을 수 있다는 싸울 기회가있을 수 있습니다 WHERE 사용자의 비밀 번호를 선택 할 ID를 배치합니다.

    당신은 당신의 SQL로 필터링되지 않은 입력을 허용하는 경우 기본적으로, 일부는 기대하지 않았다 모두 생성 된 데이터의 매우 창조적 인 방법, 당신이 의도하지 않은 노출 데이터가 될 것입니다!

  7. ==============================

    7.오, 내 ... SQL 인젝션은이 갈라지는 보안 구멍은 위험하지 않습니다. API가 당신이 당신의 SQL 쿼리에 오래된 데이터를 보간 할 수 있기 때문에 주로 PHP 존재합니다.

    오, 내 ... SQL 인젝션은이 갈라지는 보안 구멍은 위험하지 않습니다. API가 당신이 당신의 SQL 쿼리에 오래된 데이터를 보간 할 수 있기 때문에 주로 PHP 존재합니다.

    내가 PHP 나 ASP로 작성된 사이트를 참조 할 때, 나는 단지 그들이의 악취하는 SQL 주입 벡터 냄새를 맡을 수 있습니다. 사람들은는 mysql_real_escape_string ()와 () INTVAL 자신의 PHP 애플리케이션을 확보하기 위해 시도하고 다른 언어로 유사 할. 이것은 실수입니다. 그것은 이전에, 당신은 하나의 실수를 당신이 죽은 C 대신 Java 또는 파이썬, 코딩과 같은, 그러나 후자 만 의미 론적 결함이있을 수 있습니다.

    난 강력하게 코드로 텍스트를 대체 매개 변수화되어 다른 준비된 명령문, 또는 아무것도 가진 하나 mysqli를 사용하는 사람들을 촉구하고 해석은 처음부터 이럴 단지 나쁜 방법입니다.

    또 다른 메모에서 PHP의 마법 따옴표은 ​​바보이며, 다행히도되지 않습니다. 그것은 단지 좋은보다 더 많은 해를 입힐 수 있습니다. 당신이 마법 따옴표에 의존하는 경우, 마법 따옴표를 사용할 때 앱이 소유 의미합니다. 마찬가지로, 입력에서 탈출 문자열을 기대하지 않는 다른 애플 리케이션을 깰 수 있습니다.

  8. ==============================

    8.이것은 매우 적극적인 위험, 마법 따옴표 시도가 당신에게 솔루션을 제공 할 수 있지만, 나는 항상 해제 마법 따옴표와 함께 개발하는 것을 선호합니다. 내가 가지고있는이 방법은 확실히 실제로 입력에게 자신을 탈출 확인합니다. 마법의 따옴표 스크립트가 실제로 배포 된 서버 또는 해제 될 경우 누가 알 겠어.

    이것은 매우 적극적인 위험, 마법 따옴표 시도가 당신에게 솔루션을 제공 할 수 있지만, 나는 항상 해제 마법 따옴표와 함께 개발하는 것을 선호합니다. 내가 가지고있는이 방법은 확실히 실제로 입력에게 자신을 탈출 확인합니다. 마법의 따옴표 스크립트가 실제로 배포 된 서버 또는 해제 될 경우 누가 알 겠어.

  9. ==============================

    9.이것은 여전히 ​​큰 문제입니다. 당신은 당신이 사용할 수있는 모든 PHP 설치에 켜져 있는지의 magic_quotes을지지 않습니다.

    이것은 여전히 ​​큰 문제입니다. 당신은 당신이 사용할 수있는 모든 PHP 설치에 켜져 있는지의 magic_quotes을지지 않습니다.

    마법 qotes가 켜져 있는지 확인과 마법의 따옴표에서 혼란을 지우려면 :

    if ( get_magic_quotes_gpc() !== 0 ) { $foo = stripslashes( $foo ); }
    

    그런 다음 문을 조금 청소 :

    $foo = mysql_real_escape_string( $foo );
    $sql = "select * from foo where bar='{$foo}'";
    

    기타

    사실, 당신은 당신이 그렇게 할 수있는 능력이있는 경우 단지 엄격의 magic_quotes의 회전 것이 더 낫다.

    나는 당신을 도움이되기를 바랍니다.

  10. ==============================

    10.그것은 하나의 호출에 여러 쿼리를하지 않기 때문에 바비 테이블 예제는 MySQL의 인터페이스로 작동하지 않습니다. mysqli 인터페이스는 여러 쿼리의 공격에 취약합니다. MySQL의 인터페이스는 권한 상승 공격에 더 취약하다 :

    그것은 하나의 호출에 여러 쿼리를하지 않기 때문에 바비 테이블 예제는 MySQL의 인터페이스로 작동하지 않습니다. mysqli 인터페이스는 여러 쿼리의 공격에 취약합니다. MySQL의 인터페이스는 권한 상승 공격에 더 취약하다 :

    양식 I 형 계정에서 : 관리자 암호 : '또는 1 = 1 - 그래서 당신의 전형적인 로그인 SQL : 사용자의 선택 * _ 이름은 ='$ 관리자 '및 비밀 번호 ='$ 암호 '. 또는이 진실하고 로그인하자됩니다.

  11. ==============================

    11.PHP는 쿼리 매개 변수를 할 수 있습니까? 그것은 (그것을하지 않았다 만약 내가 놀랄 것 같은), 그 어떤 완화시킨다 모든 SQL 주입 공격을 하나 개의 솔루션으로 할 수 있습니다.

    PHP는 쿼리 매개 변수를 할 수 있습니까? 그것은 (그것을하지 않았다 만약 내가 놀랄 것 같은), 그 어떤 완화시킨다 모든 SQL 주입 공격을 하나 개의 솔루션으로 할 수 있습니다.

  12. ==============================

    12.내가 전에 유래에 여러 번 언급했듯이, 나는 자신과 클라이언트 큰 부탁을 그냥 구식 MySQL의 사용을 중지, PDO의 강력한 지지자이고 PDO 내용 (정말 쉽습니다) 및 준비된 명령문을 활용하고 바인딩 매개 변수를 설정합니다. 당신이 현명한 준비된 문 성능을 필요로하지 않는 경우에도 보안 혜택을받을.

    내가 전에 유래에 여러 번 언급했듯이, 나는 자신과 클라이언트 큰 부탁을 그냥 구식 MySQL의 사용을 중지, PDO의 강력한 지지자이고 PDO 내용 (정말 쉽습니다) 및 준비된 명령문을 활용하고 바인딩 매개 변수를 설정합니다. 당신이 현명한 준비된 문 성능을 필요로하지 않는 경우에도 보안 혜택을받을.

    또한, 나는 마법의 따옴표가 ON으로 설정되어있는 경우 고객의 얼굴에 전체 응용 프로그램을 충돌 권장합니다. 그것은 바보를 보호하고 스마트를 성가 시게하기위한 자원 단지 드레인입니다. (이 모든 인코딩 때문에 당신이 필요하지 않은 경우에도 수동으로 탈출보다 더 많은 CPU를 사용)

  13. ==============================

    13.기본 안전 수칙을 우회하는 SQL 주입 및 방법을 꽤 많이 수행하는 다른 방법은 여러가지가 있습니다.

    기본 안전 수칙을 우회하는 SQL 주입 및 방법을 꽤 많이 수행하는 다른 방법은 여러가지가 있습니다.

    그 공격은 OWASP에 따라 상위 10 개 웹 애플리케이션 취약점 (순위 # 2) 내왔다.

    자세한 내용은 10 2007 삽입 취약점을 참조하시기 바랍니다.

  14. ==============================

    14.아니, 그리고 덜 당신이 SQL 주입에 대한 걱정, 더 많은 가능성이 당신이 그것에 의해 타격을받을 수 있습니다.

    아니, 그리고 덜 당신이 SQL 주입에 대한 걱정, 더 많은 가능성이 당신이 그것에 의해 타격을받을 수 있습니다.

  15. ==============================

    15.웹 페이지에서 SQL 쿼리에 전달 된 매개 변수는 숫자 ID를하는 경향이 OFEN. 예하지 말라의 당신이 섹션 ID는이 같은 쿼리에 사용되는로부터 URL http://foo.com/page.php?section=34가 있다고 가정 :

    웹 페이지에서 SQL 쿼리에 전달 된 매개 변수는 숫자 ID를하는 경향이 OFEN. 예하지 말라의 당신이 섹션 ID는이 같은 쿼리에 사용되는로부터 URL http://foo.com/page.php?section=34가 있다고 가정 :

    SELECT content FROM sections WHERE section_id=$section;
    

    Thew 보낸 위험이 진짜 그래서 따옴표 ... 당신의 예와 어떤 URL의 수는 쿼리에 전달됩니다 후 놓을 게요처럼 탈출 없습니다.

  16. ==============================

    16.엄지 손가락의 간단한 규칙은 모든 사용자 입력이 오염 될 수 있다고 가정하는 것입니다. / 크기가 파일이 아닌 외부 데이터에 대한 다른 검사가 보증 할 수있다 등 크기와 허용 종류의, 당신이 기대했던 범위 데이터 유형은 당신이 기대하는 변수 길이에 무엇 확인 - 당신은 몇 가지 중요한 관리자를 호출하기 전에 - 레벨 기능, 체크 할 - 다이 () ($ 유저 레벨을 = ADMIN을!) : important_function ();

    엄지 손가락의 간단한 규칙은 모든 사용자 입력이 오염 될 수 있다고 가정하는 것입니다. / 크기가 파일이 아닌 외부 데이터에 대한 다른 검사가 보증 할 수있다 등 크기와 허용 종류의, 당신이 기대했던 범위 데이터 유형은 당신이 기대하는 변수 길이에 무엇 확인 - 당신은 몇 가지 중요한 관리자를 호출하기 전에 - 레벨 기능, 체크 할 - 다이 () ($ 유저 레벨을 = ADMIN을!) : important_function ();

    당신보다 더 큰 바보의 더 큰 물고기, 또는 누군가가 항상있다. 데이터에 대한 가정을 피하고 당신은 머리 시작있어.

  17. ==============================

    17.오늘은 아직 있지만, 그것은 단지 세계 협정시 20시 34분입니다

    오늘은 아직 있지만, 그것은 단지 세계 협정시 20시 34분입니다

    가디언 작업 데이터베이스 공격은 데이터베이스 보안 2009 11월 6일의 어려움을 보여줍니다

    가디언 채용 웹 사이트 해킹은 SQL 주입이 아닌 '정교한'공격 2009 10월 27일되었을 수도 있습니다

  18. ==============================

    18.문자열에서 SQL을 구축 할 때마다, SQL 주입 진짜 위험이다.

    문자열에서 SQL을 구축 할 때마다, SQL 주입 진짜 위험이다.

    또한 문자열에서 SQL을 구축 피하기 위해 노력하는 것은 무의미 노력 것을 발견했다. 조만간 당신의 SQL (매개 변수가 될 수뿐만 아니라 일)의 전체 형태는 실행시에 생성해야합니다.

  19. ==============================

    19.내가 해제의 magic_quotes에 나와있는 방법이없는 서버 개발해야했습니다! 나는 \ '이중 이스케이프 \'없이 자신을 탈출 제대로 할 수 있도록, 마법 따옴표의 효과를 취소 할 모든 페이지에 포함되어 있습니다. 난 그냥이 글을 읽는에서 구토 맛볼 수 있지만, 나는 더 나은 솔루션을 발견하지 않았습니다.

    내가 해제의 magic_quotes에 나와있는 방법이없는 서버 개발해야했습니다! 나는 \ '이중 이스케이프 \'없이 자신을 탈출 제대로 할 수 있도록, 마법 따옴표의 효과를 취소 할 모든 페이지에 포함되어 있습니다. 난 그냥이 글을 읽는에서 구토 맛볼 수 있지만, 나는 더 나은 솔루션을 발견하지 않았습니다.

    if (get_magic_quotes_gpc()) {
    
        $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    
        while (list($key, $val) = each($process)) {
    
            foreach ($val as $k => $v) {
    
                unset($process[$key][$k]);
    
                if (is_array($v)) {
    
                    $process[$key][stripslashes($k)] = $v;
    
                    $process[] = &$process[$key][stripslashes($k)];
    
                } else {
    
                    $process[$key][stripslashes($k)] = stripslashes($v);
    
                }
    
            }
    
        }
    
        unset($process);
    
    }
    
  20. ==============================

    20.10 OWASP 2017에 따라, 여전히 주입 가장 일어난 위험한 공격이다.

    10 OWASP 2017에 따라, 여전히 주입 가장 일어난 위험한 공격이다.

    그냥 등을 업로드 웹 쉘에 의해 웹 서버를 제어, 우리는 전체 데이터베이스를 덤프 할 수 SQL 주입을 사용하여, 기억

  21. from https://stackoverflow.com/questions/1683843/is-sql-injection-a-risk-today by cc-by-sa and MIT license