소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
[AllowAnonymous]
속성을 사용하여 [Authorize]
속성이 부여한 권한 부여를 우회합니다.[Authorize]
속성을 클래스 또는 메서드에 추가하여 응용 프로그램 작업에 권한 부여가 필요하도록 만들 수 있습니다. 또한 [AllowAnonymous]
속성을 추가하여 응용 프로그램 클래스 또는 메서드의 지정된 권한 부여 요구 사항을 우회할 수 있습니다. 둘 다 지정하면 [AllowAnonymous]
속성이 우선적으로 적용되고 [Authorize]
속성을 우회합니다. 이로 인해 공격자가 민감한 데이터 및 작업에 임의로 익명으로 액세스할 수 있습니다.[Authorize]
속성을 재정의하는 클래스 수준의 [AllowAnonymous]
속성을 보여줍니다. secretAction()
메서드는 [Authorize]
속성이 있음에도 불구하고 권한 부여가 필요하지 않습니다.예제 2: 다음 예제는 하위 클래스의 메서드에 설정된
...
[AllowAnonymous]
public class Authorization_Test
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[Authorize]
속성을 재정의하는 슈퍼클래스 클래스 수준의 [AllowAnonymous]
속성을 보여줍니다. 상속된 클래스 Inherit_AA
의 [AllowAnonymous]
속성으로 인해 secretAction()
메서드는[Authorize]
속성을 지정함에도 불구하고 권한 부여가 필요하지 않습니다.예제 3: 다음은 상속이 있는 메서드 수준에서
...
[AllowAnonymous]
public abstract class Inherit_AA
{
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public IActionResult secretAction()
{
}
}
...
[Authorize]
속성을 재정의하는 [AllowAnonymous]
속성을 보여줍니다. 상속된 메서드 secretAction()
의 [AllowAnonymous]
속성으로 인해 secretAction()
메서드는[Authorize]
속성을 지정함에도 불구하고 권한 부여가 필요하지 않습니다.
...
public abstract class Inherit_AA
{
[AllowAnonymous]
public abstract IActionResult secretAction()
{
}
}
public class Authorization_Test:Inherit_AA
{
[Authorize]
public override IActionResult secretAction()
{
}
}
...
<apex:page controller="accessControl">
<apex:pageBlock >
<apex:pageBlockSection >
<apex:outputText value="Survey Name: "/>
<apex:inputText value="{!surveyName}"/>
</apex:pageBlockSection>
<apex:pageBlockSection >
<apex:outputText value="New Name: "/>
<apex:inputText value="{!newSurveyName}"/>
</apex:pageBlockSection>
<apex:pageBlockSection >
<apex:commandButton value="Update" action="{!updateName}"/>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:page>
public String surveyName { get; set; }
public String newSurveyName { get; set; }
public PageReference updateName() {
Survey__c s = [SELECT Name FROM Survey__c WHERE Name=:surveyName];
s.Name = newSurveyName;
update s;
PageReference page = ApexPages.currentPage();
page.setRedirect(true);
return page;
}
String canned_acl = request.getParameter("acl");
CreateBucketRequest createBucketRequest = CreateBucketRequest.builder()
.bucket("foo")
.acl(canned_acl)
.createBucketConfiguration(CreateBucketConfiguration.builder().locationConstraint(region.id()).build())
.build();
acl
매개 변수를 선택한다고 해도 공격자는 이를 public-read-write
로 설정하고 버킷에 대한 전체 익명 액세스 권한을 부여할 수 있습니다.
...
String selectedInvoice = request.getParameter("invoiceDate");
...
AmazonSimpleDBClient sdbc = new AmazonSimpleDBClient(appAWSCredentials);
GetAttributesResult sdbResult = sdbc.getAttributes(new GetAttributesRequest("invoices", selectedInvoice));
...
Example 1
의 코드는 현재 사용자의 송장 목록을 생성하지만 공격자는 이 동작을 무시하고 원하는 송장을 요청할 수 있습니다. 이 예제의 코드가 사용자가 요청한 송장에 접근할 수 있는 권한이 있는지 확인하지 않기 때문에 현재 사용자의 송장이 아닌 송장도 모두 표시합니다.
...
id = this.getIntent().getExtras().getInt("id");
cursor = db.query(Uri.parse(invoices), columns, "id = ? ", {id}, null, null, null);
...
id
의 가능한 모든 값을 고려할 수 없다는 점입니다. 쿼리에서 현재 사용자의 송장 ID 목록을 생성하지만 공격자는 이 동작을 무시하고 원하는 송장을 요청할 수 있습니다. 이 예제의 코드가 사용자가 요청한 송장에 접근할 수 있는 권한이 있는지 확인하지 않기 때문에 현재 사용자의 송장이 아닌 송장도 모두 표시합니다.DirectoryEntry de
를 생성합니다.
...
de = new DirectoryEntry("LDAP://ad.example.com:389/ou=People,dc=example,dc=com");
...
de
에 대해 실행된 모든 LDAP 쿼리는 authentication 및 access control 없이 수행됩니다. 공격자는 디렉터리의 액세스 제어 메커니즘으로 보호되는 레코드에 대한 액세스를 얻기 위해 예기치 못한 방법으로 이러한 쿼리 중 하나를 조작할 수도 있습니다.ldap_simple_bind_s()
를 사용하여 LDAP 디렉터리에 익명으로 바인딩합니다.
...
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
...
}
...
ld
에 대해 실행된 모든 LDAP 쿼리는 authentication 및 access control 없이 수행됩니다. 공격자는 디렉터리의 액세스 제어 메커니즘으로 보호되는 레코드에 대한 액세스를 얻기 위해 예기치 못한 방법으로 이러한 쿼리 중 하나를 조작할 수도 있습니다.DirContext ctx
를 생성합니다.
...
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
...
ctx
에 대해 실행된 모든 LDAP 쿼리는 authentication 및 access control 없이 수행됩니다. 공격자는 디렉터리의 액세스 제어 메커니즘으로 보호되는 레코드에 대한 액세스를 얻기 위해 예기치 못한 방법으로 이러한 쿼리 중 하나를 조작할 수도 있습니다.
...
$ldapbind = ldap_bind ($ldap, $dn, $password = "" );
...
...
PARAMETERS: p_xfeld TYPE xfeld.
...
CALL FUNCTION 'BAPI_EMPLOYEE_GETDATA'
EXPORTING
employee_id = emp_id
authority_check = p_xfeld
IMPORTING
return = ret
TABLES
org_assignment = org_data
personal_data = pers_data
internal_control = con_data
communication = comm_data
archivelink = arlink.
...
p_xfeld
매개 변수에 공백을 제공하면 직원의 개인 정보 및 연락처 정보를 반환하기 전에 권한 부여 검사가 수행되지 않습니다.