什么是SQL注入及SQL注入工具

类别:计算机/网络>>编程>>其他编程语言分析:随着B/S模式应用程序开发的发展,越来越多的程序员采用这种模式来编写应用程序。
但由于该行业的准入门槛较低,加上程序员的水平和经验参差不齐,大量程序员在编写代码时并没有评估用户输入数据的有效性,导致应用程序存在安全风险。
用户可以发送数据库查询代码,根据程序返回的结果得到一些自己想要知道的数据,这就是所谓的SQLInjection,即SQL注入。
SQL注入是从普通的WWW端口访问的,表面上看起来和普通的网页访问没有什么区别,所以目前市面上的防火墙不会对SQL注入发出警告如果管理员没有检查IIS日志的习惯,它可能被黑客入侵了,你很长一段时间都不会意识到这一点。
不过SQL注入方式相当灵活,注入时会遇到很多意想不到的情况。
能否分析给定的情况,构造出巧妙的SQL语句来成功获取想要的数据,是专家与“菜鸟”的根本区别。
根据国情,国内网站70%以上使用ASP+Access或SQLServer,PHP+MySQ占20%,其他使用不到10%。
本篇文章我们将从入门到进阶再到高级讲解ASP注入的方法和技巧。
PHP注入的文章是NB联盟的另一位成员zwell写的。
了解ASP注入的朋友请不要跳过入门章节,因为对于注入的基本判断方法还存在误解。
你准备好了吗?让我们...开始吧如果您以前从未尝试过SQL注入,那么第一步是取消选中IE菜单=>工具=>中间选项=>高级=>显示友好的HTTP错误消息。
否则,无论服务器返回什么错误,IE都会简单地将其显示为HTTP500服务器错误,而无法获得进一步的即时信息。
一、SQL注入原理我们从19号网站开始(注:本文发表前已获得该网站站长的许可,大部分是真实数据)。
在网站主页上,有一个名为“IE无法打开新窗口问题的多种解决方案”的链接。
服务器将返回以下错误。
提示:MicrosoftJETDatabaseEngine错误“80040e14”查询表达式“ID=49”中存在字符串语法错误。
/showdetail,line8从该错误消息中,我们可以看到以下内容:1.该网站使用Access数据库,并通过JET引擎而不是ODBC连接数据库。
2、本程序不判断客户提交的数据是否符合程序的要求。
3、该SQL语句查询的表中有一个名为ID的字段。
从上面的例子我们可以知道,SQL注入的原理就是客户端发送特殊的代码来收集程序信息,服务器端获取你想要的信息。
第二部分:判断是否可以进行SQL注入看完第一部分,有人会想:我经常测试SQL注入是否可以通过这种方式注入。
其实这并不是最好的方法,为什么呢?首先,并不是每个IIS服务器都会向客户端返回特定的错误信息,如果程序中添加了像cint(参数)这样的语句,那么SQL注入不会成功,但是服务器也会报告特定的错误信息,即:处理URL时服务器发生错误。
请联系您的系统管理员。
二、有的程序员知道有点了解SQL注入的人认为只要过滤单引号就安全了,其实不然,如果用单引号测试,就检测不到注入点。
那么,哪种测试方法更准确呢?答案如下:①19/showdetail?id=49②19/showdetail?id=49and1=1③19/showdetail?id=49and1=2这是一个经典的测试方法1=1,1=2如何评价?只要看看上面三个URL返回的结果就知道了:可注入的表现:①正常显示(这是不可避免的,如果程序没有错误的话)②正常显示,内容与①基本相同③BOF提示或者EOF(程序不做判断时),或者提示找不到记录(rs.eof求值时),或者显示内容为空(更容易判断程序是否执行(加上onErrorResumenext)节目中)无法注入①也正常显示,②、③一般都有程序定义的错误提示,或者是类型转换时出错的提示,当然这只是输入参数为数字类型时使用的判断方法。
实际应用中,会有字符类型和搜索类型参数我会在中间章节“SQL注入的一般步骤”中进行分析。
第三节指定数据库类型和注入方式不同的数据库注入方式和功能是不同的。
在注射之前,我们还需要指定数据库的类型。
一般来说,ASP最常用的数据库是Access和SQLServer,互联网上99%以上的网站都是其中之一。
如何让程序告诉您它正在使用什么数据库?我们来看看:SQLServer有一些系统变量如果服务器的IIS提示没有关闭,SQLServer返回错误提示,可以直接从错误信息中获取方式如下:19/showdetail?id=49anduser>0这个语句是很简单但是却包含了SQLServer独特的注入方法的精髓我自己在随机测试中发现了这种非常高效的猜测方法。
我看一下什么意思:首先前面的语句是正常的,重点是anduser>0,我们知道user是SQLServer的一个内置变量,值为当前连接的用户名,而类型为nvarchar。
将nvarchar值与int值0进行比较。
系统会尝试将nvarchar值转换为int类型当然,转换过程中肯定会出现错误SQLServer错误消息为:Convertnvarcharvalue"abc"todatatype列为int时出现语法错误哈哈,abc是变量uservalue这样就可以毫不费力的获取数据库用户名了。
在接下来的页面中,您将看到许多使用此方法的语句。
顺便说一句,众所周知,saSQLServer用户是一个与Administrator具有相同权限的角色,如果获得了权限,那么几乎肯定可以获得HostAdministrator。
上面的方法可以轻松测试你是否使用sa登录,注意如果你使用sa登录,提示的是“dbo”转换为int列出错,而不是“sa”。
如果IIS服务器不允许返回错误提示,如何判断数据库类型?我们可以先从Access和SQLServer的区别开始Access和SQLServer都有自己的系统表,比如Access数据库中存储所有对象的表都在系统表[msysobjects]中,但是在Web中读取这个表时环境下,会提示“无权限”,SQLServer处于[sysobjects]表,在Web环境下可以正常读取。
确认可以注入后,使用如下语句:19/showdetail?id=49and(selectcount(*)fromsysobjects)>019/showdetail?id=49and(selectcount(*)frommsys)objects)>0如果数据库是SQLServer,那么第一个URL页面与原始页面19/showdetail?id=49大致相同,而第二个URL,因为没有找到msysobjects表,会导致错误;,即使程序有容错,并且页面与原始页面完全不同。
如果数据库使用Access,那么情况就不同了,第一个URL页面和原来的页面完全不同,第二个URL取决于数据库设置是否允许读取系统表,一般是不允许和原来的页面完全不同的。
原始网址。
在大多数情况下,您可以使用第一个URL来了解系统正在使用什么类型的数据库。
第二个URL仅用于在打开IIS错误提示时进行身份验证。

