首先来简述一下sql注入的含义,只要应用程序里出现和数据库打交道,那么必定会有sql语句的产生,那么如果有sql语句,就必定会从view层接受一些用户的数据来组装sql语句。如果有这样的过程,那么无论是何种应用程序都会引发注入。现it行业逐渐兴起,门槛逐渐降低,程序员的标准越来越差,导致很多程序员写程序不符合标准,而导致sql注入的产生。如果web服务器上的数据是非常重要,那么由此可能造成很大的损失,举个例子,如果某黑客发现某域名存在sql注入漏洞,并成功利用,这时黑客执行了 drop database XXX这样的语句,可想有多严重,有些黑客则会爆破数据库表内用户的重要信息,这时会被刚才更加严重。
我们首先理解sql注入的产生过程,select count(*) from userinfo where username = ' ' and password = ' ';
这是一条普通的不能再普通的查询语句,用于查询用户名是否匹配,并返回,在此语句的基础上,我们查看程序内此语句的应用方式:
java :
ResultSet result = statment.execute("select * from userinfo where username = ' "+request.getParmater("username")+"' and password = ' "+request.getParmater("password")+"' ")
while(result.next())
{
XXXXXXX;
}
c#
DataReader reader = cmd.query("select * from userinfo where username = ' "+request.getParmater("username")+"' and password = ' "+request.getParmater("password")+"' ")
while(reader.move())
{
XXXX;
}
如果有像上面类似的获取数据的方法,对服务器将会是致命的。举例,现有客户进行登录:
客户1: 传入用户名:admin 密码:admin; (不会有任何问题)
黑客:传入用户名:admin' or 1=1 ;-- 密码:XXXXX (会触发永真条件)
我们试着拼出这个永真条件的sql语句并分析一下
select count(*) from userinfo where username = 'admin' or 1=1 ;-- ' and password = ' '
很明显,and password部分被攻击者注释掉了,结果or 1=1返回了永真的条件。
在此提示,只有sqlserver 和mysql 可以执行语句链,(用分号隔开的语句,可以同时执行), oracle则不能,必须要使用pl/sql
sqlserver和mysql漏洞诸多,尤其是1433端口,会成为黑客首选的攻击目标。