XML 인젝션 공격은 SQL 인젝션과 동일한 원리로, 공격자는 악성코드를 입력하여 자신의 권한을 벗어난 기능을 수행합니다. XML은 데이터를 저장하는 방식으로, 데이터를 수정하거나 쿼리할 때 이스케이프하지 않고 직접 입력하거나 출력하면 XML 인젝션 취약점이 발생한다. 공격자는 XML 데이터 형식을 수정하고 새로운 XML 노드를 추가하여 데이터 처리 프로세스에 영향을 미칠 수 있습니다.
공격
다음은 등록된 사용자 정보를 XML 형식으로 저장하는 예이다.
final String GUESTROLE = "guest_role"; ... //userdata是准备保存的xml数据,接收了name和email两个用户提交来的数据。 String userdata = "<USER role="+ GUESTROLE+ "><name>"+ request.getParameter("name")+ "</name><email>"+ request.getParameter("email")+ "</email></USER>"; //保存xml userDao.save(userdata);
보시다시피 이 코드는 어떠한 필터링 작업도 수행하지 않는다. 일반 사용자가 등록하면 다음과 같은 데이터 레코드가 생성됩니다.
<?xml version="1.0" encoding="UTF-8"?> <USER role="guest_role"> <name>user1 </name> <email>user1@a.com </email> </USER>
공격자가 자신의 이메일을 입력하면 다음 코드를 입력할 수 있습니다.
user1@a.com</email></USER><USER role="admin_role"><name>lf</name><email>user2@a.com
최종 사용자가 등록한 후, 데이터는 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?> <USER role="guest_role"> <name>user1 </name> <email>user1@a.com</email> </USER> <USER role="admin_role"> <name>lf</name> <email>user2@a.com </email> </USER>
보시다시피 role="admin_role"인 추가 관리자 lf가 있습니다. 공격 목적을 달성합니다.
방어
옛말처럼 공격이 있는 곳에 방어가 있다. 방어의 원칙은 실제로 매우 간단합니다. 키 문자열을 이스케이프하는 것입니다:
& --> & < --> < > --> > " --> " ' --> '
XML을 저장하고 표시하기 전에 데이터 부분만 이스케이프합니다:
String userdata = "<USER role="+ GUESTROLE+ "><name>"+ StringUtil.xmlencode(request.getParameter("name"))+ "</name><email>"+ StringUtil.xmlencode(rrequest.getParameter("email"))+ "</email></USER>";
이렇게 됩니다. .
위 내용은 웹 보안의 XML 인젝션 샘플 코드에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!