一个人的闲言碎语

dr0v

blog.drov.com.cn
一个人碎碎念。
About Me
A lazy security employee.

2018年10月31日星期三

继续学习web安全,SQL注入是初学者最先接触的攻击方式了。

SQL注入

SQL注入漏洞是Web层面最高危的漏洞之一。2005年前后,SQL注入漏洞随处可见,在用户登录或搜索时,输入单引号即可检测出SQL注入漏洞。此后,随着Web应用的安全性提高,SQL注入漏洞逐渐减少,也更难检测与利用。

SQL注入原理

SQL注入漏洞往往是由于服务器对用户提交的数据输入未做到较好的过滤,导致用户插入在Web表单或URL等查询字符串中的SQL命令进行了执行。一般较多出现在登录表单的提交中。
以登录页面为例,通过万能密码来简单介绍SQL注入原理.

万能帐号

如图,为一个登录界面,用户输入username与password后,后台对帐号密码进行验证,若返回正常(一般返回值为1或true)即登录成功。

一般背后验证的代码如下:
String sql = "select * from table where user_name='" + userName +"' and pass_word='" + passWord + "'";
try{
    ResultSet res = this.conn.createStatement().executeQuery(sql);
    if(res.next()){
        int i = res.getInt(1);
        if(i>0){
            return true;
        }
    }
} catch (Exception e){
    e.printStackTrace();
}
return false;
从代码可以看出,假如用户输入的是test、test,最终SQL执行的sql语句是: select * from table where user_name ='test' and pass_word='test'
而一旦用户输入的是如上图所示的' or 1=1--,由于代码未对输入做过滤,所以最终执行的语句会是:select * from table where user_name ='' or 1=1--' and pass_word='1'
--为注释语句,所以后续条件均被注释,无法起到作用,而实际前面的判断有一个or条件是1=1,所以SQL执行的相当于是select * from table,所以验证通过,登录成功。

应对方案
通过对用户输入数据进行过滤,即可达到简单的解决。当然,SQL注入的姿势多种多样,所以解决方案也十分繁复,在持续的Web攻击学习过程中也更容易帮助我们了解攻击原理,思考应对方案。
sql = sql.replaceAll(".*([';]+|(--)+).*", " ");
Categories: , ,

0 评论:

发表评论