SQL Inject

SQL(pikachu)

SQL Inject漏洞概述

owasp发布的top 10漏洞里面,注入漏洞一直是危害排名第一,其中主要指 SQL Inject漏洞

数据库注入漏洞,主要是开放人员在构建代码时,没有对输入边界进行安全考虑,导致攻击者可以通过合法的输入点提交一些精心构造的语句,从而欺骗后台数据库对其进行执行,导致数据库信息泄露的一种漏洞。
请添加图片描述

SQL Inject漏洞攻击流程

1、第一步:注入点探测
—— 自动方式:使用web漏洞扫描工具,自动进行注入点发现
—— 手动方式:手工构造sql inject测试语句进行注入点发现
2、第二步:信息获取
通过注入点期望得到的数据。
—— 1.环境信息:数据库类型,数据库版本,操作系统版本,用户信息等。
—— 2.数据库信息:数据库名称,数据库表,表字段,字段内容(加密内容破解)
3、第三步:获取权限
—— 获取操作系统权限:通过数据库执行shell,上传木马

SQL Inject漏洞 - 常见注入点类型

  • 数字型 —— user_id=$id
  • 字符型 —— user_id= ‘$id’
  • 搜索型 —— text LIKE ‘%{$_GET[‘search’]}%’"

SQL Inject - 数字型注入(pikachu)

$id $_POST['id']
select 字段1,字段2 from 表名 where id = $id;
select 字段1,字段2 from 表名 where id = 1 or 1 = 1; //简单的数字型的SQL Inject的演示

SQL Inject 漏洞代码分析(数字型)

if(isset($_POST['submit']) && $_POST['id']!=null){
    //这里没有做任何处理,直接拼到select里面去了,形成Sql注入
    $id=$_POST['id'];
    $query="select username,email from member where id=$id";
    $result=execute($link, $query);
    //这里如果用==1,会严格一点
    if(mysqli_num_rows($result)>=1){
        while($data=mysqli_fetch_assoc($result)){
            $username=$data['username'];
            $email=$data['email'];
            $html.="<p class='notice'>hello,{$username} <br />your email is: {$email}</p>";
        }
    }else{
        $html.="<p class='notice'>您输入的user id不存在,请重新输入!</p>";
    }
}

请添加图片描述

SQL Inject - 字符型注入(pikachu)

$username=$_GET['username']
select 字段1,字段2 from 表名 where username='kobe';
~~kobe or 1=1~~ 
select 字段1,字段2 from 表名 where username='kobe' or 1=1#';

SQL Inject 漏洞代码分析(字符型)

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>";
    }
}

请添加图片描述

SQL Inject - 搜索型注入(pikachu)

select * from member where username like '%k%';
like '%xxxx%' or 1=1 #%'
%xxxx%' or 1=1 #

= ('xx')or 1=1 #')
xx')or 1=1 #

SQL Inject 漏洞代码分析(搜索型)

 //这里没有做任何处理,直接拼到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>";
    }
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>";
    }
}

总结

不管是什么型,总而言之,就是对SQL中的各种类型的输入进行闭合测试,构造合法SQL,欺骗后台执行!

补充:MYSQL小知识:注释符号

因为在SQL注入测试中,需要经常对多余的内容进行消除,以保证SQL语句语法正确,比如上面的#。
使用注释符号直接对多余内容进行注释是比较有效的方法。

MySQL服务器支持3种注释:
1.从 '#' 字符从行尾。
2.从 '--' 序列到行尾。请注意 '--'(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如:空格、tab、换行等等)。该语法与标准SQL注释语法稍有不同。
3.从 /* 序列到后面 */ 序列。结束序列不一定在同一行中,因此该语法允许注释跨越多行。
4.下面的例子显示了3种风格的注释:

mysql> SELECT 1+1;   #This is comment continues to the end of line
mysql> SELECT 1+1;   --This comment continues to the end of line
mysql> SELECT 1 /*This is an in-line comment*/ + 1;
mysql> SELECT 1+ /*This is amultiple-line comment*/ 1;

注入方式get&post区别

GET 方式中使用URL提交注入数据;
POST 方式中使用抓包工具修改post数据部分提交注入;

不管是 GET方式还是 POST方式,都可能会出现SQL注入漏洞,本质其实是一样的!

以上是我的听课及学习笔记,欢迎借鉴交流学习,并指出不足!谢谢支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值