0x01:sql注入形成的过程
随着我国从互联网时代,到现在的物联网时代,计算机行业飞速发展,这方面的
人才需求也逐年增多,由于程序员水平层次不齐,没有安全意识,以及快速迭代导致
了,代码质量不高,给攻击者提供了便利,导致这样那样的安全事件层出不穷。
先介绍一种架构B/S如下图所示:
image.png
以Java为例简单的实现以下:
表现层
<form action="/superzedlv/login" method="post">
用户名:<input name="name" size="20" type="text"><br><br>
密码:<input name="pass" size="20" type="password"><br><br>
<input type="submit" value="登录">
</form>
应用层
//从前端获取表单中的数据
String name1=req.getParameter("name");
//拼接sql语句
String sql="select * from user where user='"+name1+"'";
数据层
执行sql语句查询数据
select * from user where user=name;
0x02:利用漏洞
首先我们确认漏洞,以上述为例我们传入的name拼接的时候变成了
select * from user where user=‘name’;
可以看到我们传入的数据被当做一个条件的值
那么如果我们传入的条件是admin’ and 1=1 #那么会发生什么呢
select * from user where user=‘admin’ and 1=1 #’
#直接将后面的内容注释掉不执行
结果是返回正确的,如果and后面的条件为假时返回错误
那么说明我们后面的条件语句是执行的,也就意味着我们可以通过
浏览器直接执行我们想要执行的sql语句(访问数据层),不需要任何权限。
同样我们也可以通过这样admin' and 1='1语句绕过‘’
select * from user where user=‘admin’ and 1=‘1’
其实我们的目的就是构造可以执行的sql语句,获取信息
下面我们就可以通过sql 语句获取其他信息了
我们可以想一下我还有一个管理员表admin,存放着管理员信息
那么我们就可以构造语句
select * from user where user=‘name’ union select * from admin;
直接查询管理员信息。
0x03:安全防护
1)使用占位符
2)对sql语句进行过滤
3)不使用sql拼接的方式构造sql语句
4)对参数类型进行限制
原文地址:http://www.superzedlv.cn/?id=5
未经允许,禁止转载