'SQL 인젝션'에 해당되는 글 3건

  1. 2015.08.06 WordPress 긴급 보안 업데이트
  2. 2010.03.03 PHP SQL 인젝션(Injection) 공격
  3. 2009.04.28 MySQL 인젝션 공격 방어하는 GreenSQL
2015.08.06 17:59

WordPress 긴급 보안 업데이트

개요

  o Wordpress에서 취약점을 보완한 긴급 보안 패치를 공개

  o 워드프레스 4.2.3과 그 이전 버전에서 XSS 취약점과  SQL 인젝션 취약점이 발견되어 최신버전 업데이트를 권고



영향 받는 소프트웨어

  o WordPress 4.2.3 이하 버전

 


해결 방안

  o 4.2.4 버전으로 업데이트

  - Dashboard(알림판) -> Updates(업데이트)

 

  - Update Now(지금 업데이트클릭


기타 문의사항

  o 한국인터넷진흥원 인터넷침해대응센터국번없이 118

 


[참고사이트]

https://wordpress.org/news/2015/08/wordpress-4-2-4-security-and-maintenance-release/


Trackback 0 Comment 0
2010.03.03 11:56

PHP SQL 인젝션(Injection) 공격

SQL 인젝션

많은 웹 개발자가 SQL 질의가 공격받을 수 있다는 점을 간과하고, SQL 질의를 신뢰할 수 있는 명령으로 가정합니다. 이로 인해 SQL 질의에서 접근 제어를 우회할 수 있여, 일반적인 인증과 인증 확인을 무시하고, 종종 SQL 질의가 OS 단계 명령을 할 수 있도록 합니다.

직접 SQL 명령 인젝션은 공격자가 숨겨진 데이터를 노출하거나, 취약한 부분을 덮어쓰거나, 데이터베이스에 위험한 시스템 단계 명령을 실행하게 하는 SQL 명령을 생성하거나 대체하는 기술입니다. 어플리케이션이 사용자 입력을 받아서, 이를 SQL 질의를 만들 떄 정적 인수로 조합함으로써 일어납니다. 유감스럽게도, 아래 예제들은 실제 이야기를 기반으로 하고 있습니다.

입력 검증이 없고 데이터베이스에 슈퍼유저나 사용자를 만들 수 있는 사용자로 접속하는 경우, 공격자가 데이터베이스에 슈퍼유저를 만들 수 있습니다.

Example #1 결과셋을 페이지로 나눔 ... 그리고 슈퍼유저 만들기 (PostgreSQL)

<?php

$offset 
$argv[0]; // 주의, 입력 검증 없음!
$query  "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";
$result pg_query($conn$query);

?>

일반 사용자는 URL에 $offset이 인코드되어 있는 'next', 'prev' 링크를 클릭합니다. 스크립트는 $offset이 정수라고 생각합니다. 그러나, 누군가가 다음처럼 URL에 추가적인 urlencode() 형식을 덧붙이면 어떻게 될까요?

0;
insert into pg_shadow(usename,usesysid,usesuper,usecatupd,passwd)
    select 'crack', usesysid, 't','t','crack'
    from pg_shadow where usename='postgres';
--

이렇게 되면, 스크립트에서 슈퍼유저 권한을 공격자에게 주게 됩니다. 0;가 유효한 offset으로 제공되어 원래 질의를 유효하게 하고 정료하는 점에 주의하십시오.

Note: SQL 해석기에서 개발자가 쓴 쿼리의 나머지 부분을 무시하게 하는 일반적인 방법은 --를 붙이는 것이며, 이는 SQL에서 주석 부호입니다.

패스워드를 얻는 방법 중 하나는 검색 결과 페이지를 우회하는 것입니다. 공격자에게 필요한 것은 제출한 변수 중 하나라도 제대로 다뤄지지 않으면서 SQL 구문에 사용되는 것입니다. 이러한 필터는 일반적으로 SELECT 구문에서 WHERE, ORDER BY, LIMIT, OFFSET에 사용됩니다. 데이터베이스가 UNION 구조를 지원하면, 공격자는 원래 질의에 전체 질의를 덧붙여서 임의의 테이블에서 패스워드를 얻을 수 있습니다. 암호화된 패스워드 필드를 강력히 권합니다.

Example #2 글을 출력함 ... 그리고 패스워드도 (모든 데이터베이스 서버)

<?php

$query  
"SELECT id, name, inserted, size FROM products
                  WHERE size = '
$size'
                  ORDER BY 
$order LIMIT $limit$offset;";
$result odbc_exec($conn$query);

?>

질의에서 정적인 부분은 모든 패스워드를 가져오는 SELECT 구문과 조합될 수 있습니다:

'
union select '1', concat(uname||'-'||passwd) as name, '1971-01-01', '0' from usertable;
--

이 질의('--로 다룸)가 $query에서 사용하는 변수 중 하나에 할당되면, 질의 괴물이 깨어납니다.

SQL UPDATE도 공격받을 수 있습니다. 이런 질의를 잘라내어서 완전한 새 질의를 덧붙일 수 있습니다. 또한 공격자가 SET 절을 다룰 수도 있습니다. 이 경우 질의를 성공적으로 변경하기 위하여 일부 스키마 정보를 가지고 있어야 합니다. 이는 폼 변수명을 조사하거나, 브루트 포스로 얻을 수 있습니다. 패스워드와 사용자이름을 저장하는 필드의 이름 규칙은 그리 많지 않습니다.

Example #3 패스워드 재설정에서 ... 더 많은 권한 얻기 (모든 데이터베이스 서버)

<?php
$query 
"UPDATE usertable SET pwd='$pwd' WHERE uid='$uid';";
?>

악의적인 사용자가 $uid' or uid like'%admin'; -- 값을 넣어서 관리자 패스워드를 변경하거나, $pwd"hehehe', admin='yes', trusted=100 "(마지막 공백 포함)을 설정하여 권한을 얻을 수도 있습니다. 그러면, 질의가 다음처럼 꼬입니다:

<?php

// $uid == ' or uid like'%admin%'; --
$query "UPDATE usertable SET pwd='...' WHERE uid='' or uid like '%admin%'; --";

// $pwd == "hehehe', admin='yes', trusted=100 "
$query "UPDATE usertable SET pwd='hehehe', admin='yes', trusted=100 WHERE
...;"
;

?>

데티어베이스 호스트의 OS 등급 명령에 접근하는 섬뜩한 예제입니다.

Example #4 데이터베이스 호스트 OS 공격하기 (MSSQL 서버)

<?php

$query  
"SELECT * FROM products WHERE id LIKE '%$prod%'";
$result mssql_query($query);

?>

공격자가 $proda%' exec master..xp_cmdshell 'net user test testpass /ADD' -- 값을 제출하면, $query는:

<?php

$query  
"SELECT * FROM products
                    WHERE id LIKE '%a%'
                    exec master..xp_cmdshell 'net user test testpass /ADD'--"
;
$result mssql_query($query);

?>

MSSQL 서버는 로컬 계정 데이터베이스에 새 사용자를 추가하는 명령을 포함한 SQL 구문을 실행하게 됩니다. 어플리케이션이 sa로 실행되고 MSSQLSERVER 서비스가 적합한 권한을 가지고 있으면, 공격자는 머신에 접근할 수 있는 계정을 가지게 됩니다.

Note: 위 예제 중 일부는 특정 데이터베이스 서버에 묶여 있습니다. 이것은 다른 서버에 유사한 공격이 불가능하다는 의미가 아닙니다. 데이터베이스 서버가 다른 방식으로 비슷한 취약점을 가질 수 있습니다.


출처 : php.net


Trackback 0 Comment 0
2009.04.28 20:38

MySQL 인젝션 공격 방어하는 GreenSQL

GreenSQL( http://www.greensql.net/ )은 MySQL에 대한 SQL 인젝션(Injection) 공격을 방어하는 프락시 개념의 어플리케이션이다. 웹페이지를 호출하면 DB쿼리는 먼저 GreenSQL 로 넘어겨지고, 검사한 후 정상적이면 MySQL 서버로 요청하는 과정을 거친다.
GreenSQL을 설치하고 실행과정은 이렇다. MySQL 서버는 기존 그대로 실행(디폴트 3306 포트)하고, GreenSQL을 3305포트로 실행(127.0.0.1:3305)한다. 이 때 GreenSQL은 MySQL 서버로 커넥션이 이뤄진다. 웹페이지는 DB커넥션을 GreenSQL의 3305포트로 커넥션하도록 변경해주면 된다. (MySQL을 3305로, GreenSQL을 3306으로 실행할 수도 있을 것이다.)

[ 이미지 출처 : GreenSQL 홈페이지 ]

DB 쿼리의 정상, 비정상은 어떻게 판단하는가?

1) '관리자가 실행할 SQL 유형'이나 '민간한 형태의 SQL 유형'(flush privileges, show 명령, 불법적 형태 등)을 패턴 매칭 방식으로 찾아서 불법 요청으로 간주한다. 예를들면 DB관리 명령어, DB 스키마를 변경시도하는 경우, 시스템 파일을 액세스하려는 경우 등을 불법으로 간주한다. 이 패턴에 대해서는 설정 파일을 통해서 변경이 가능하다.

2) 그후 각 쿼리 유형에는 점수가 할당되어 있는데, 이 점수를 합산한다. 지정된 값 이상이 될 경우, 경고 메시지를 뿌려주거나 차단할 수 있다. 유형은 다음과 같다.

* Access to sensitive tables increases risk query (users, accounts, credit information)
* Comments inside SQL commands increases query risk
* Usage of an empty password string
* Found ‘or’ token inside query
* Found SQL expression that always return true (SQL tautology)
* Comparison of constant values (SQL tautology)
* ... 등 ...

점수는 설정 파일을 통해서 변경이 가능하다. 다음은 샘플 설정 파일의 일부이다.
# If query risk is bigger then specified value, query will be blocked
block_level = 30
# Level of risk used to generate warnings. It is recomended to run application
# in low warning level and then to acknowledge all valid queries and
# then to lower the block_level
warn_level=20
# Risk factor associated with SQL comments
risk_sql_comments=30

차단된 샘플 로그이다. (sCag님 제공. 감사합니다.)

2008-12-09 16:54:18 mysql SELECT * FROM user WHERE name = 'x' or 1=1; --' AND pwd=SHA('')  blocked

GreenSQL에 대한 결론이다.

  • 멋진 생각이다. ^^
  • 패턴 설정과 차단수준을 유동적으로 변경 가능하다.
  • 대부분의 리눅스 배포판을 지원하며, FreeBSD도 지원한다.
  • 성능 테스트 결과 약간의 성능 저하가 발생한다. (2~12%정도)
  • 대용량 서비스에서 사용하기는 무리가 있을 것 같다.
  • 소규모 사이트나 웹호스팅에서는 고려해볼만 하다.
  • SQL Relay(DB 풀링과 로드발런싱 등)에서 제공하는 기능 등이 하나로 합쳐진다면 멋질 것 같다.


출처 : http://truefeel.tistory.com/

Trackback 0 Comment 0