SQL注入详解

一、SQL注入注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件,第一个是用户能够控制输入;第二个是原本程序要执行的代码,拼接了用户输入的数据。

今天给各位分享SQL注入详解的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

首先是用户可以控制输入;

第二个是原始程序要执行的代码,与用户输入的数据拼接在一起。

varsql=’select*fromtableNamewherename=”+’测试’+”’;这个“拼接”过程非常重要,正是这个拼接过程导致了代码注入。

如果是更新/删除语句,可能会产生严重的后果。

在SQL注入过程中,如果网站的Web应用抛出异常信息,例如攻击者在参数中输入单引号“’”,导致执行查询语句出现语法错误,错误信息显示在对于攻击者来说,构造SQL注入语句会更加方便。

当Web应用程序不显示异常信息时,可以使用“盲注入”技术。

2. 盲注

所谓“盲注入”,就是在服务器没有错误回显的情况下完成的注入攻击。服务器没有错误回显,这对攻击者来说缺乏非常重要的“调试信息”,因此攻击者必须想办法验证注入的SQL语句是否被执行。

最常见的盲注入验证方法是构造一个简单的条件语句,根据返回的页面是否发生变化来判断SQL语句是否已经执行。

例如,一个应用程序的URL如下:

http://localhost:88/person.aspx?id=2执行的SQL语句为:

select*fromtableNamewhereid=2如果攻击者构造了以下条件语句:

http://localhost:88/person.aspx?id=2and1=2实际执行的SQL语句会变成:

select*fromtableNamewhereid=2and1=2因为“and 1=2”始终是一个假命题,所以这条SQL语句的“and”条件永远不能成立。对于Web应用程序来说,结果不会返回给用户,攻击者看到的页面结果将是空的或错误页面。

为了进一步确认注入存在,攻击者还必须再次验证该过程。由于某些处理逻辑或安全功能,当攻击者构造异常请求时,也可能导致页面异常返回。攻击者继续构造以下请求:

http://localhost:88/person.aspx?id=2and1=1 当攻击者构造条件“and 1=1”时,如果页面正常返回,说明SQL语句的“and”执行成功,那么就可以判断表明“id”参数存在SQL注入漏洞。

在本次攻击过程中,虽然服务器关闭了错误回显,但攻击者可以通过简单的条件判断、比较页面返回结果的差异来判断是否存在SQL注入漏洞。这就是盲注的运作方式。

SQL注入详解

3. 定时攻击

使用MySQL的BENCHMARK()函数,可以多次执行同一个函数,使得结果返回时间比平时更长;通过时间的变化,可以判断注入语句是否执行成功。这是一种旁道攻击,这种技术在盲注中被称为“定时攻击”。

或者使用Microsoft SQL Server 的waitfordelay ‘0:0:5’,用于指定等待时间。如果该语句注入成功,将会导致数据库返回记录以及Web请求响应延迟特定的时间。由于该语句不涉及条件判断等情况,所以很容易注入成功。根据Web请求是否存在延迟,渗透测试人员可以判断网站是否存在注入漏洞。同时,由于该语句没有返回具体内容,因此也是盲注的一个重要检测手段。

例如构造的攻击参数id值为:

select*fromemployeewhereid=1if(SUBSTRING(DB_NAME(),1,1)=’t’)waitfordelay’0:0:5’这条sql判断数据库名首字母是否为t。如果判断结果为true,则SQL执行延迟将是由waitfor延迟’0:0:5’引起的;如果不为真,则该语句将被快速执行。攻击者迭代所有字母,直到验证整个数据库名称。

4.数据库攻击技巧

发现SQL 注入漏洞仅仅是一个开始。要实施完整的攻击,还需要做更多的工作。将介绍一些有代表性的SQL注入技术。了解这些技术将有助于您更深入地了解SQL注入的攻击原理。

例如构造的攻击参数id值如下,使用union select分别确认表名admin和列名passwd是否存在:

select*fromemployeewhereid=1unionallselect1fromamdinselect*fromemployeewhereid=1unionallselect1,passwordfromamdin 另外,如果你想猜测用户名和密码的具体值,可以通过判断字符范围来逐步读出:

