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.
...
string password = Request.Form["db_pass"]; //gets POST parameter 'db_pass'
SqlConnection DBconn = new SqlConnection("Data Source = myDataSource; Initial Catalog = db; User ID = myUsername; Password = " + password + ";");
...
db_pass
, como:
...
password := request.FormValue("db_pass")
db, err := sql.Open("mysql", "user:" + password + "@/dbname")
...
db_pass
, como:
username = req.field('username')
password = req.field('password')
...
client = MongoClient('mongodb://%s:%s@aMongoDBInstance.com/?ssl=true' % (username, password))
...
password
, como:
hostname = req.params['host'] #gets POST parameter 'host'
...
conn = PG::Connection.new("connect_timeout=20 dbname=app_development user=#{user} password=#{password} host=#{hostname}")
...
host
, como:content://my.authority/messages
content://my.authority/messages/123
content://my.authority/messages/deleted
content://my.authority/messages/deleted
fornecendo um código msgId com o valor deleted
:
// "msgId" is submitted by users
Uri dataUri = Uri.parse(WeatherContentProvider.CONTENT_URI + "/" + msgId);
Cursor wCursor1 = getContentResolver().query(dataUri, null, null, null, null);
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var url:String = String(params["url"]);
var ldr:Loader = new Loader();
var urlReq:URLRequest = new URLRequest(url);
ldr.load(urlReq);
...
message
, e a exibe ao usuário.
client = openai.OpenAI()
res = client.chat.completions.create(...)
message = res.choices[0].message.content
self.writeln(f"<p>{message}<\p>")
text/html
. Portanto, o XSS só será possível se a resposta usar esse tipo MIME ou qualquer outro que também force o navegador a renderizar a resposta como HTML ou outro documento que possa executar scripts, como imagens SVG. (image/svg+xml
), documentos XML (application/xml
), etc. application/octet-stream
. No entanto, alguns navegadores, como o Internet Explorer, executam o que é conhecido como Content Sniffing
. O Content Sniffing envolve ignorar o tipo MIME fornecido e tentar inferir o tipo MIME correto pelo conteúdo da resposta.text/html
é apenas um tipo MIME que pode levar a vulnerabilidades de XSS. Outros documentos que podem executar scripts, como imagens SVG (image/svg+xml
), documentos XML (application/xml
), assim como outros, podem levar a vulnerabilidades de XSS, independentemente de o navegador executar o Content Sniffing. <html><body><script>alert(1)</script></body></html>
, poderia ser renderizada como HTML mesmo se seu cabeçalho content-type
estivesse definido como application/octet-stream
,multipart-mixed
, e assim por diante.application/octet-stream
.
@RestController
public class SomeResource {
@RequestMapping(value = "/test", produces = {MediaType.APPLICATION_OCTET_STREAM_VALUE})
public String response5(@RequestParam(value="name") String name){
return name;
}
}
name
definido como <html><body><script>alert(1)</script></body></html>
, o servidor produzirá a seguinte resposta:
HTTP/1.1 200 OK
Content-Length: 51
Content-Type: application/octet-stream
Connection: Closed
<html><body><script>alert(1)</script></body></html>
text/html
. Portanto, o XSS só será possível se a resposta usar esse tipo MIME ou qualquer outro que também force o navegador a renderizar a resposta como HTML ou outro documento que possa executar scripts, como imagens SVG. (image/svg+xml
), documentos XML (application/xml
), etc. application/json
. No entanto, alguns navegadores, como o Internet Explorer, executam o que é conhecido como Content Sniffing
. O Content Sniffing envolve ignorar o tipo MIME fornecido e tentar inferir o tipo MIME correto pelo conteúdo da resposta.Vale a pena notar, no entanto, que um tipo MIME de text/html
é apenas um tipo MIME que pode levar a vulnerabilidades de XSS. Outros documentos que podem executar scripts, como imagens SVG (image/svg+xml
), documentos XML (application/xml
), assim como outros, podem levar a vulnerabilidades de XSS, independentemente de o navegador executar o Content Sniffing. <html><body><script>alert(1)</script></body></html>
, poderia ser renderizada como HTML, mesmo se o cabeçalho content-type
estiver definido como application/json
.application/json
.
def mylambda_handler(event, context):
name = event['name']
response = {
"statusCode": 200,
"body": "{'name': name}",
"headers": {
'Content-Type': 'application/json',
}
}
return response
name
definido como <html><body><script>alert(1)</script></body></html>
, o servidor produzirá a seguinte resposta:
HTTP/1.1 200 OK
Content-Length: 88
Content-Type: application/json
Connection: Closed
{'name': '<html><body><script>alert(1)</script></body></html>'}
eid
, de uma solicitação HTTP e a exibe para o usuário.
String queryString = Window.Location.getQueryString();
int pos = queryString.indexOf("eid=")+4;
HTML output = new HTML();
output.setHTML(queryString.substring(pos, queryString.length()));
eid
contiver apenas texto alfanumérico padrão. Se eid
tiver um valor que inclui metacaracteres ou código-fonte, o código será executado pelo navegador da Web quando ele exibir a resposta HTTP.eid
, a partir de uma URL e a exibe ao usuário.Exemplo 2: Considere o formulário HTML:
<SCRIPT>
var pos=document.URL.indexOf("eid=")+4;
document.write(document.URL.substring(pos,document.URL.length));
</SCRIPT>
<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 eid
tiver um valor que inclui metacaracteres ou código-fonte, o código será executado pelo navegador da Web conforme este exibir a resposta HTTP.
let element = JSON.parse(getUntrustedInput());
ReactDOM.render(<App>
{element}
</App>);
Example 3
, se um invasor conseguir controlar todo o objeto JSON recuperado de getUntrustedInput()
, poderá fazer o React renderizar o element
como um componente e, portanto, poderá passar um objeto com o dangerouslySetInnerHTML
com seu próprio valor controlado, um típico ataque de Cross-Site Scripting.
<attribute name="href" onInvalid="filterTag">
<regexp-list>
<regexp name="onsiteURL"/>
<regexp name="offsiteURL"/>
</regexp-list>
</attribute>