segunda-feira, 4 de janeiro de 2010

Para responder ao fernando em ( É ou não possível... )

Vamos analisar a função.

11 parametros de entrada em javascript
Uma vez que nesta linguagem as variaveis não são fortemente tipificadas, são onze possibilidades de entrar codigo pois

Area pode ser 01, ou "Select Sum(quantidade) from tregisto inner join ...) por ai fora.
Isto pode se repetir para cada variavel.
Mais a frente digo como.

Agora o maior problema no meu ponto de vista. A construção de um procedimento em runtime no lado do client com os dados das variaveis:
-> "; select @operacao=" + Operacao + , permite assignar a variavel @operacao do procedimento o que eu quiser:
. por exemplo tornar um debito num credito.
. igualar ao resultado de um outro procedimento que demore imenso tempo ou que não termine e empaque a bd.
. o que quiserem imaginar.
O mesmo para as outras variaveis.

Sem falar que fico com o conhecimento da estrutura de dados do sistema ( nome de tabelas, campos)

- > while (incDate <= sysDate) { se tornar este loop infinito posso inserir dados até rebentar a BD temos n inserts a ser criados em runtime -> "insert into tregisto (centro, estrutura, area, produto, operacao, tiporegisto, data, userid, quantidade) " +


Se por fim quiser alterar a variavel msql , visto que é uma string posso em qualquer parte do procedimento fazer drops,
alterar permissões se conhecer a estrutura da tabela de permissões ( que poderia estar exposto em outras partes do codigo)

para isto basta abrir o IE ou o mozilla com um debuger de javascript, por breakpoints no javascript, adicionar watchs para variaveis ( Centro, incDate, msql,etc) e mudar os valores quando parar no breakpoint .
Sem falar que também se pode fazer isto com o Visual Studio, Eclipse, NetBeans que têm ferramentas de depuração mais poderosas.

function insertDoc(Centro, Estrutura, Area, Produto, Operacao, TipoRegisto, ShortDt, User, Quantidade, sysDate, allow) {
var xml, msql, QantFix, incDate;
var doc, docAttr, docChilds, nor;


debugger;
( Break Point Aqui) - a partir daqui alterava os parametros de entrada.
incDate = ShortDt;
QantFix = Quantidade;

if (allow == "A")
QantFix = calculaQuantidadeACT(Centro, Estrutura, Area, Produto, Operacao, TipoRegisto, ShortDt, User, parseInt(Quantidade), sysDate, allow);


while (incDate <= sysDate) {

( Break Point Aqui) - a partir daqui alterava incDate para ser sempre inferior as sysDate .

msql = "declare @Centro as char(3); declare @estrutura as char(2); declare @area as char(2); declare @produto as char(2); declare @operacao as char(2); declare @TipoRegisto as char(30); declare @userid as char(8); declare @quantidade as int; declare @allow as char(1); " +
"select @Centro='" + Centro +
"'; select @estrutura=" + Estrutura +
"; select @area=" + Area +
"; select @produto=" + Produto +
"; select @operacao=" + Operacao +
"; select @TipoRegisto='" + TipoRegisto +
"'; select @userid='" + User +
"'; select @quantidade=" + Quantidade +
"; select @allow='" + allow +
"'; " +
"declare @DTPD as datetime; declare @DT as datetime; select @DTPD='" + ShortDt +
"'; select @DT='" + incDate +
"'; declare @RecebidosD as int; declare @PendentesD as int; declare @PendentesDA as int; ";

( Break Point Aqui) - a partir daqui alterava as variaveis do procedimento .

if (ShortDt == incDate) {
msql = msql + "" +
"select @RecebidosD=(select quantidade from tregisto " +
"where centro=@Centro and estrutura=@estrutura and area=@area and produto=@produto and operacao=@operacao and tiporegisto=@tiporegisto and data=@DT); " +
"if (@RecebidosD is null) begin " +
"insert into tregisto (centro, estrutura, area, produto, operacao, tiporegisto, data, userid, quantidade) " +
"values (@Centro, @estrutura , @area, @produto, @operacao, @TipoRegisto, @DT, @userid, @quantidade); " +
"select @RecebidosD=(select quantidade from tregisto " +
"where centro=@Centro and estrutura=@estrutura and area=@area and produto=@produto and operacao=@operacao and tiporegisto=@tiporegisto and data=@DT); "

( Break Point Aqui) - punha mais inserts ou drops ou delete na variavel msql .

.... (Omitido o resto por questões de brevidade)


}

É claro que não seria para qualquer um, mas basta ter vontade e tempo

1 comentário:

Fernando Oliveira disse...

Caro Joaquim,
Na tua explicação, que tipo, exactamente, de exploração de vulnerabilidades estás a demonstrar?

Obrigado pela participação!

Abraço.