select*fromemployeewhereid=1IFASCII(SUBSTRING((selecttop1cityfromCustomers),1,1))=49WAITFORDELAY’0:0:5’这个过程非常繁琐,所以非常有必要使用自动化工具来帮助完成整个过程。 sqlmap.py是一个非常好的自动化注入工具。

5、命令执行

在MS SQL Server中,可以直接使用存储过程“xp_cmdshell”来执行系统命令。

在MS SQL Server 中,存储过程“xp_cmdshell”是臭名昭著的。无数的黑客教程使用它在注入SQL Server时执行系统命令:

execmaster.dbo.xp_cmdshell’cmd.exedirc:’execmaster.dbo.xp_cmdshell’ping’ 除了xp_cmdshell之外,还有一些其他存储过程在攻击过程中也有帮助。例如

xp_regread可以操作注册表;

xp_servicecontrol,允许用户启动和停止服务;

xp_terminate_process,提供进程的进程ID,终止该进程。

SQL注入详解

xp_ntsec_enumdomains,列出服务器可以进入的域。

xp_loginconfig,获取服务器安全信息。

xp_dirtree,允许获取目录树。

6.SQL自动注入工具

学习了SQL注入的相关知识和技术后,当发现SQL注入漏洞时,一般需要在Web应用后台发送大量请求,从远程数据库获取所需信息。这种手动检测方法耗时且效率较低。低,一些专门的软件可以帮助我们检测到。要正确运行这些软件,您只需根据界面提示进行相关操作即可。这些软件主要包括:

穿山甲(pangolin),其网站地址为:http://www.xmarks.com/s/site/www.nosec-inc.com/en/products/pangolin/。

SQLMap,网站地址为:http://sqlmap.sourceforge.net。

山猫,网站地址为:http://www.northern-monkee.co.uk/projects/bobcat/bobcat.html。

BSQL,网址为:http://code.google.come/p/bsq;jacler/。

Havij,网站地址为:http://itsecteam.com/en/projects/project1.htm。

SQLInjector,网址为:http://www.woanware.co.uk/?page_id=19。

7.正确防御SQL注入

从防守的角度来看,有两件事要做:

(1)查找所有SQL注入漏洞;

(2) 修补这些漏洞。

8. SQL注入的代码层防御:编写Web应用程序时如何防御代码

输入验证防御(JS前端)

SQL注入详解

输入验证是指在用户提交表单数据之前,使用一定的规则来验证网页代码中输入数据的合法性。这里的验证不仅要验证数据的类型,还需要使用正则表达式或者业务逻辑来验证数据的内容是否符合要求。

Web服务器端数据验证

1. ASP.NET应用程序通过System.Web.HttpRequest类获取用户提交的输入。此类包含Web 应用程序用来访问用户提交的数据的许多属性和方法。如下表所示:

https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.aspnetcore.http.httprequest?view=aspnetcore-5.0

https://res.weread.qq.com/wrepub/epub_26211899_816

API.jfif用于在ASP.NET平台获取用户提交的数据

接收的参数主要有四种类型,分别是Form参数、URL参数、Cookies参数和Session参数。例如,在Web服务器上通过ASP获取这些参数的语句如下。

Form参数的读取:UserName=Request.Form[‘User1’];

读取URL参数:UserName=Request.QueryString[‘User1’];

读取Cookies参数:UserName=Request.Cookies[‘User1’];

Session参数读取:UserName=Session[‘User1’];

检查输入数据的数据类型。例如,在输入时间和日期时,必须严格遵循时间和日期的格式等,避免损坏用户数据。然而,数据类型检查并不是万能的。如果需求需要用户提交字符串,比如一篇短文章,则需要依靠其他方法来防止SQL注入。

通过代码过滤防御:过滤关键字

