一、概述
在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。
一个严重的SQL注入漏洞,可能会直接导致一家公司破产!
SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。
在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:
1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;
2.使用参数化(Parameterized Query 或 Parameterized Statement);
3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!
注:GET与POST区别
①GET方式中使用URL提交注入数据
②POST方式中使用抓包工具修改POST数据部分提交注入
二、数字型注入(post)
①我们选择ID,观察到URL没有参数变化,直接采取抓包。
②其实我们可以在phpstduy中的sql命令行中打开数据库终端查询查询对应的内容。
命令:show database;(显示所有数据库)
命令:use pikachu;(切换至pikachu数据库)
命令:show tables; (查看pikachu数据库中所有的表)
命令:desc member;(降序查看member表中字段 注:asc为升序)
命令:select from username,email from member where id = 1;(显示出member表中id=1的username和email信息)
命令:select from username,email from member where id=1 or 1=1;(我们在尾缀加上or 1=1,这样where后的表达式永远成立执行,就会查询出所有的信息)
②我们在burpsuite中的Repeater模块中修改数据包重新发送,就查询出了所有的信息。
三、字符型注入(get)
①我们以kobe为例测试一下
②我们构造一下注入语句,猜测是以单引号包裹的username
构造语句:kobe ’ or 1=1 #
还真被我们猜中了
③观察源码,可以看出以是单引号包裹的
if(isset($_GET['submit']) && $_GET['name']!=null){ //这里没有做任何处理,直接拼到select里面去了 $name=$_GET['name']; //这里的变量是字符型,需要考虑闭合 $query="select id,email from member where username='$name'"; $result=execute($link, $query); if(mysqli_num_rows($result)>=1){ while($data=mysqli_fetch_assoc($result)){ $id=$data['id']; $email=$data['email']; $html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>"; } }else{ $html.="<p class='notice'>您输入的username不存在,请重新输入!</p>"; } }
四、搜索型注入
①查看源码
if(isset($_GET['submit']) && $_GET['name']!=null){ //这里没有做任何处理,直接拼到select里面去了 $name=$_GET['name']; //这里的变量是模糊匹配,需要考虑闭合 $query="select username,id,email from member where username like '%$name%'"; $result=execute($link, $query); if(mysqli_num_rows($result)>=1){ //彩蛋:这里还有个xss $html2.="<p class='notice'>用户名中含有{$_GET['name']}的结果如下:<br />"; while($data=mysqli_fetch_assoc($result)){ $uname=$data['username']; $id=$data['id']; $email=$data['email']; $html1.="<p class='notice'>username:{$uname}<br />uid:{$id} <br />email is: {$email}</p>"; } }else{ $html1.="<p class='notice'>0o。..没有搜索到你输入的信息!</p>"; } }
②构造注入语句 k%’ or 1=1#
五、xx型注入
①观察源码,发现包裹变为了(‘’)
if(isset($_GET['submit']) && $_GET['name']!=null){ //这里没有做任何处理,直接拼到select里面去了 $name=$_GET['name']; //这里的变量是字符型,需要考虑闭合 $query="select id,email from member where username=('$name')"; $result=execute($link, $query); if(mysqli_num_rows($result)>=1){ while($data=mysqli_fetch_assoc($result)){ $id=$data['id']; $email=$data['email']; $html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>"; } }else{ $html.="<p class='notice'>您输入的username不存在,请重新输入!</p>"; } }
②构造注入语句 kobe’) or 1=1#
六、Insert/update注入
七、delete注入
八、http header注入
九、盲注(base on boolian)
十、盲注(base on time)
十一、宽字节注入