從這道題學到了挺多
一打開題目就是登陸頁面,遂掃描文件檢測是否存在文件泄露
用dirsearch掃出了robots.txt,.DS_Store和其他php。DS_Store沒有可用信息(buuoj的題掃描一定不能太快。。。。429警告)
打開robots.txt,要素察覺,有備份文件。
逐個嘗試,發現了image.php.bak文件,分析一波源碼
<?php include "config.php"; $id=isset($_GET["id"])?$_GET["id"]:"1"; $path=isset($_GET["path"])?$_GET["path"]:""; $id=addslashes($id); $path=addslashes($path); $id=str_replace(array("\\0","%00","\\'","'"),"",$id); $path=str_replace(array("\\0","%00","\\'","'"),"",$path); $result=mysqli_query($con,"select * from images where id='{$id}' or path='{$path}'"); $row=mysqli_fetch_array($result,MYSQLI_ASSOC); $path="./" . $row["path"]; header("Content-Type: image/jpeg"); readfile($path);
addslashes函數會在預定字符前加\,如果我們在id參數傳入\0,經過addslashes函數處理就會變為\\0,然而后面的str_replace把\0置換為空,那
么我們插入的\\0就會變成\,把id參數后的'轉義。此時我們的sql語句如下
select * from images where id='or path=''
可以在path參數進行注入,注釋掉后面的單引號並用and 1=1構造注入
select * from images where id='or path='and 1=1--+'
也可以利用path重新構造id進行注入
select * from images where id='or path=' or id=1--+'
腳本如下
注入這里搞了半天,密碼比較長。把n的范圍設到20才爆出完整密碼
因為手工太慢了所以嘗試了sqlmap
sqlmap牛逼!!不過這里有個坑。。。。\0前要加\轉義讓\失去轉義功能,可以用v參數查看注入的payload來調整語句
查到用戶名和密碼登錄之后發現上傳點
隨便傳個文件,返回結果里顯示有上傳路徑
打開之后發現是日志文件,用來記錄上傳的文件名
接下來思路就很清晰了,這是個php文件,並且會記錄文件名。我們只需要把文件名改成一句話。上傳之后就會被解析成php。一般的一句話會被攔截,因為出現了"php"。我們可以采用短標簽<?= ?>代替<?php ?>
蟻劍連接,flag在根目錄