‘xp_cmdshell’,’截断’,’转储’,’netuser’,’–‘,’/*’,’删除’,’更新’,’插入’,’执行’,’计数(‘,’恢复’ ,’netlocalgroup’,’asc’,’execute’,’desc’,’drop’,’truncate’,’char’,’grant’,’master’,’netlocalgroupadministrators’正确防御SQL注入:

还有大量应用程序允许用户指定排序键(ASC 或DESC)

1.参数化参数

用户评论

SQL注入详解
花开丶若相惜

终于找到解释 SQL 注入问题的文章了!以前遇到过几次类似问题,每次都一头雾水。这篇文章讲解得很清晰,现在我理解它为什么这么危险了。需要好好学习一下防御方法!

    有12位网友表示赞同!

SQL注入详解
放肆丶小侽人

讲得太透彻了!对一个SQL新手来说简直太好了。之前一直感觉 SQL 注入是个很可怕的概念,但现在明白是怎么回事了,也更有信心去面对它。

    有5位网友表示赞同!

SQL注入详解
夏日倾情

这篇文章真是我的福音!我最近在实习中遇到了一次 SQL 注入漏洞,还好我没影响到重要的数据。仔细读完这篇文章,我已经有了应对这类问题的思路,感觉自己学到了很多!

    有20位网友表示赞同!

SQL注入详解
迁心

写得真好啊,入门级朋友看了肯定能快速理解 SQL 注入的原理,高级同学也能从攻击案例和防御措施中有所启发。

    有20位网友表示赞同!

SQL注入详解
風景綫つ

说得不错,但是我觉得对一些比较复杂的操作机制讲解不够详细,希望作者可以再补充一下。另外,针对不同数据库系统和语言的防范策略也可以细化一下,这样更全面!

    有15位网友表示赞同!

SQL注入详解
寻鱼水之欢

这篇博客解释 SQL 注入的原理相当清晰,不过攻击案例显得有点老旧了,现在很多SQL注入技术都更加复杂多元化了,希望作者能更新一些最新案例!

    有9位网友表示赞同!

SQL注入详解
浮殇年华

学习了一下防御方法,感觉还是有很多需要钻研的地方。比如,对于大型系统如何进行安全的 SQL 查询设计,以及如何在代码中全面地加固 SQL 语句的安全性等等。

    有5位网友表示赞同!

SQL注入详解
£烟消云散

说穿了,SQL 注入问题终究是编程员自身意识的问题。在编写代码的时候要有安全意识,避免直接拼接用户输入到 SQL 语句中。这是最根本的防范措施!

    有6位网友表示赞同!

SQL注入详解
花容月貌

这篇博客太理论化了,缺少了一些实际操作案例和示例代码。对于更注重实践的读者来说,这样的讲解可能不够吸引人。

    有9位网友表示赞同!

SQL注入详解
你tm的滚

SQL注入确实是一个非常严重的威胁,但我感觉这篇文章过度强调了它的危险性,让人有些焦虑。应该多介绍一些解决方案和建议,让大家知道如何有效地预防和应对这个问题。

    有7位网友表示赞同!

SQL注入详解
不浪漫罪名

我觉得这篇文章忽略了一些重要的信息安全概念,比如审计日志、数据加密等。这些方法也能帮助降低 SQL 注入的风险,应该在文章中有所提及。

    有14位网友表示赞同!

SQL注入详解
盲从于你

我之前也学过一些 SQL 注入相关的知识,发现这篇文章所讲解的内容与我的理解相符。不过有些地方还是可以更深入地探讨,比如针对不同版本的数据库有哪些特殊的防范策略?

    有17位网友表示赞同!

SQL注入详解
棃海

这种文章就应该多发啊!现在很多人都在学习编程,缺乏关于安全意识的啓蒙教育。这样一篇通俗易懂的科普文章能帮助更多人认识到 SQL 注入问题的严重性。

    有9位网友表示赞同!

SQL注入详解
白恍

我建议作者可以加入一些读者互动环节,让大家能够分享自己的经验和心得,或者提出一些问题,方便作者进行解答和引导,这样可以让文章更生动有趣。

    有5位网友表示赞同!

SQL注入详解
一笑抵千言

这篇文章讲解的很好!让我更加重视SQL注入攻击的问题。我要好好加强学习,提高自己的安全意识,避免成为攻击目标!

    有18位网友表示赞同!

SQL注入详解
眉黛如画

对于已经熟练掌握 SQL 编程的用户来说,这篇文章的内容可能略显简单。建议作者可以针对更高级的编程场景和技术进行讲解,比如如何使用 ORM 工具进行安全的数据库操作。

    有18位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/117534.html

(0)
小su's avatar小su
上一篇 2024年9月1日 上午8:44
下一篇 2024年9月1日 上午8:48

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注