ZAP 스크립팅으로 빠르게 Fake Response 만들기

Response 변조는 인증 절차나 비즈니스 로직을 우회할 때 자주 사용되는 공격 방법 중 하나입니다. 보통은 proxy로 요청을 잡아 직접 response를 수정하여 continue 하는 형태로 테스트를 진행합니다.

{"msg":"fail"} => {"msg":"success"}

가끔은 이 과정을 자주 반복하게 되어야할 때가 있는데요. 이럴 때 ZAP에서는 간단하게 proxy script를 작성해서 지정한 패턴의 URL을 대상으로 원하는 Response를 자동으로 변조하도록 세팅할 수 있습니다.

var patternUrl = "https://www.hahwul.com/zzz"
var resHeaders = "HTTP/1.1 200 OK\r\nContent-Type: application/json; charset=UTF-8"
var resBody = '{"msg":"success"}'

function proxyRequest(msg) {
	if (msg.getRequestHeader().getURI().toString().equals(patternUrl)) {
    // if 문을 equals로 비교하지 않고 정규식으로 검증하면 패턴 기반으로 여러 URL을 처리할 수도 있겠죠.
    // 예를들면..
    // patternUrl.test(msg.getRequestHeader().getURI().toString())

		print('[*] set fake response to ' + msg.getRequestHeader().getURI().toString())

		msg.setResponseBody(resBody);
		msg.setResponseHeader(resHeaders);
		msg.getResponseHeader().setContentLength(msg.getResponseBody().length());
	}
	return true
}

function proxyResponse(msg) {
	return true
}

파일은 github에 올려두었고, 해당 js 파일을 zap의 scripts 탭에서 로드 후 enable 후 사용하시면 됩니다.

enable 후 패턴에 해당하는 페이지에 접근하면 if문에 걸려 로그가 찍히고..

실제로 response도 지정한 데이터로 변조되어 나타납니다 😁

proxy쪽 스크립트는 실제 테스팅에서 자주 쓸 수 있는 부분이라서 Javascript, Ruby, Python 등으로 스크립팅 하실 수 있다면 테스팅 노가다를 많이 줄이고 좀 더 편하게 테스팅을 하실 수 있을거라 생각이 듭니다 :D