입력 검증 및 표현 문제는 메타 문자, 대체 인코딩 및 숫자 표현 때문에 발생합니다. 보안 문제는 입력을 신뢰하기 때문에 발생합니다. 문제로는 "Buffer Overflows", "Cross-Site Scripting" 공격, "SQL Injection", 그 외 여러 가지가 있습니다.
username
및 password
에서 C:\user_info.json
에 있는 JSON 파일로 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 직렬화합니다.
...
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("role");
writer.WriteRawValue("\"default\"");
writer.WritePropertyName("username");
writer.WriteRawValue("\"" + username + "\"");
writer.WritePropertyName("password");
writer.WriteRawValue("\"" + password + "\"");
writer.WriteEndObject();
}
File.WriteAllText(@"C:\user_info.json", sb.ToString());
JsonWriter.WriteRawValue()
를 사용하여 수행되므로 username
및 password
에서 신뢰하지 않는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!
를 사용하는 권한 없는 사용자 mallory
가 username
변수 값을 설정하는 프롬프트에 입력 시 ","role":"admin
을 사용자 이름에 추가한 경우 C:\user_info.json
에 저장된 결과 JSON은 다음과 같습니다.
{
"role":"default",
"username":"mallory",
"role":"admin",
"password":"Evil123!"
}
JsonConvert.DeserializeObject()
로 Dictionary
개체에 병렬화된 경우 다음과 같습니다.
String jsonString = File.ReadAllText(@"C:\user_info.json");
Dictionary<string, string> userInfo = JsonConvert.DeserializeObject<Dictionary<string, strin>>(jsonString);
Dictionary
개체에 있는 username
, password
및 role
키의 결과 값은 각각 mallory
, Evil123!
및 admin
입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory
"관리자" 권한을 잘못 할당합니다.username
및 password
부터 ~/user_info.json
에 있는 JSON 파일까지 권한 없는 사용자("관리자" 역할이 있는 권한 사용자가 아닌 "기본" 역할이 있는 사용자)를 위한 사용자 계정 인증 정보를 직렬화합니다.
...
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
username := r.FormValue("username")
password := r.FormValue("password")
...
jsonString := `{
"username":"` + username + `",
"role":"default"
"password":"` + password + `",
}`
...
f, err := os.Create("~/user_info.json")
defer f.Close()
jsonEncoder := json.NewEncoder(f)
jsonEncoder.Encode(jsonString)
}
username
및 password
에서 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입할 수 있으며, 그러면 직렬화된 JSON 구조가 변경될 수 있습니다. 이 예제에서 암호 Evil123!
를 사용하는 권한 없는 사용자 mallory
가 사용자 이름을 입력할 때 ","role":"admin
을 추가하면 ~/user_info.json
에 저장되는 결과 JSON은 다음과 같습니다.
{
"username":"mallory",
"role":"default",
"password":"Evil123!",
"role":"admin"
}
mallory
"관리자" 권한을 예기치 않게 할당합니다.username
및 password
부터 ~/user_info.json
에 있는 JSON 파일까지 권한 없는 사용자("관리자" 역할이 있는 권한 사용자가 아닌 "기본" 역할이 있는 사용자)를 위한 사용자 계정 인증 정보를 직렬화합니다.
...
JsonFactory jfactory = new JsonFactory();
JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("~/user_info.json"), JsonEncoding.UTF8);
jGenerator.writeStartObject();
jGenerator.writeFieldName("username");
jGenerator.writeRawValue("\"" + username + "\"");
jGenerator.writeFieldName("password");
jGenerator.writeRawValue("\"" + password + "\"");
jGenerator.writeFieldName("role");
jGenerator.writeRawValue("\"default\"");
jGenerator.writeEndObject();
jGenerator.close();
JsonGenerator.writeRawValue()
를 사용하여 수행되므로 username
및 password
에서 신뢰하지 않는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!
를 사용하는 권한 없는 사용자 mallory
가 username
변수 값을 설정하는 프롬프트에 입력 시 ","role":"admin
을 사용자 이름에 추가한 경우 ~/user_info.json
에 저장된 결과 JSON은 다음과 같습니다.
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
JsonParser
로 HashMap
개체에 병렬화된 경우 다음과 같습니다.
JsonParser jParser = jfactory.createJsonParser(new File("~/user_info.json"));
while (jParser.nextToken() != JsonToken.END_OBJECT) {
String fieldname = jParser.getCurrentName();
if ("username".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if ("password".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if ("role".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if (userInfo.size() == 3)
break;
}
jParser.close();
HashMap
개체에 있는 username
, password
및 role
키의 결과 값은 각각 mallory
, Evil123!
및 admin
입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory
"관리자" 권한을 잘못 할당합니다.
var str = document.URL;
var url_check = str.indexOf('name=');
var name = null;
if (url_check > -1) {
name = decodeURIComponent(str.substring((url_check+5), str.length));
}
$(document).ready(function(){
if (name !== null){
var obj = jQuery.parseJSON('{"role": "user", "name" : "' + name + '"}');
...
}
...
});
name
의 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프하도록 검증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 권한 없는 사용자 mallory
가 URL의 이름 매개 변수에 ","role":"admin
를 추가한 경우 JSON은 다음이 됩니다.
{
"role":"user",
"username":"mallory",
"role":"admin"
}
jQuery.parseJSON()
에 의해 구문 분석되고 일반 개체로 설정됩니다. 이는 obj.role
이 이제 "user" 대신 "admin"를 반환함을 의미합니다._usernameField
및 _passwordField
에서 JSON으로 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 직렬화합니다.
...
NSString * const jsonString = [NSString stringWithFormat: @"{\"username\":\"%@\",\"password\":\"%@\",\"role\":\"default\"}" _usernameField.text, _passwordField.text];
NSString.stringWithFormat:
를 사용하여 수행되므로 _usernameField
및 _passwordField
에서 신뢰하지 않는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 인증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!
를 사용하는 권한 없는 사용자 mallory
가 _usernameField
필드에 입력 시 ","role":"admin
을 사용자 이름에 추가한 경우 그 결과 JSON은 다음과 같습니다.
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
NSJSONSerialization.JSONObjectWithData:
로 NSDictionary
개체에 병렬화된 경우 다음과 같습니다.
NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
NSDictionary
개체에 있는 username
, password
및 role
의 결과 값은 각각 mallory
, Evil123!
및 admin
입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory
"관리자" 권한을 잘못 할당합니다.
import json
import requests
from urllib.parse import urlparse
from urllib.parse import parse_qs
url = 'https://www.example.com/some_path?name=some_value'
parsed_url = urlparse(url)
untrusted_values = parse_qs(parsed_url.query)['name'][0]
with open('data.json', 'r') as json_File:
data = json.load(json_File)
data['name']= untrusted_values
with open('data.json', 'w') as json_File:
json.dump(data, json_File)
...
name
의 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 검증되지 않습니다. 따라서 사용자는 JSON 키를 임의로 삽입할 수 있으며 결과적으로 직렬화된 JSON의 구조가 변경될 수 있습니다. 이 예에서 권한이 없는 사용자 mallory
가 URL의 name 매개 변수에 ","role":"admin
을 추가하면 JSON은 다음과 같습니다.
{
"role":"user",
"username":"mallory",
"role":"admin"
}
usernameField
및 passwordField
에서 권한 없는 사용자("관리자" 역할이 있는 권한 사용자와 반대로 "기본" 역할이 있는 사용자)에 대한 사용자 계정 인증 정보를 JSON으로 직렬화합니다.
...
let jsonString : String = "{\"username\":\"\(usernameField.text)\",\"password\":\"\(passwordField.text)\",\"role\":\"default\"}"
usernameField
및 passwordField
에서 신뢰할 수 없는 데이터는 JSON 관련 특수 문자를 이스케이프 처리하도록 검증되지 않습니다. 이를 통해 사용자는 임의적으로 JSON 키를 삽입하여 직렬화된 JSON 구조를 변경할 수 있습니다. 이 예제에서 암호 Evil123!
를 사용하는 권한 없는 사용자 mallory
가 usernameField
필드에 입력 시 ","role":"admin
을 사용자 이름에 추가한 경우 그 결과 JSON은 다음과 같습니다.
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
NSJSONSerialization.JSONObjectWithData:
로 NSDictionary
개체에 병렬화된 경우 다음과 같습니다.
var error: NSError?
var jsonData : NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding), options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
NSDictionary
개체에 있는 username
, password
및 role
의 결과 값은 각각 mallory
, Evil123!
및 admin
입니다. 병렬화된 JSON 값이 유효하다는 추가 확인이 없으면 응용 프로그램이 사용자 mallory
"관리자" 권한을 잘못 할당합니다.