SQL注入原理深度解析[网络技术]
本文“SQL注入原理深度解析[网络技术]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
关于Web利用来说,注射式攻击由来已久,攻击方法也五花八门,常见的攻击方法有SQL注射、号令注射以及新近才呈现的XPath注射等等.本文将以SQL注射为例,在源码级对其攻击原理举行深化的讲授.
1、注射式攻击的原理
注射式攻击的本源在于,程序号令和用户(即用户输入)之间没有做到泾渭清楚.这使得攻击者有机会将程序号令当作用户输入的提交给We程序,以发号施令,为所欲为.
为了策动注射攻击,攻击者需求在通例输入中混入将被注释为号令的"",要想成功,必必要做三件事情:
1.肯定Web利用程序所利用的
注射式攻击对程序计划语言大概硬件关系密切,但是这些可以通过得当的踩点大概干脆将全部常见的注射式攻击都搬出来一一试一下就知道了.为了肯定所采取的,攻击者可以观察Web页面的页脚,查看错误页面,查抄页面源代码,大概利用诸如Nessus等工具来举谋杀探.
2.肯定全部大概的输入方法
Web利用的用户输入方法对比多,此中一些用户输入方法是很明显的,如HTML表单;别的,攻击者可以通过躲藏的HTML表单输入、HTTP头部、cookies、乃至对用户不可见的后端AJAX恳求来跟Web利用举行交互.普通来说,全部HTTP的GET和POST都该当作用户输入.为了找出一个Web利用全部大概的用户输入,我们可以告急于Web代理,如Burp等.
3.查找可以用于注射的用户输入
在找出全部用户输入方法后,就要对这些输入方法举行挑选,找出此中可以注入号令的那些输入方法.这个任务仿佛有点难,但是这里有一个小诀窍,那就是多多留神Web利用的错误页面,很多时刻您能从这里获得意想不到的收获.
2、SQL注射原理
上面对注射攻击做了普通性的注释,下面我们以SQL注射为例举行讲授,以使读者对注射攻击有一个感性的熟习,至于其他攻击,原理是一致的.
SQL注射能使攻击者绕过认证机制,完好掌握远程器上的库.SQL是构造化查询语言的简称,它是拜候库的事实尺度.目前,大大都Web利用都利用SQL库来存放利用程序的.几近全部的Web利用在后台都利用某种SQL库.跟大大都语言一样,SQL语法答应库号令和用户稠浊在一同的.假如开辟人员不细心的话,用户就有大概被注释成号令,这样的话,远程用户就不但能向Web利用输入,并且还可以在库上履行肆意号令了.
3、绕过用户认证
我们这里以一个需求用户身份认证的简单的Web利用程序为例举行讲授.假定这个利用程序供应一个登录页面,要求用户输入用户名和口令.用户通过HTTP恳求发送他们的用户名和口令,之后,Web利用程序查抄用户传送来用户名和口令跟库中的用户名和口令能否匹配.这种情形下,会要求在SQL库中利用一个库表.开辟人员可以通过以下SQL语句来成立表:
CREATETABLEuser_table(
idINTEGERPRIMARYKEY,
usernameVARCHAR(32),
passwordVARCHAR(41)
);
上面的SQL代码将成立一个表,该表由三栏构成.第一栏存放的是用户ID,假如某人经过认证,则用此标识该用户.第二栏存放的是用户名,该用户名最多由32字符构成.第三栏存放的是口令,它由用户的口令的hash值构成,因为以明文的情势来存放用户的口令实在太危险,所以普通取口令的散列值举行存放.我们将利用SQL函数PASSWORD()来得到口令的hash值,在MySQL中,函数PASSWORD()的输出由41字符构成.
对一个用户举行认证,实际上就是将用户的输入即用户名和口令跟表中的各行举行对比,假如跟某行中的用户名和口令跟用户的输入完好匹配,那么该用户就会通过认证,并得到该行中的ID.假定用户供应的用户名和口令辨别为lonelynerd15和mypassword,那么查抄用户ID历程以下所示:
SELECTidFROMuser_tableWHEREusername=’lonelynerd15’ANDpassword=PASSWORD(’mypassword’)
假如该用户位于库的表中,这个SQL号令将返回该用户呼应的ID,这就意味着该用户通过了认证;不然,这个SQL号令的返回为空,这意味着该用户没有通过认证.
下面是用来实现登录的Java代码,它从用户那边接纳用户名和口令,然后通过一个SQL查询对用户举行认证:
Stringusername=req.getParameter("username");
Stringpassword=req.getParameter("password");
Stringquery="SELECTidFROMuser_tableWHERE"+
"username=’"+username+"’AND"+
"password=PASSWORD(’"+password+"’)";
ResultSetrs=stmt.executeQuery(query);
intid=-1;//-1impliesthattheuserisunauthenticated.
while(rs.next()){
id=rs.getInt("id");
}
开首两行代码从HTTP恳求中获得用户输入,然后在下一行开始构造一个SQL查询.履行查询,然后在while()循环中得到后果,假如一个用户名和口令对匹配,就会返回精确的ID.不然,id的值仍旧为-1,这意味着用户没有通过认证.表面上看,假如用户名和口令对匹配,那么该用户通过认证;不然,该用户不会通过认证——但是,事实果真如此吗?非也!读者大概已经注意到了,这里并没有对SQL号令举行设防,所以攻击者完好可以在用户名大概口令字段中注入SQL语句,从而改变SQL查询.为此,我们细心研究一下上面的SQL查询字符串:
Stringquery="SELECTidFROMuser_tableWHERE"+
"username=’"+username+"’AND"+
"password=PASSWORD(’"+password+"’)";
上述代码认为字符串username和password都是,不过,攻击者却可以随心所欲地输入任何字符.假如一位攻击者输入的用户名为
’OR1=1—
而口令为
x
那么查询字符串将变成下面的模样:
SELECTidFROMuser_tableWHEREusername=’’OR1=1--’ANDpassword
=PASSWORD(’x’)
该双划标记--奉告SQL解析器,右边的东西全部是注释,所以没必要理睬.这样,查询字符串相当于:
SELECTidFROMuser_tableWHEREusername=’’OR1=1
目前的SELECT语句跟从前的已经大相径庭了,因为目前只要用户名为长度为零的字符串’’或1=1这两个条件中一个为真,就返回用户标识符ID——我们知道,1=1是恒为真的.所以这个语句将返回user_table中的全部ID.在此种情形下,攻击者在username字段放入的是SQL指令’OR1=1--而非.
以上是“SQL注入原理深度解析[网络技术]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |