it-swarm-korea.com

최대 피해를 입히기 위해 "PHP_MAGIC_QUOTES ON"취약점을 악용하는 방법은 무엇입니까?

내가 유지하는 일부 시스템에서 SQL 주입 익스플로잇을 많이 발견했습니다. 나는 주입을 예방하는 방법을 알고 있지만, 우리의 애플리케이션을 안전하게 유지하는 데 충분한 초점이 없다면 그것이 얼마나 위험한지 CEO와 CTO에게 보여주고 싶습니다.

보안과 관련하여 사전 조치 대신 대응해야하는 경우가 많습니다. 주로 취약성이 발견되면 악용 될 가능성이 적기 때문에 수정하는 데 우선 순위가 지정되지 않기 때문입니다.

다음 쿼리는 이러한 예 중 하나입니다. 서버는 PHP_MAGIC_QUOTES ON (예, 정말 나쁘다는 것을 알고 있습니다)으로 실행되고 있으므로 프로그래머가 쿼리에 사용되는 모든 입력 값 주위에 ''를 명시 적으로 추가했기 때문에 여러 곳에서 악용을 방지 할 수 있습니다 (따라서 벗어날 수 없음). 그러나 지금 취약한 것으로 확인 된 쿼리는 문자열 대신 정수로 처리되며 주변에 ''가 포함되어 있지 않습니다.

다음은 그 예입니다.

$sql = "select * from vulnerable_table where id = " . $_GET['id'] . " limit 1"; 
$result= mysql_query($sql); 

Id 변수를 제어하는 ​​것을 고려할 때 시스템에 최대 손상을 어떻게 줄 수 있습니까?.

내가 스스로 생각 해낸 몇 가지 예 :

id = 1;drop table mysql.user 
Only if semi colon is accepted

id = 1;SELECT '<?php exec($_get['cmd'])?>' INTO OUT_FILE('/var/www/backdoor.php')
Only if I could bypass the magic_quotes somehow
22
Chris Dale

PHP에서는 세미콜론으로 쿼리를 스택 할 수 없습니다. 그러나 쿼리를 괄호 (일반적으로 하위 쿼리라고 함)로 다른 쿼리에 중첩 할 수 있습니다. 예 :

SELECT * FROM vulnerable_table WHERE id = (SELECT number from other_table)

이 기술을 사용하면 (SQL 결과 출력 여부에 관계없이) 예리한 공격자가 데이터베이스에서 모든 데이터를 추출 할 수 있습니다.

예 (웹 페이지에 출력 포함)

SELECT * FROM vulnerable_table WHERE id = (SELECT group_concat(table_name) from information_schema.tables WHERE version = 10)

이 쿼리는 데이터베이스에있는 모든 사용자 정의 테이블의 목록 (문자열)을 생성합니다. 추가 쿼리는 열을 표시하고 공격자가 테이블 구조 (예 : "tbl_accounts, tbl_passwords, tbl_guestbook")에 대한 완전한 지식을 얻도록합니다.

웹 페이지에 출력을 제공하지 않으면 공격자가 SQL 하위 쿼리와 함께 조건부 (예 : case-when) 문을 삽입 할 수 있습니다. 그러면 한 경우에는 SQL 오류가 발생하고 다른 경우에는 오류가 발생하지 않습니다. "전혀 출력 없음"과 일반 웹 페이지에서 파생되어 1 비트의 정보를 수집하고 데이터베이스를 통해 이진 검색을 수행 할 수 있습니다.

PHP-Backdoor를 업로드하도록 제안한 것과 같은 SQL 쿼리에서 문자열을 생성하는 것 (현재 MySQL 사용자에게 FILE 권한이 있는지 여부에 따라 다름)도 그렇게 어렵지 않습니다. ascii () 사용 , ord () 함수는 정수 입력으로 문자열을 생성 할 수 있습니다. 또한 0x414141과 같은 값은 MySQL에서 자동으로 'AAA'로 변환됩니다.

매우 진보 된 공격 및 필터 회피 기술에 관해서는 SQL 보안에 대한 Reiners의 블로그를 읽어 보시기 바랍니다. http://websec.wordpress.com/

완전성을 위해 :이 취약점을 수정하려면 typecast를 수행하고 $ _GET [ 'id']를 정수로 변환하면됩니다.

18
freddyb

회사가 보안 (미국의 SOX 또는 HIPPA와 같은) 또는 무역 표준 (PCI 또는 다양한 ISO 표준과 같은)을 요구하는 규정의 일부인 경우 다음 사항을 알리기 만하면됩니다.

  • 누군가가 전체 데이터베이스와 네트워크를 다운로드 할 수있는 구멍을 발견했습니다 (판매해야하는 경우 진실을 조금 더 늘리고 ACS : Law 누출을 상기시킵니다).
  • 데이터를 잃어 버리거나 해킹당한 다른 회사에 얼마나 많은 시간과 비용이 들었는지에 대한 정확한 수치를 알려주십시오.
  • 감사를 받으면 표준을 준수하지 않아 회사에 벌금이 부과되거나 해고 될 수 있습니다.
  • 소송을 당하거나 기소를 당하고 알려진 문제 나 주요 잠재적 문제를 무시했다는 증거가 있다면 징벌 적 손해 배상만으로도 회사를 파산시킬 수 있습니다. (Ford Pinto 소송을 참조하십시오.)

회사 변호사에게 나쁜 소식을 전하도록 이야기 할 수 있다면 더 효과적 일 것입니다. 그래도 작동하지 않으면 회사를 구할 수있는 것은 없습니다.

당신이 무엇을 하든지, 자신을 악용하는 것을 잊으십시오. 서면 허가없이 그렇게하면 소송과 감옥에 갇히게되지만, 목적을 위해 특별히 설정 한 테스트 계정에서 작동한다는 것을 보여주는 작은 증거가 효과가있을 수 있습니다.

11
SilverbackNet

가능한 정보 추출 (파일 읽기 또는 데이터베이스 사용자 정보 추출 등) 및 서버 리소스 소비가 있습니다. 첫 번째는 쿼리에서 UNION 문을 사용하여 달성 할 수 있습니다. 두 번째는 BENCHMARK () 함수를 사용하여 수행됩니다. 언급 된 기능을 사용하여 데이터 추출도 가능합니다.

나는 여기에 예제를 보여주고 싶지 않습니다. 그들은 모두 인터넷에 있습니다. 그리고 시스템 관리자로서 케이스를 재현 할 수 있다고 생각합니다. 정말로 필요하다면 의견을 말하십시오.

그건 그렇고, 파일에 쓸 수 있도록 지원하기 위해 세미 콜론이 필요하지 않습니다 (하지만 파일에 쓰기 액세스가 필요합니다).

4
anonymous

나는이 만화가 모든 것을 말한다고 생각한다. 작은 바비 테이블

3
Dave

id =

0 OR id <> 0

iD 사용을 완전히 우회하면 해커가 전체 테이블을 덤프 할 수 있습니다.

2
Matthew Read

최대 피해는 상대적입니다. 감지하기 어려운 작은 데이터를 지속적으로 이산 적으로 삽입하는 것은 한 번에 많은 양의 데이터를 파괴하는 것보다 훨씬 더 치명적일 수 있습니다.

잠재적으로 더 나쁜 상황은 단순히 몇 달/년에 걸친 데이터를 읽는 것일 수 있습니다. 해당 데이터베이스에 몇 개의 신용 카드 번호를 저장합니까? 암호?

아무도 SQL 주입의 은색 총알을 보여줄 수 없습니다. 보관하는 데이터, 공격자의 기술, 내부 지식이 있는지 여부, 스키마 아키텍처 등에 따라 다릅니다.

2
bahamat

사이트가 Drupal 인 경우 사용자 테이블에서 사용자 1의 비밀번호를 변경하여 관리 액세스를 제공 할 수 있으며, 이제 관리자 권한으로 사이트를 탐색 할 수있는 기능이 있기 때문에 나중에 더 많은 표적 손상을 입힐 수 있습니다.

0
Dave Keays