Can someone explain this SQL injection attack to me?

后端 未结 5 403
甜味超标
甜味超标 2020-12-08 02:04

I wanted to post this here as it is very much coding related and was something I had to clean up this week on one of my company\'s old ASP (classic) sites.

We got hi

5条回答
  •  一向
    一向 (楼主)
    2020-12-08 02:37

    Consider installing URLScan 3.1 to quickly protect your application from sql injection attempts, as well as working through your application to properly sanitize your sql statements.

    This type of sql injection attack also usually work because your database user has permissions that are too loose, e.g. DBO rights. Look to connect to your database from your application using a database user with only the necessary rights to run your application. You can create a database user, map it to your database with public rights only than run a script like the one below to apply necessary individual rights to each object you need to.

    DECLARE @LOGIN varchar(255)
    DECLARE @DB varchar(255)
    
    SELECT @LOGIN = 'yourdbuser'
    SELECT @DB = 'yourdb'
    
    /* set default database */
    EXEC sp_defaultdb @LOGIN, @DB
    
    /* drop system admin role */
    EXEC sp_dropsrvrolemember @LOGIN, 'sysadmin'
    
    /* drop database owner role */
    EXEC sp_droprolemember 'db_owner', @LOGIN
    
    /* grant execute on all non system stored procedures and scalar functions */
    DECLARE @SP varchar(255)
    DECLARE Proc_Cursor CURSOR FOR
    SELECT name FROM sysobjects
    WHERE (type='P' or type='FN')
    AND category <> 2 -- system
    OPEN Proc_Cursor
    FETCH NEXT FROM Proc_Cursor INTO @SP
    WHILE(@@FETCH_STATUS=0)
    BEGIN
    EXEC ('GRANT EXECUTE ON ['+@SP+'] TO ['+@LOGIN+']')
    FETCH NEXT FROM Proc_Cursor INTO @SP
    END
    CLOSE Proc_Cursor
    DEALLOCATE Proc_Cursor
    
    /* grant select on table functions */
    DECLARE @TF varchar(255)
    DECLARE Tf_Cursor CURSOR FOR
    SELECT name FROM sysobjects
    WHERE (type='TF')
    AND category <> 2 -- system
    OPEN Tf_Cursor
    FETCH NEXT FROM Tf_Cursor INTO @TF
    WHILE(@@FETCH_STATUS=0)
    BEGIN
    EXEC ('GRANT SELECT ON ['+@TF+'] TO ['+@LOGIN+']')
    FETCH NEXT FROM Tf_Cursor INTO @SP
    END
    CLOSE Tf_Cursor
    DEALLOCATE Tf_Cursor
    
    /* grant select/update/insert/delete on all user defined tables */
    DECLARE @T varchar(255)
    DECLARE Table_Cursor CURSOR FOR
    SELECT name FROM sysobjects
    WHERE (type='U' or type='V') -- user defined tables and views
    OPEN Table_Cursor
    FETCH NEXT FROM Table_Cursor INTO @T
    WHILE(@@FETCH_STATUS=0)
    BEGIN
    EXEC ('GRANT SELECT, UPDATE, INSERT, DELETE ON ['+@T+'] TO ['+@LOGIN+']')
    FETCH NEXT FROM Table_Cursor INTO @T
    END
    CLOSE Table_Cursor
    DEALLOCATE Table_Cursor
    
    /* deny access to system tables */
    DENY SELECT ON syscolumns TO yourdbuser
    DENY SELECT ON sysobjects TO yourdbuser
    
    DENY VIEW DEFINITION TO yourdbuser
    
    DENY SELECT ON sys.databases TO yourdbuser
    DENY SELECT ON sys.columns TO yourdbuser
    DENY SELECT ON sys.objects TO yourdbuser
    DENY SELECT ON sys.sql_logins TO yourdbuser
    DENY SELECT ON sys.all_columns TO yourdbuser
    DENY SELECT ON sys.all_objects TO yourdbuser
    DENY SELECT ON sys.all_parameters TO yourdbuser
    DENY SELECT ON sys.all_views TO yourdbuser
    

    Obviously test this against your specific application as you might have procedures that require ability to select from these sys tables.

提交回复
热议问题