googleAdsense_widever


paros - custom :: 파라미터 변조 요청 기능 분석 Computer & Tools


PATH : src\org\parosproxy\paros\core\scanner\plugin\TestParameterTamper.java


[faculty logic] : crawl > receive data > store > add pattern > send pattern > store > reporting


[SOURCE]
----- source start -----
package org.parosproxy.paros.core.scanner.plugin;

import java.util.regex.Pattern;

import org.parosproxy.paros.core.scanner.AbstractAppParamPlugin;
import org.parosproxy.paros.core.scanner.AbstractPlugin;
import org.parosproxy.paros.core.scanner.Alert;
import org.parosproxy.paros.core.scanner.Category;
import org.parosproxy.paros.network.HttpMessage;
import org.parosproxy.paros.network.HttpStatusCode; //http 상태 코드 정의.


public class TestParameterTamper extends AbstractAppParamPlugin {

/* parameter 변조에 사용할 문자열 정의.
GET /url/param=@
GET /url/param=+
GET /url/param=%00
등으로 parameter를 변조하여 보내게 된다.
*/
private static String[] PARAM_LIST = {"", "", "@", "+", AbstractPlugin.getURLDecode("%00") , "|"};

/* 변조 pattern 삽입 시, 발생할지 모르는 부적절한 에러문자열 정의. */
private static Pattern patternErrorJava1 = Pattern.compile("javax\\.servlet\\.\\S+", PATTERN_PARAM);
private static Pattern patternErrorJava2 = Pattern.compile("invoke.+exception|exception.+invoke", PATTERN_PARAM);
private static Pattern patternErrorVBScript = Pattern.compile("Microsoft(\\s+|&nbsp)*VBScript(\\s+|&nbsp)+error", PATTERN_PARAM);
private static Pattern patternErrorODBC1 = Pattern.compile("Microsoft OLE DB Provider for ODBC Drivers.*error", PATTERN_PARAM);
private static Pattern patternErrorODBC2 = Pattern.compile("ODBC.*Drivers.*error", PATTERN_PARAM);
private static Pattern patternErrorJet = Pattern.compile("Microsoft JET Database Engine.*error", PATTERN_PARAM);
private static Pattern patternErrorPHP= Pattern.compile(" on line <b>", PATTERN_PARAM);
private static Pattern patternErrorTomcat= Pattern.compile("(Apache Tomcat).*(^Caused by:|HTTP Status 500 - Internal Server Error)", PATTERN_PARAM);


// getId(), getName(), getDependency(), getDescription(), getCategory(), get Reference(), init() 함수 모두 생략.

// scan : 수집된 url 정보에 parameter modulation pattern injection.
public void scan(HttpMessage msg, String param, String value) {

String bingoQuery = null;

// always try normal query first
HttpMessage normalMsg = getNewMsg();

// error exception process on sending HTTP data.
try {
sendAndReceive(normalMsg);
} catch (Exception e) {
return;
}

/*
응답코드가 200이 아닌, 비정상 페이지라면 패턴을 전송하지 않음.
org.parosproxy.paros.network.HttpStatusCode 에 정의되어 있음.
*/
if (normalMsg.getResponseHeader().getStatusCode() != HttpStatusCode.OK) {
return;
}

for (int i=0; i<PARAM_LIST.length; i++) {
msg = getNewMsg();
if (i==0) {
// remove entire parameter when i=0;
bingoQuery = setParameter(msg, null, null);
} else {
bingoQuery = setParameter(msg, param, PARAM_LIST[i]);

}
try {
sendAndReceive(msg);
if (checkResult(msg, bingoQuery, normalMsg.getResponseBody().toString())) {
return;
}

} catch (Exception e) {
}

}


}

private boolean checkResult(HttpMessage msg, String query, String normalHTTPResponse) {

StringBuffer sb = new StringBuffer();

if (msg.getResponseHeader().getStatusCode() != HttpStatusCode.OK
&& !HttpStatusCode.isServerError(msg.getResponseHeader().getStatusCode())) {
return false;
}

/*
수집된 응답 페이지와 변조 삽입 페이지를 비교.
동일한 경우 에러처리가 잘 된 페이지이기 때문에 버린다.
*/
if (msg.getResponseBody().toString().equals(normalHTTPResponse)) {
return false;
}

/*
탐지된 문자열이 있는 경우, Bingo() 함수를 호출.
bingo 함수는 src\org\parosproxy\paros\core\scanner\AbstractPlugin.java 에 정의되어 있다.
*/
if (matchBodyPattern(msg, patternErrorJava1, sb) && matchBodyPattern(msg, patternErrorJava2, null)) {

bingo(Alert.RISK_MEDIUM, Alert.WARNING, null, (query == null || query.length() == 0)? "nil" : query, sb.toString(), msg);
return true;
} else if (matchBodyPattern(msg, patternErrorVBScript, sb)
|| matchBodyPattern(msg, patternErrorODBC1, sb)
|| matchBodyPattern(msg, patternErrorODBC2, sb)
|| matchBodyPattern(msg, patternErrorJet, sb)
|| matchBodyPattern(msg, patternErrorTomcat, sb)
|| matchBodyPattern(msg, patternErrorPHP, sb)) {
bingo(Alert.RISK_MEDIUM, Alert.SUSPICIOUS, "", (query == null || query.length() == 0)? "nil" : query, sb.toString(), msg);

return true;
}

return false;

}

}
----- source end -----



덧글

댓글 입력 영역


공지

어서오십시오.
트위터 : @FCliver
기저심리학 : 네이버카페
카카오톡 : FCliver
페이스북 : Fredric Cliver

통계 위젯 (화이트)

1520
105
286341

접속자 위치