sql注入手动注入方法有哪些

SQL手动注入方式包括UNION注入、布尔注入、延时注入、错误注入、文件包含注入等。

1.UNION注入

在SQL语句中使用UNION运算符来合并两个查询的结果。
可以通过构造恶意UNION查询来获取其他数据。

2.布尔注入

用布尔表达式构造查询,根据返回结果是否为真来判断条件是否为真。

通过逐个字符的比较可以猜测查询结果。

3.时间延迟注入

使用时间延迟函数构造查询并观察查询的响应时间来确定条件是否为真。

4.错误注入

通过构造产生SQL语法错误的查询并观察错误信息来获取敏感数据。

5.插入文件包含

使用SQL查询中的文件包含功能,通过返回文件内容作为查询的一部分来获取敏感数据。

SQL注入——SQL语句

SQL注入是一种常见的安全漏洞,允许攻击者访问数据库中的敏感信息。
以下,我们将一步步分析SQLInstance,了解其执行流程。
首先输入ID=1,ID我们可能会收到名字和姓氏信息。
这表明在特定的约束位置存在可利用的注入点。
通过输入ID=',该注入点最初被判断为对输入的长度不敏感。
此外,尝试添加1or1=1但未能成功传递数据表。
这表明我们可能正在经历数字注入。
预测字符输入;输入1'或'1'='1,然后它成功地遍历了数据库中的所有内容,并成功地展示了字符注入的威力。
然后,我们使用orderby[num]语句来测试;1'orderby1——调查(加空格);测试查询结果长度;接下来,添加1'orderby2--(空格)和1'orderby3--(空格)查询结果有2列。
数据库帐户名;内置函数database()获取数据库名称和版本信息;使用user()和version()。
通过注入1'and1=2unionselect1,2--(空格)可以读取查询结果第一列和第二列的值。
1'and1=2使用unionselectuser()、database()注入。
数据库用户是root@localhost,数据库名称是dvwa。
输入1'and1=2unionselectversion(),database()获取数据库版本信息和数据库名称。
注入1'and1=2unionselect1,@@global.version_compile_osfrommysql.user获取操作系统信息。
查询mysql数据库中所有数据库和表时。
1'and1=2unionselect1,schema_namefrominformation_schema.schemata尝试获取信息但结果错误。
通过注入1'andexists(select*fromusers)可以成功将dvwa数据库中的表名猜为用户。
输入1'andexists(usersfrom[tablename])尝试猜测字段名称。
分隔字段名称的最后一个,例如first_name和last_name。
插入1'and1=2unionselectfirst_name,last_namefromusers即可获取表中字段的内容。
在真正具有渗透性的环境中;这一步对于查找存储管理员帐户信息和密码很重要。

什么是sql注入,怎么防止注入?

SQL注入实际上就是将一些SQL或者其他数据库语句注入到这些不安全的控件中。
因此,服务器被欺骗执行恶意操作并影响数据库中的数据。
防止SQL注入;当从不安全的位置接收内容时,您可以过滤掉接收字符串中的“'”。
那么它就不再是一条SQL语句了,zifuc也不会有任何类似SQL语句的东西了。
它影响数据库。

示例:

username=request("username")//通过传递URL值来实现获取用户名。

password=request("password")//同样通过传递URL值来获取密码。

sql="select*fromuserlistwhereusername='"&username&"'andpassword='"&password&"'"--------如果有人知道用户名是admin。
通常有一个网站管理员。
用户名是admin;这是密码;您可以选择“or1or”,

然后sql="select*fromuserlistwhereusername='admin'andpassword=''or1or''";1为恒镇;然后就很明显了。
确认密码已被跳过。

有多种方法可以防止这种情况发生。
例如,带有数字的网站通常会避免用户名和密码中出现“'”字符,只允许使用字母和下划线的组合。
通过JavaScript验证。
也可以使用存储过程代替sql拼接等。