‘壹’ 防止sql注入,需要用到哪些知识
1、数据库知识,特别是sql语句的知识
2、了解操作系统的知识
3、熟悉编程语言如asp.net,php,java等
4、了解信息安全的相关知识
‘贰’ 什么是SQL注入 SQL注入解释
1、SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
2、任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。
‘叁’ 简单分析什么是SQL注入漏洞
转:
SQL注入,由于程序在实际使用中,为了管理庞大的数据信息,就会使用到数据库。数据库可以方便程序对所有数据信息进行统一的存储和分类组织,便于查询更新。用户在使用程序时,程序可以自动通过对数据库的查询,将所获得的信息按照一定格式反馈给用户,同时用户也是通过交互式的对话框提交给程序数据,从而使程序按照用户想要的信息进行查询,反馈给用户想要的信息。
对于程序这种数据库操作,先来看一段代码:
strKeyword = Request ["keyword"];
sqlQuery = "SELECT * FROM Aritcles WHERE Keywords LIKE '%" +strKeyword + "%'";
这段代码的主要目的是按照用户提交的关键字Keyword,对软件连接数据库中的文件进行搜索,找出所有包含用户关键字的文章来。假设此时,我们提交给软件“hack”这个数据,这时,“hack”这个关键字就会被传递给Keyword关键变量。接下来看看代码的执行情况,keyword获得数据“hack”后,被赋值给strKeyword变量,然后strKeyword变量被放入查询语句,此时的查询语句表现为:"SELECT * FROM Aritcles WHERE Keywords LIKE '%hack%'",这个查询语句的意思就是从数据库Aritcles表中查询出所有包含“hack”这个关键字的文章。注意“hack”这个单词是我们提交给程序的,因此可以对其随意修改的。于是,可以这样修改,把它变为“hack'; DROP TABLE Aritcles; --”。
现在看看程序会怎样处理这个外部关键字数据。首先,查询语句变成了:“SELECT * FROM Aritcles WHERE Keywords LIKE '%hack%'; DROP TABLE Aritcles; --”,我们知道DROP TABLE语句是在数据库操作中删除一个指定的表的意思,现在那个查询语句的意思就变了,以中间的分号为标志,分成两个部分,首先还是正常的查出所有包含hack关键字的文章。但是接下来……
由于程序使用的数据库是微软的SQL SERVER,该数据库支持多命令语句执行,这些数据库操作的命令语句都是由分号分隔开,然后依次执行的。这里的“DROP TABLE Aritcles; --”是一个完全合法的命令语句,“--”符号是SQL SERVER数据库特有注释标识,数据库不执行任何命令。这样,当这段查询语句执行时,就会去执行一个删除Aritcles表的数据库命令。
像这样,通过控制传递给程序数据库操作语句的关键变量来获得恶意控制程序数据库,从而获取有用信息或者制造恶意破坏的,甚至是控制用户计算机系统的漏洞,就称之为“SQL注入漏洞”。
SQL注入漏洞完全是利用了将包含了某种目的的SQL语句,通过关键变量插入到程序中正常的数据库操作语句里。程序一旦发生注入漏洞,就会引发一系列安全隐患。
SQL注入漏洞是不分语言的,无论用什么语言开发的程序,只要涉及对数据库的操作,都可能存在SQL注入漏洞。虽然有时会因为编写语言的要求,或者程序设置环境的不同,导致SQL注入漏洞很难被常用的方法利用,但是总可以找到突破的方法。
2
下面以网站程序为例,看一看SQL注入漏洞最经常被利用的地方,也是危害最大的地方。
都知道对于一个网站来说,可以说数据库存放着网站所有的信息,WEB应用程序完全是凭借数据库中的信息进行正常的运行的。一个网站程序中,最关键的一个部分就是对用户的合法性的判断,也就是看访问它的用户是不是一个注册的用户。这个时候,就会要求输入用户名和密码,然后根据输入的信息查询数据库,判断是否存在用户,并检查密码是不是一致,如果一致则承认合法用户,否则将给予非法提示。下面看一段常常出现在论坛程序中的用户认证程序代码:
(1)admin1 = trim(request("name"))
(2)password1 = trim(request("password"))
(3)Set rs = Server.CreateObject ("ADODB.Recordset")
(4)sql = "select * from userlogin where name='"&admin1&"' and password='"&password1&"'"
(5)rs.Open sql,conn,1,1
(6)if rs.eof and rs.bof then
(7)response.write"<SCRIPT language=JavaScript>alert('用户名或密码不正确!')"
(8)response.write"javascript:history.go(-1)</SCRIPT>"
(9)response.end
(10)else
(11)session("name")=rs("name")
(12)session("password")=rs("password")
(13)response.Redirect("default.asp")
(14)end if
这段程序的第1和第2行分别通过Request对象获得用户名和密码,第3行是建立一个数据库操作集对象,第4行就是将用户名以及密码同时作为查询条件放入到userlogin表中进行查询,第5到第14行就是根据查询结果进行判断,弹出警告窗口,或者重定向网页。
假设数据库中有个用户guest,密码123456,那么该用户登录时,认证代码中的第4行则变为:sql = "select * from userlogin where name='guest' and password='123456'",这是一个合法查询语句,所以用户能正常登录,反之则登录不了。
看起来这是一个比较严格的认证代码,但是事实呢?
现在,我们用户名提交“'or 1='1”,密码也是一样,同样也会成为合法用户,这是为什么?
当我们提交表单后,代码通过Request对象获得提交的用户名'or 1='1以及密码'or 1='1后,直接将这些数据放入了第4行的查询语句中,于是变成了这样:sql = "select * from userlogin where name=''or 1='1' and password=''or 1='1'"。我们先看1='1',这个绝对永远为真,如果你说假,那么你回小学学数学吧,学好再来看吧,呵呵~注意在大马前面还有一个or,这代表者1='1'是作为一个条件选择语句放入数据库查询的,这样无论查询语句中的用户名和密码是否正确,都会因为or后面的1='1'代码,导致查询语句返回值永远为真,这样就是绕过了看似严格的用户认证,获得了合法的权限。
‘肆’ 部分sql注入总结
本人ctf选手一名,在最近做练习时遇到了一些sql注入的题目,但是sql注入一直是我的弱项之一,所以写一篇总结记录一下最近学到的一些sql注入漏洞的利用。
在可以联合查询的题目中,一般会将数据库查询的数据回显到首页面中,这是联合注入的前提。
适用于有回显同时数据库软件版本是5.0以上的MYSQL数据库,因为MYSQL会有一个系统数据库information_schema, information_schema 用于存储数据库元数据(关于数据的数据),例如数据库名、表名、列的数据类型、访问权限等
联合注入的过程:
判断注入点可以用and 1=1/and 1=2用于判断注入点
当注入类型为数字型时返回页面会不同,但都能正常执行。
sql注入通常为数字型注入和字符型注入:
1、数字型注入
数字型语句:
在这种情况下直接使用and 1=1/and 1=2是都可以正常执行的但是返回的界面是不一样的
2、字符型注入
字符型语句:
字符型语句输入我们的输入会被一对单引号或这双引号闭合起来。
所以如果我们同样输入and 1=1/and 1=2会发现回显画面是并无不同的。
在我们传入and 1=1/and 1=2时语句变为
传入的东西变成了字符串并不会被当做命令。
所以字符型的测试方法最简单的就是加上单引号 ' ,出现报错。
加上注释符--后正常回显界面。
这里还有的点就是sql语句的闭合也是有时候不同的,下面是一些常见的
这一步可以用到order by函数,order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字 段名还可以指定字段的栏位进行排序,第一个查询字段为1,第二个为2,依次类推,所以可以利用order by就可以判断列数。
以字符型注入为例:
在列数存在时会正常回显
但是列数不存在时就会报错
这步就说明了为什么是联合注入了,用到了UNION,UNION的作用是将两个select查询结果合并
但是程序在展示数据的时候通常只会取结果集的第一行数据,这就让联合注入有了利用的点。
当我们查询的第一行是不存在的时候就会回显第二行给我们。
讲查询的数据置为-1,那第一行的数据为空,第二行自然就变为了第一行
在这个基础上进行注入
可以发现2,3都为可以利用的显示点。
和前面一样利用union select,加上group_concat()一次性显示。
现在非常多的Web程序没有正常的错误回显,这样就需要我们利用报错注入的方式来进行SQL注入了
报错注入的利用步骤和联合注入一致,只是利用函数不同。
以updatexml为例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路径(Xpath格式)
new_xml: 更新后的内容
此函数用来更新选定XML片段的内容,将XML标记的给定片段的单个部分替换为 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替换的部分 与xpath_expr 用户提供的XPath表达式匹配。
这个函数当xpath路径错误时就会报错,而且会将路径内容返回,这就能在报错内容中看到我们想要的内容。
而且以~开头的内容不是xml格式的语法,那就可以用concat函数拼接~使其报错,当然只要是不符合格式的都可以使其报错。
[极客大挑战 2019]HardSQL
登录界面尝试注入,测试后发现是单引号字符型注入,且对union和空格进行了过滤,不能用到联合注入,但是有错误信息回显,说明可以使用报错注入。
利用updatexml函数的报错原理进行注入在路径处利用concat函数拼接~和我们的注入语句
发现xpath错误并执行sql语句将错误返回。
在进行爆表这一步发现了等号也被过滤,但是可以用到like代替等号。
爆字段
爆数据
这里就出现了问题flag是不完整的,因为updatexml能查询字符串的最大长度为32,所以这里要用到left函数和right函数进行读取
报错注入有很多函数可以用不止updatexml一种,以下三种也是常用函数:
堆叠注入就是多条语句一同执行。
原理就是mysql_multi_query() 支持多条sql语句同时执行,用;分隔,成堆的执行sql语句。
比如
在权限足够的情况下甚至可以对数据库进行增删改查。但是堆叠注入的限制是很大的。但是与union联合执行不同的是它可以同时执行无数条语句而且是任何sql语句。而union执行的语句是有限的。
[强网杯 2019]随便注
判断完注入类型后尝试联合注入,发现select被过滤,且正则不区分大小写过滤。
那么就用堆叠注入,使用show就可以不用select了。
接下去获取表信息和字段信息
那一串数字十分可疑大概率flag就在里面,查看一下
这里的表名要加上反单引号,是数据库的引用符。
发现flag,但是没办法直接读取。再读取words,发现里面有个id字段,猜测数据库语句为
结合1'or 1=1#可以读取全部数据可以利用改名的方法把修改1919810931114514为words,flag修改为id,就可以把flag读取了。
最终payload:
盲注需要掌握的几个函数
在网页屏蔽了错误信息时就只能通过网页返回True或者False判断,本质上是一种暴力破解,这就是布尔盲注的利用点。
首先,判断注入点和注入类型是一样的。
但是盲注没有判断列数这一步和判断显示位这两步,这是和可回显注入的不同。
判断完注入类型后就要判断数据库的长度,这里就用到了length函数。
以[WUSTCTF2020]颜值成绩查询为例
输入参数后,发现url处有个get传入的stunum
然后用到length函数测试是否有注入点。
发现页面有明显变化
将传入变为
页面回显此学生不存在
那么就可以得出数据库名长度为3
测试发现过滤了空格
然后就是要查数据库名了,这里有两种方法
一、只用substr函数,直接对比
这种方法在写脚本时可以用于直接遍历。
二、加上ascii函数
这个payload在写脚本时直接遍历同样可以,也可用于二分法查找,二分法速度更快。
接下来的步骤就和联合注入一样,只不过使用substr函数一个一个截取字符逐个判断。但是这种盲注手工一个一个注十分麻烦所以要用到脚本。
直接遍历脚本
二分法脚本
时间盲注用于代码存在sql注入漏洞,然而页面既不会回显数据,也不会回显错误信息
语句执行后也不提示真假,我们不能通过页面的内容来判断
所以有布尔盲注就必有时间盲注,但有时间盲注不一定有布尔盲注
时间盲注主要是利用sleep函数让网页的响应时间不同从而实现注入。
sql-lab-less8:
无论输入什么都只会回显一个you are in...,这就是时间盲注的特点。
当正常输入?id=1时时间为11毫秒
判断为单引号字符型注入后,插入sleep语句
明显发现响应时间为3053毫秒。
利用时间的不同就可以利用脚本跑出数据库,后续步骤和布尔盲注一致。
爆库
爆表
爆字段
脚本
在进行SQL注入时,发现union,and,or被完全过滤掉了,就可以考虑使用异或注入
什么是异或呢
异或是一种逻辑运算,运算法则简言之就是:两个条件相同(同真或同假)即为假(0),两个条件不同即为真(1),null与任何条件做异或运算都为null,如果从数学的角度理解就是,空集与任何集合的交集都为空
即 1^1=0,0^0=0,1^0=1
利用这个原理可以在union,and,or都被过滤的情况下实现注入
[极客大挑战 2019]FinalSQL
给了五个选项但是都没什么用,在点击后都会在url处出现?id。
而且union,and,or都被过滤
测试发现?id=1^1会报错
但是?id=1^0会返回?id=1的页面,这就是前面说的原理,当1^0时是等于1的所以返回?id=1的页面。
根据原理写出payload,进而写出脚本。
爆库
爆表
爆字段
据此可以写出基于异或的布尔盲注脚本
实验推荐:课程:SQL注入初级(合天网安实验室)
‘伍’ 信息安全试题 什么是sql注入漏洞
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。
SQL注入漏洞有什么特点?
1、广泛性:任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、Cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。
2、隐蔽性:SQL注入语句一般都嵌入在普通的HTPP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。
3、危害大:攻击者可以通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也有很大的影响。
4、操作方便:互联网上有很多SQL注入工具,简单易学、攻击过程简单,不需要专业的知识也可以自如运用。
‘陆’ 如何防范SQL注入漏洞及检测
以下是OMG我为大家收集整理的文章,希望对大家有所帮助。
SQL注入(SQLInjection)漏洞攻击是目前网上最流行最热门的黑客脚本攻击方法之一,那什么是SQL注入漏洞攻击呢?它是指黑客利用一些Web应用程序(如:网站、论坛、留言本、文章发布系统等)中某些存在不安全代码或SQL语句不缜密的页面,精心构造SQL语句,把非法的SQL语句指令转译到系统实际SQL语句中并执行它,以获取用户名、口令等敏感信息,从而达到控制主机服务器的攻击方法。
1. SQL注入漏洞攻击原理
1. 1 SQL注入漏洞攻击实现原理
SQL(Structured Query Language)是一种用来和数据库交互的语言文本。SQL注入的攻击原理就是攻击者通过Web应用程序利用SQL语句或字符串将非法的数据插入到服务器端数据库中,获取数据库的管理用户权限,然后将数据库管理用户权限提升至操作系统管理用户权限,控制服务器操作系统,获取重要信息及机密文件。
SQL注入漏洞攻击主要是通过借助于HDSI、NBSI和Domain等SQL注入漏洞扫描工具扫描出Web页面中存在的SQL注入漏洞,从而定位SQL注入点,通过执行非法的SQL语句或字符串达到入侵者想要的操作。下面以一段身份验证的.NET代码为例,说明一下SQL 注入攻击的实现方法。
SqlConnectionnwConn = new SqlConnection((string)ConfigurationSettings.AppSettings["DBconnStrings"]); string queryStr = "SELECT userid,userpwd, username,type FROM users where userid='" + Txtusername.Text +"'";
DataSet userSet = new DataSet();
SqlDataAdapter userAdapter = newSqlDataAdapter(queryStr, nwConn);
userAdapter.Fill(userSet, "Users");
Session["UserID"] =Txtusername.Text.ToString();
Session["type"] =type.Text.ToString();
Response.Redirect("/Myweb/admin/login.aspx");
从上面的代码中可以看出,程序在与数据库建立连接得到用户数据之后,直接将username的值通过session传给login.aspx,没有进行任何的过滤和处理措施, 直接用来构造SQL 语句, 其危险系数是非常高的, 攻击者只要根据SQL 语句的编写规则就可以绕过身份验证,从而达到入侵的目的。
1. 2 SQL注入漏洞攻击分析
SQL注入可以说是一种漏洞,也可以说是一种攻击。当程序中的变量处理不当,没有对用户提交的数据类型进行校验,编写不安全的代码,构造非法的SQL语句或字符串,都可能产生这个漏洞。
例如Web系统有一个login页面,这个login页面控制着用户是否有权访问,要求用户输入一个用户名和口令,连接数据库的语句为:
“select * from users where username = 'username' andpassword = 'password'”
攻击者输入用户名为aa or 1=1口令为1234 or 1=1之类的内容。我们可以看出实际上攻击者并不知道真正的用户名、口令,该内容提交给服务器之后,服务器执行攻击者构造出的SQL命令,但由于攻击者输入的内容非常特殊,所以最后得到的SQL命令变成:
“select * from users where username = 'aa' or 1=1 andpassword = '1234' or 1=1”
服务器执行查询或存储过程,将用户输入的身份信息和数据库users表中真实的身份信息进行核对,由于SQL命令实际上已被修改,存在永远成立的1=1条件,因此已经不能真正验证用户身份,所以系统会错误地授权攻击者访问。
SQL 注入是通过目标服务器的80端口进行的,是正常的Web访问,防火墙不会对这种攻击发出警告或拦截。当Web服务器以普通用户的身份访问数据库时,利用SQL注入漏洞就可能进行创建、删除、修改数据库中所有数据的非法操作。而当数据库以管理用户权限的身份进行登录时,就可能控制整个数据库服务器。
SQL注入的方法很多,在以手动方式进行攻击时需要构造各种各样的SQL语句,所以一般攻击者需要丰富的经验和耐心,才能绕过检测和处理,提交语句,从而获得想要的有用信息。这个过程需要花费很多的时间,如果以这种手动方式进行SQL注入漏洞攻击,许多存在SQL注入漏洞的ASP、JSP、PHP、JAVA等网站就会安全很多了,不是漏洞不存在了,而是手动入侵者需要编程基础,但现在攻击者可以利用一些现成的黑客工具来辅助SQL注入漏洞攻击,加快入侵的速度,使SQL注入变得轻而易举。
由于SQL注入漏洞攻击利用的是通用的SQL语法,使得这种攻击具有广泛性。理论上说,对于所有基于SQL语言的数据库管理系统都是有效的,包括MSSQLServer、Oracle、DB2、Sybase和MySQL等。当然,各种系统自身的SQL扩展功能会有所不同,因此最终的攻击代码可能不尽相同。
1. 3 SQL注入漏洞攻击过程
(1)绕过身份验证
如一个login界面,需要输入用户名和口令,然后Post到另一个页面,进行身份验证,因此攻击者只需在用户名和口令的输入框中都输入aa or’1’=’1’的内容,那么攻击者就可以通过欺骗的验证方式而直接进入下一个页面,并拥有和正常登录用户一样的全部特权。原因是什么呢? 我们比较一下正常用户登录和攻击者登录时的两种SQL语句:
1)正常用户(如用户名为admin,口令为1234567) :
SQL= " selectfrom users where username = ’admin’and password= ’1234567’ ";
2)攻击者(用户名和口令都为aa or’1’=’1’) :
SQL= " select * from users where username='aa or’1’=’1’'and password = ' aa or’1’=’1’'";
可以看到由and连接的两个条件都被一个永远成立的1=1所代替,执行的结果为true,数据库会认为条件恒成立,会返回一个true,让攻击者以合法身份登录进入下一个页面。
(2)执行非法操作
如一个查询页面select1.asp? id=1,编程人员原本设计意图是显示id为1的查询信息,而攻击者利用程序中没有对id内容进行检查的机制,插入自己的代码。
从select1.asp中摘录一段关键代码:
SQL= " select *from photo where photoid= 'id'";
可以看到,id没有进行任何的处理,直接构成SQL语句并执行,而攻击者在知道该系统数据库中表名及字段名的情况下,利用SQL语句特性(分号是将两句SQL 语句分开的符号),直接向数据库Tuser表中添加记录:
select1.asp? id= 1;Insertinto Tuser (username,password,type) values ('hack','1234567','管理员'),然后攻击者就可以直接用hack进行登录了。通过这样的方法,攻击者还可以对系统做任何的事情,包括添加、删除、修改系统资源的操作。
(3)执行系统命令
如果Web主机使用MSSQL数据库管理系统,那么攻击者就可以用到xp_cmdshell这个扩展存储过程,xp_cmdshell是一个非常有用的扩展存储过程,用于执行系统命令,比如dir、net等,攻击者可以根据程序的不同,提交不同的语句:
execmaster.dbo.xp_cmdshell " dir "; exec master.dbo.xp_cmdshell" net user hack 1234567 /add ";
execmaster.dbo.xp_cmdshell " net localgroup administrators hack /add ";
这样就可以向Web主机系统中成功添加了一个管理员帐户。
2. SQL注入漏洞攻击的检测方式及方法
2. 1检测方式
SQL注入漏洞攻击检测分为入侵前的检测和入侵后的检测。入侵前的检测,可以通过手工方式,也可以使用SQL注入漏洞扫描工具软件。检测的目的是为预防SQL注入漏洞攻击,而对于SQL注入漏洞攻击后的检测,主要是针对审计日志的查看,SQL注入漏洞攻击成功后,会在Web Service和数据库的审计日志中留下“痕迹”。
2. 2检测方法
(1)动态SQL检查
动态的SQL语句是一个进行数据库查询的强大的工具,但把它和用户输入混合在一起就使SQL注入成为了可能。将动态的SQL语句替换成预编译的SQL或者存储过程对大多数应用程序是可行的。预编译的SQL或者存储过程可以将用户的输入作为参数而不是命令来执行,这样就限制了入侵者的行动。当然,它不适用于存储过程中利用用户输入来生成SQL命令的情况。在这种情况下,用户输入的SQL命令仍可能得到执行,数据库仍然存在SQL注入漏洞攻击的危险。
(2)有效性校验
如果一个输入框只可能包括数字,那么要通过验证确保用户输入的都是数字。如果可以接受字母,检查是不是存在不可接受的字符,那就需要设置字符串检查功能。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。
(3)数据表检查
使用SQL注入漏洞攻击工具软件进行SQL注入漏洞攻击后,都会在数据库中生成一些临时表。通过查看数据库中最近新建的表的结构和内容,可以判断是否曾经发生过SQL注入漏洞攻击。
(4)审计日志检查
在Web服务器中如果启用了审计日志功能,则Web Service审计日志会记录访问者的IP地址、访问时间、访问文件等信息,SQL注入漏洞攻击往往会大量访问某一个页面文件(存在SQL注入点的动态网页),审计日志文件会急剧增加,通过查看审计日志文件的大小以及审计日志文件中的内容,可以判断是否发生过SQL注入漏洞攻击事件;另外还可以通过查看数据库审计日志,查询某个时间段是否有非法的插入、修改、删除操作。
(5)其他
SQL注入漏洞攻击成功后,入侵者往往会添加特权用户(如:administrator、root、sa等)、开放非法的远程服务以及安装木马后门程序等,可以通过查看用户帐户列表、远程服务开启情况、系统最近日期产生的一些文件等信息来判断是否发生过入侵。
3. SQL注入漏洞防范措施
SQL注入漏洞攻击的防范方法有很多种,现阶段总结起来有以下方法:
(1)数据有效性校验。如果一个输入框只可能包括数字,那么要通过校验确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符,最好的方法是增加字符复杂度自动验证功能。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。另外限制表单数据输入和查询字符串输入的长度也是一个好方法。如果用户的登录名最多只有10个字符,那么不要认可表单中输入10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
(2)封装数据信息。对客户端提交的数据进行封装,不要将数据直接存入cookie中,方法就是在编程的代码中,插入session、if、try、else,这样可以有效地防止攻击者获取cookie中的重要信息。
(3)去除代码中的敏感信息。将在代码中存在的用户名、口令信息等敏感字段删除,替换成输入框。
SQL=" select from users where username = ’admin’and password= ’1234567’ "
如:这样显然会暴露管理员的用户名、口令信息。可以将其修改成:
SQL= " select * from users where username='" +Txtuser.Text + "' and userpwd='" + Textpwd.Text + "'"
这样就安全了很多,入侵者也是不会轻易的就获取到用户名、口令信息。
(4)替换或删除单引号。使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程度上预防SQL注入漏洞攻击,单引号时常会无法约束插入数据的Value,可能给予输入者不必要的权限。用双引号替换掉单引号可以使大部分SQL注入漏洞攻击失败。 如:
“select* from users where username='" + admin + "' and userpwd='" + 1234567+ "'”
显然会得到与
“select * from users where username='admin' and password= '1234567'”
相同的结果。
(5)指定错误返回页面。攻击者有时从客户端尝试提交有害代码和攻击字符串,根据Web Service给出的错误提示信息来收集程序及服务器的信息,从而获取想得到的资料。应在Web Service中指定一个不包含任何信息的错误提示页面。
(6)限制SQL字符串连接的配置文件。使用SQL变量,因为变量不是可以执行的脚本,即在Web页面中将连接数据库的SQL字符串替换成指定的Value,然后将Web.config文件进行加密,拒绝访问。
(7)设置Web目录的访问权限。将虚拟站点的文件目录禁止游客用户(如:Guest用户等)访问,将User用户权限修改成只读权限,切勿将管理权限的用户添加到访问列表。
(8)最小服务原则。Web服务器应以最小权限进行配置,只提供Web服务,这样可以有效地阻止系统的危险命令,如ftp、cmd、vbscript等。
(9)鉴别信息加密存储。将保存在数据库users表中的用户名、口令信息以密文形式保存,也可以对users表进行加密处理,这样可以大大增加对鉴别信息访问的安全级别。
(10)用户权限分离。应尽可能的禁止或删除数据库中sa权限用户的访问,对不同的数据库划分不同的用户权限,这样不同的用户只能对授权给自己的数据库执行查询、插入、更新、删除操作,就可以防止不同用户对非授权的数据库进行访问。
4. 结束语
SQL注入漏洞攻击在网上非常普遍,许多ASP、PHP论坛和文章管理系统、下载系统以及新闻系统都存在这个漏洞。造成SQL注入漏洞攻击的主要原因是开发人员在系统开发的过程中编程不规范,没有形成良好的编程习惯,问题的解决只有依赖于规范编程。此外,也可以使用现有的SQL注入漏洞扫描器对整个网站中的关键代码进行扫描,查找网站页面中存在的SQL注入点。对于有问题的页面,可以及时删除或更新。本文通过对SQL注入漏洞攻击的方法、原理以及攻击实施过程进行了阐述和总结,并给出了一些常见的SQL注入漏洞攻击防范的方法。
‘柒’ 常见的SQL注入类型分为哪几种
根据输入的参数,可将SQL注入方式大致分为两类:数字型注入、字符型注入。
数字型注入:当输入的参数为整型时,如ID、年龄、页码等,如果存在注入漏洞,则可以认为是数字型注入。这种数字型注入最多出现在ASP、PHP等弱类型语言中,弱类型语言会自动推导变量类型。而对于Java、C#这类强类型语言,如果试图把一个字符串转换为int类型,则会抛出异常,无法继续执行。所以,强类型的语言很少存在数字型注入漏洞。
字符型注入:当输入参数为字符串时,称为字符型。数字型与字符型注入最大的区别在于:数字型不需要单引号闭合,而字符串类型一般要使用单引号来闭合。
‘捌’ 简单分析什么是SQL注入漏洞
SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。
SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。
‘玖’ 简单分析什么是SQL注入漏洞
实例:
正常提交内容张三
SELECT name,id from user WHERE name='张三'
SQL注入提交内容 张三' or '1'='1
SELECT name,id from user WHERE name='张三' or '1'='1'
因为'1'='1' 恒成立 所以会显示user 表所有内容,如果再返回里加上密码等 信息就严重泄漏了