복붙노트

[SQL] 빌 &는 SQL 주입 - UTF8 POC

SQL

빌 &는 SQL 주입 - UTF8 POC

addslashes와 mysql_real_escape 기능이 주사를 방지하기 위해 안전하지 않습니다 방법에 대한 많은 이야기가있다. 진실은 심지어 큰 프레임 워크 또는 워드 프레스 같은 CMS가이 기능을 사용하는 것입니다 그리고 그들은 지금까지 하나님의 일을하고 있어요.

나는 GBK 캐릭터 세트를 사용하는 일부 특정 시나리오가 알고있는, 또는 utf8_decode는 일부 SQL 코드, 또는 1 'OR 1과 같은 몇 가지 간단한 예제를 주입하는 데 사용할 수 있습니다 - 참여 간단한있을 때 사용할 수.

문자 집합이 UTF-8과 현실을 인정하자, 이것은 가장 일반적인 시나리오입니다 경우, 약간의 연구 후 사용 addslashes 또는 mysql_real_escape과 간단한 쿼리에 주사한다 뭔가 열심히 보인다.

그래서,이 초보자 스크립트 제공, pls는 SQL 삽입 POC를 제공 (UTF-8 캐릭터 세트를 기억)

$mysql['username'] = addslashes($_POST['username']);
$mysql['password'] = addslashes($_POST['password']);

$sql = "SELECT *
FROM users
WHERE username = '{$mysql['username']}'
AND password = '{$mysql['password']}'";

업데이트 - 난 그냥 간단한 예제가 아니라 과정의 완전 공개가 필요합니다. 심지어 구글에서 링크가 작동하지 않을 수 있습니다.

해결법

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

    1.업데이트 2 :

    업데이트 2 :

    혼자 SET 명칭과 결합 될 때 추가 연구 후, 5.0.77에 MySQL의 버전 이전은 GBK 문제에 취약 할 수 있습니다. 그것은 이전에만 5.0.22 이전 버전이 취약한 것으로 믿어졌다.

    당신이 mysql_set_charset / mysqli_set_charset이 도입 된 PHP 버전 이전의 5.2을 사용하는 경우, 코드는 특정 아래에 취약 할 수 있음이 수단은 조건을 잘 만들어진.

    당신이 PHP 5.1에 붙어 있다면, 나중에 MySQL은 5.0.77 이상을 사용하고 있는지 확인하십시오. 5.0.77는 "전용"두 살,하지만 RHEL / CentOS는 5.x를위한 저장소로 푸시 된, 더 인기있는 분포는 MySQL의 5.0.x는 시리즈와 PHP의의 5.1.x 시리즈 붙어.

    사람들을 업그레이드하세요!

    업데이트 1 : MySQL은 5.0.22에서의 버그 수정 : 또 다른 최근의 문제는 GBK 일의 원인을 발견했다. mysql_set_charset 대신 단지 SET 명칭과 결합는 mysql_real_escape_string 이외의 것을 사용하는 경우이 이전 버전 심각하게 취약하다. mysqli equivilent는 mysqli_set_charset 지정됩니다.

    PDO에서 mysql_set_charset의 equivilent있을 나타나지 않습니다. 그것은 MySQL의에게 예상대로 SET NAMES 일에 자신의 기본 이스케이프 메커니즘에 대한 충분한, 또는 여부를 문제에서 면역성이있을 수 있습니다 기본 준비된 문을 사용할 수 있기 때문 일 수도있다.

    당신은 알려진 문자 세트로 문자열에 전달하는 것을 보장하기 위해 극단적 인 치료를하기 전에 5.0.22 5.0.77 모든 MySQL 버전을 사용하고 있고 복용하지 않은 경우에 관계없이, 당신은 자신을 공격하는 열 찾을 수 있습니다.

    내 원래의 게시물 수정되지 않은의 나머지 부분을 떠날거야,하지만 난 tldr을 업데이트했습니다.

    이 반 올바른 것입니다. addslashes는 완전히 백 슬래시를 추가하고 때로는 탈출 메커니즘이 완전히 다른 주로하기 때문에, 모든 데이터베이스에 대한 올바른 탈출 방법을 제공하는 보장되지 않기 때문에 SQL 주입을 방지하기 위해 사용하는 잘못된 일이다.

    당신이 (대신 PDO 또는 mysqli를 사용하는)은 "MySQL은"확장자로 알려진 쓰레기의 선사 시대 덩어리의 빈민가에 붙어 있다면, mysql_real_escape_string를 당신이 함께 일부 SQL을 연결할 필요가있을 때 당신이있어 최상의 보호의 일부입니다.

    당신은 아마 잘못된 UTF-8 시퀀스를 만드는 생각,하지만 난 단지 이제까지 XSS 메커니즘, 결코 SQL 주입 메커니즘이를 보았다. 의 iconv를 통해 문자열을 실행 //은 // 음역하여 일반적으로 당신이 공격 받고있어 수용 가능한 고장 모드가 나쁜 순서의 시점에서 문자열을 절단하여 (충분한 보호를해야한다 무시로 - 잘못된 시퀀스에서 발생해서는 안 합법적 인 요청).

    비 라틴 언어로 "따옴표"문자의 많음이있는 동안 또한, MySQL은 실제로 백틱와 큰 따옴표 식별자 및 문자열 값에 대한 작은 따옴표를 순종 꽤 괜찮은이다.

    더 그것에 대해 생각, 아마도 다른 문자 집합으로 간주하는 경우, 중간에 작은 따옴표를 포함 할 수 있습니다 다른 문자 집합의 일부 문자 순서가있다. 그러나, addslashes는 문자 집합 완전히 무지, 그냥 원시 바이트에서 작동하는 것이 매우, 매우 가능성이 높습니다. 이 시퀀스의 중간에 백 슬래시 스틱, 그것을 날려 버릴 것입니다. 그러나, 그건 그냥 나쁜 문자 세트에 대한 정보를 라인을 따라 우는 소리 어딘가에 발생한다.

    이 견적 대신 순서를 보는 경우가 순서를 벗어날 것, 그래서는 mysql_real_escape_string, 다른 한편으로는,,에 내장 된 연결의 문자 집합의 지식으로 설계되었습니다. 이 시퀀스로 대신 따옴표로 인식 할 수 있기 때문에, 전혀 위험이 없다.

    이 문제라고 생각하면 궁극적으로 당신은 단지 예상되는 문자 세트에 입력을받을 수 있도록하고, 불일치가 있다면 원하는 문자 세트에 모든 입력을 변환하는 것은 귀하의 책임입니다. 이것은 거의 경우 지금까지 합법적 인 요청을 여행합니다.

    TL; DR : 아니 당신이 정말 오래된 MySQL 버전을 사용하고 및 / 또는 확인 데이터를 만들기하지 않는 한 우려가 알려진 좋은 문자 집합입니다. 항상 최대 safetey에 대한 데이타베이스 고유의 탈출 메커니즘을 사용하고, 항상 사용자가 당신을 얻기 위해 밖으로 가정합니다.

  2. from https://stackoverflow.com/questions/5139127/php-sql-injection-utf8-poc by cc-by-sa and MIT license