Vou abordar hoje uma das maneira mais fáceis de inserir código malicioso em comando SQL. O título indicando o Firebird é só um direcionamento do teste, mas se aplica praticamente a todos os banco de dados relacional (ou quase todos).

1. Um código Vulnerável

Uma simples janela de “login” pode significar uma entrada a explorar, como veremos.

Em geral uma janela de “login” pede o código/senha de usuário.

Exemplos de “select” para validar o usuário:

Caso 1:

considere o select: ‘select codigo,nome from usuario where codigo=’ +edit1.text+’ and senha=’+edit2.text;

como testar:

  1. digite uma aspas    no edit1.text e tente entrar; se o resultado for um erro, então você receberá informações sobre o que ocorreu e poderá indicar que o código do aplicativo é vulnerável.
  2. tente digitar no edit1.text:
    ' or 1=1 --

    note que com o select indicado o usuário ganhará acesso ao sistema.

Caso 2:

considere o select:    format(‘select codigo,nome from usuario where codigo=%s and senha=%s,[edit1.text,edit2.text]);

  • tente digitar no edit1.text: 
    ' or 1=1 --

 

2. Como quebrar a vulnerabilidade

Para quebrar a vulnerabilidade, o passo mais seguro é utilizar parâmetros nos “select” ou forçar as aspas por código, vejamos como fazer o correto:

  • ‘select codigo,nome from usuario where codigo=:codigo and senha=:senha’
  • ‘select codigo,nome from usuario where codigo=’+quotedstr(edit1.text)+’ and senha=’+quotedstr(edit2.text);

 

Como usar o servidor MVCBr OData com javascript !!!

Javascript possui tudo que é necessário para consumir RESTful – alias, não foi por lá que nasceu!

O exemplo é bem simples com objetivo somente de mostrar como estruturar os artefatos para fazer a busca no servidor. Para o teste, o servidor estava instalado como um serviço windows respondendo na porta 8080 configurado com o banco padrão que vai de exemplo com o servidor OData do MVCBr – Firebird3;

 

Classes construtura para OData Protocol:

[code lang=”javascript”]
class ODataBuilder{

constructor(AResource) {
this.BaseURL = "http://localhost:8080",
this.Service = "/OData.svc",
this.ServicePrefix = "/OData",
this.ResourceParams = "",
this.Top = 0,
this.Skip = 0,
this.Select = "",
this.OrderBy = "",
this.Filter = "",
this.Params = "";
this.Resource = "/" + AResource;
}

formatParams() {
var rt = "";
if (this.ResourceParams == "") {
return rt;
}
rt = rt + "(" + this.ResourceParams + ")";
}

BaseURI() {
return this.BaseURL + this.ServicePrefix + this.Service;
}

ResourceParams(AParams) {
this.ResourceParams = AParams;
}

addParams(prm) {
if (this.Params != "") { this.Params += "&" };
this.Params += prm;
};

URI() {
var rt = this.Resource + this.formatParams();
this.Params = "";
if (this.Top > 0) this.addParams("$top=" + this.Top.ToString());
if (this.Skip > 0) this.addParams("$skip=" + this.Skip.ToString());
if (this.Select != "") this.addParams("$select=" + this.Select);
if (this.Filter != "") this.addParams("$select=" + this.Filter);
return rt + "?" + this.Params;
};

ToString() {
return this.BaseURI() + this.URI();
}
};
[/code]

Classe RestClient para comunicação com o servidor:

[code lang=”javascript”]

class RestClient {
constructor(AODataBuilder) {
this.Builder = AODataBuilder;
this.ResponseCode = 0;
this.ResponseContent = "";
}
ResponseCode() {
return this.ResponseCode;
}
Content() {
return this.ResponseContent;
}

GET(fn) {
this.ResponseCode = 0;
$.ajax({
url: this.Builder.ToString(),
type: ‘GET’,
dataType: ‘json’,
success: function (data) {
this.ResponseContent = data;
if (fn != null) {
fn(data);
}
}
});
};

};

[/code]

Exemplo construção da chamada HTML5:

[code lang=”html”]
<html>
<head>
<script src="./js/jquery.min.js"></script>
<script src="./src/ODataBuilder.js"></script>
<script src="./src/ODataBuilder.js"></script>
<script src="./src/RestClient.js"></script>

<script type="text/javascript">

$(document).ready(function(){
$(‘#ok’).click(function(){
var builder = new ODataBuilder("produtos");
var rc = new RestClient(builder).GET(
function (data) {
$(‘#content’).text( JSON.stringify(data) );
});
});
});

</script>
</head>
<body>

<textarea rows="20" cols="80" id="content" name="content">

</textarea>
<button id="ok">Okey – Pedir dados proddutos</button>

</body>
</html>
[/code]

Exemplo completo no GIT