piano imagemap test

piano H-1 C0 CIS0 > D0 DIS0 E0 F0 FIS0 G0 GIS0 A0 B0 H0 C1 CIS1 D1 DIS1 E1 F1 FIS1 G1 GIS1 A1 B1 H1 C2 CIS2 D2 DIS2 E2 F2

Labels

Wirtschaft (156) Pressefreiheit (152) Österreich (125) IT (110) code (70) Staatsschulden (37) EZB (27) Pensionssystem (16) Geopolitik (13)

2012-05-16

Simple Html Injection Detection for MS-SQL

A very simple prototype how html injection detection can be made on Microsoft SQLServer.
Please notice, that a full content injection detection is much more complex...

If Exists(Select Top 1 object_id 
  From tempdb.sys.tables Where name = '##InjWatch'
)
  Delete From ##InjWatch
Else
  Create Table ##InjWatch(
    ctext varchar(max), tab varchar(768), col varchar(768)
  );
GO 

Set TRANSACTION ISOLATION LEVEL read uncommitted;

Declare
 CheckHtmlInjectCursor Cursor FAST_FORWARD READ_ONLY For 
  Select
    'Cast([' + c.name + '] As nvarchar(Max))' As c_cast,
    c.name As c_name, '' +
    s.name + '.[' +T.name + ']' As sT_name
  From sys.tables T
  Inner Join sys.columns c On c.object_id = T.object_id
    And c.max_length > 16
    And c.system_type_id In (
      Select system_type_id From sys.types Where name In (     
      -- TODO: check XML, 'user defined' string & binary types :(
        'varchar''nvarchar''char''nchar''text''ntext'   
      )
    ) 
  Inner Join sys.schemas s On s.schema_id = T.schema_id

Declare @c_cast varchar(1024),
        @c_name varchar(768), @sT_name varchar(768)
Open CheckHtmlInjectCursor
  Fetch Next From CheckHtmlInjectCursor 
    Into @c_cast, @c_name, @sT_name

  While
 (@@FETCH_STATUS = 0)
  Begin
    Declare @execSQL nvarchar(max
    Set @execSQL = 
    'Insert Into ##InjWatch(ctext, tab, col) ' + 
    'Select ' + @c_cast + ' As ctext, ''' + 
                @sT_name + ''' As tab, ''' +
                @c_name + ''' As col ' + 
    'From   ' + @sT_name + ' ' 
    'Where (' + @c_cast + ' Like ''%<%'' And + 
                @c_cast + Like  ''%>%'') ' + 
    '  Or   ' + @c_cast + Like  ''%script:%''+ 
    '  Or   ' + @c_cast + ' Like ''%://%''' + 
    '  Or   ' + @c_cast + ' Like ''%href%''' 
    '  Or   ' + @c_cast + ' Like ''%return%'''   

    Execute sp_executesql @execSQL; 
  
    Fetch Next From CheckHtmlInjectCursor 
      Into @c_cast, @c_name, @sT_name 
  End 

Close CheckHtmlInjectCursor 
Deallocate CheckHtmlInjectCursor 


Select Distinct * From ##InjWatch 
GO

Mysql Sample:
/* CREATE TEMPORARY TABLE Test.HtmlSQLInjection (
 Content Varchar(1024) NULL
    , TableName VARCHAR(512) NOT NULL
    , ColumnName VARCHAR(512) NOT NULL
    , SchemaName VARCHAR(512) NOT NULL
); */


USE test;
DELIMITER $$
DROP PROCEDURE IF EXISTS  cursor_proc $$
CREATE PROCEDURE cursor_proc()
BEGIN

DECLARE v_done INTEGER DEFAULT 0;
DECLARE v_s VARCHAR(512) DEFAULT '';
DECLARE v_t VARCHAR(512) DEFAULT '';
DECLARE v_c VARCHAR(512) DEFAULT '';
DECLARE v_queryString VARCHAR(1024) DEFAULT '';
DECLARE CheckHtmlInjectCursor CURSOR FOR 
 select  
  information_schema.TABLES.TABLE_SCHEMA, 
        information_schema.TABLES.TABLE_NAME,
        information_schema.COLUMNS.COLUMN_NAME
 From information_schema.TABLES CALL `test`.`cursor_proc`();
CALL `test`.`cursor_proc`();

 inner join information_schema.COLUMNS 
  on information_schema.TABLES.TABLE_NAME = information_schema.COLUMNS.TABLE_NAME
where information_schema.TABLES.TABLE_SCHEMA = information_schema.COLUMNS.TABLE_SCHEMA
 and information_schema.COLUMNS.DATA_TYPE in 
 ('char', 'varchar', 'binary', 'varbinary', 'blob', 'longblob', 'text', 'mediumtext', 'longtext')
    and information_schema.COLUMNS.CHARACTER_MAXIMUM_LENGTH > 15;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;

OPEN CheckHtmlInjectCursor;

read_loop: LOOP
  FETCH CheckHtmlInjectCursor INTO v_s, v_t, v_c;
 IF v_done = 1 THEN
      LEAVE read_loop;
      CLOSE CheckHtmlInjectCursor;
 END IF;
    SELECT v_c,  v_s, v_t;
    
   'SELECT ', v_c, ' FROM ', v_s, '.', v_t, '.', v_c, ' WHERE ', v_c, ' like ''%'' '));
    SET @queryString = (
  SELECT CONCAT(
   'SELECT ', v_c, '.',  v_s, '.', v_t, ' FROM ', v_t));
 PREPARE stmt FROM @queryString;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt; 
 */

END LOOP read_loop;
/* CLOSE CheckHtmlInjectCursor; */

END $$
 
DELIMITER ;


Keine Kommentare:

Kommentar veröffentlichen