programing

Shift-JIS 및 CP932로 SQL 주입 공격을 만드는 방법은 무엇입니까?

topblog 2023. 9. 15. 20:41
반응형

Shift-JIS 및 CP932로 SQL 주입 공격을 만드는 방법은 무엇입니까?

저는 제 코드가 다양한 문자 집합에서 SQL 주입에 취약하지 않은지 확인하기 위해 몇 가지 단위 테스트를 작성하고 있습니다.

답변에 따르면 인젝션을 통해 취약점을 생성할 수 있습니다.\xbf\x27다음 문자 중 하나를 사용합니다.big5,cp932,gb2312,gbk그리고.sjis

이스케이퍼가 올바르게 구성되어 있지 않으면 다음을 볼 수 있기 때문입니다.0x27도망치려고 노력하는 것이\xbf\x5c\x27.하지만,\xbf\x5c실제로 이 문자 집합에서 하나의 문자이므로 따옴표 (0x27)을(를) 탈출하지 않은 상태로 둡니다.

하지만 제가 테스트를 통해 알아낸 바와 같이, 이것은 완전히 사실이 아닙니다.효과가 있습니다.big5,gb2312그리고.gbk그러나 둘 다 유효한 문자가 아닙니다.sjis그리고.cp932.

둘다요.

mb_strpos("abc\xbf\x27def","'",0,'sjis')

그리고.

mb_strpos("abc\xbf\x27def","'",0,'cp932')

돌아가다4. 즉, PHP가 볼 수 없습니다.\xbf\x27하나의 캐릭터로이것은 돌아옵니다.false위해서big5,gb2312그리고.gbk.

또한, 이 내용:

mb_strlen("\xbf\x5c",'sjis')

돌아온다2(돌아옵니다.1위해서gbk).

그래서, 질문은: 다른 캐릭터 시퀀스가sjis그리고.cp932SQL 주입에 취약한가요, 아니면 실제로 전혀 취약하지 않습니까?아니면 PHP가 거짓말을 하는 건가요, 제가 완전히 잘못 알고 있는데 MySQL이 이것을 완전히 다르게 해석할까요?

악마는 세부사항에 있어요...문제의 답변이 취약한 문자 집합 목록을 어떻게 설명하는지부터 시작하겠습니다.

이 공격이 작동하려면 서버가 둘 다 암호화할 연결에 대해 예상하는 암호화가 필요합니다.'ASCII와 같이0x27 그리고 최종 바이트가 ASCII인 문자를 갖는 것. 밝혀진 바에 따르면 MySQL 5.6에서 기본적으로 지원되는 인코딩은 5가지입니다.big5,cp932,gb2312,gbk그리고.sjis. 저희가 선택을 하겠습니다.

이것은 우리에게 몇가지 맥락을 제공합니다.0xbf5c에 대한 예로 사용됩니다.gbk, 5개의 모든 문자 집합에 사용할 수 있는 보편적인 문자가 아닙니다.
마침 같은 바이트 시퀀스가 아래의 유효한 문자이기도 합니다.big5그리고.gb2312.

이 시점에서 질문은 다음과 같이 쉬워집니다.

아래에서 유효한 문자인 바이트 수열은 무엇입니까?cp932그리고.sjis결국은0x5c?

공정하게 말하자면, 제가 이 캐릭터 세트들에 대해 시도한 구글 검색의 대부분은 유용한 결과를 제공하지 않습니다.하지만 이 CP932를 발견했습니다.TXT 파일을 검색할 경우'5c '(거기에 공간을 두고), 당신은 다음 줄로 뛰어오를 것입니다.

0x815C0x2015 #수평바

그리고 우승자가 나왔습니다. :)

오라클 문서에 의하면0x815c둘다은입니다 둘 다 입니다.cp932그리고.sjisPHP도 이를 인식합니다.

php > var_dump(mb_strlen("\x81\x5c", "cp932"), mb_strlen("\x81\x5c", "sjis"));
int(1)
int(1)

공격에 대한 PoC 스크립트는 다음과 같습니다.

<?php
$username = 'username';
$password = 'password';

$mysqli = new mysqli('localhost', $username, $password);
foreach (array('cp932', 'sjis') as $charset)
{
        $mysqli->query("SET NAMES {$charset}");
        $mysqli->query("CREATE DATABASE {$charset}_db CHARACTER SET {$charset}");
        $mysqli->query("USE {$charset}_db");
        $mysqli->query("CREATE TABLE foo (bar VARCHAR(16) NOT NULL)");
        $mysqli->query("INSERT INTO foo (bar) VALUES ('baz'), ('qux')");

        $input = "\x81\x27 OR 1=1 #";
        $input = $mysqli->real_escape_string($input);
        $query = "SELECT * FROM foo WHERE bar = '{$input}' LIMIT 1";
        $result = $mysqli->query($query);
        if ($result->num_rows > 1)
        {
                echo "{$charset} exploit successful!\n";
        }

        $mysqli->query("DROP DATABASE {$charset}_db");
}

언급URL : https://stackoverflow.com/questions/28705324/how-to-create-a-sql-injection-attack-with-shift-jis-and-cp932

반응형