網鼎杯
2020年網鼎杯馬上開始了,來做一下歷年真題
打開題目
點擊發帖-提交,跳轉到一個登錄界面,不過已經提升了用戶名和密碼
爆破后面三位,登錄成功
登錄進去就可以發帖了,但也不有想法,注入點試了不行,用掃描,發現存在.git文件
那應該存在.git文件泄露,用下載發現有一個.php,但是代碼有缺失
查一下之前提交的版本,單獨用git log不能全部顯示,直接用git log --all
可以看到,head指針指向的是最早一次,通過git reset --hard 命令將head指向第一個,得到完整的.php
include "mysql.php";
session_start();

if($_SESSION['login'] != 'yes'){
header("Location: ./login.php");
die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);
$sql = "insert into board
set category = '$category',
title = '$title',
content = '$content'";
$result = mysql_query($sql);

header("Location: ./index.php");
break;
case 'comment':
$bo_id = addslashes($_POST['bo_id']);
$sql = "select category from board where id='$bo_id'";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
if($num>0){
$category = mysql_fetch_array($result)['category'];
$content = addslashes($_POST['content']);
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
$result = mysql_query($sql);
}

header("Location: ./comment.php?id=$bo_id");
break;
default:
header("Location: ./index.php");
}
}
else{
header("Location: ./index.php");
}
?>
后臺對輸入的參數通過()對預定義字符進行轉義,加上\,預定義的字符包括單引號,雙引號,反斜杠,NULL。放到數據庫后會把轉義符\去掉后,存入數據庫中。
發帖的時候所有參數進行了轉義才放到sql語句中,但是在中萬能數據庫注入插件,對于的值從數據庫取出來沒有進行轉義,直接拼接到sql 語句中,這就存在二次注入的可能。
二次注入和普通的sql注入區別就是,二次注入是把惡意代碼放入數據庫中,執行后通過等語句把結果回顯,一般存在于語句中
思路就是通過發帖,在中放入,存入數據庫中萬能數據庫注入插件,不過這一過程因為對單引號等作了轉義,不會被觸發,只有在發帖成功后,在留言,調用語句時因為沒有對數據庫取出的進行轉義,直接拼接才會觸發。
發帖
:0‘+hex(()),=324,/*
2.在提交留言處輸入*/#
這樣 sql語句拼接成:
insert into comment
set category = '0'+hex(database()),content=324,/*,
content = '*/#',
bo_id = '$bo_id'
留言顯示324,說明插入成功,但是在并沒有回顯,改一下:a',=()),/*
重復上面操作
回顯數據庫名為ctf,之后查表等發現都不行,看了師傅們的,發現這里是用sql來讀取文件。模板: (‘文件絕對路徑’);
首先讀取/etc/,這個文件存放了系統用戶和用戶的路徑
:a',=( (('/etc/'))),/*
讀取成功,可以知道www用戶(一般和網站操作相關的用戶,由中間件創建)的目錄是/home/www,可以查詢這下面的.
:a',=( (('/home/www/.'))),/*
得到歷史記錄里之前所執行的命令
可以看到html.zip里面有一個.文件,在/var/www/html目錄下刪除了,但是在/tmp/下只是刪除了壓縮包,還存在.文件,讀取這個文件。
Mac OS 保存文件夾的自定義屬性的隱藏文件。通過.可以知道這個目錄里面所有文件的清單
:a', =( (('/tmp/html/.'))),/*
但是沒有顯示完全,改為:a', =( hex(('/tmp/html/.'))),/*
hex解碼以后通過--得到
:a',=( hex(('/var/www/html/f.php'))),/*
解碼后得到flag
考得知識點好多啊,tnl