RoarCTF 部分WP

WEB

easy_calc

訪問calc.php不帶num參數(shù)的時(shí)候就可以得到calc.php源碼

<?php 
error_reporting(0); 
if(!isset($_GET['num'])){ 
    show_source(__FILE__); 
}else{ 
        $str = $_GET['num']; 
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^']; 
        foreach ($blacklist as $blackitem) { 
                if (preg_match('/' . $blackitem . '/m', $str)) { 
                        die("what are you want to do?"); 
                } 
        } 
        eval('echo '.$str.';'); 
} 
?> 

輸入?num=phpinfo()庄岖,發(fā)現(xiàn)有403錯(cuò)誤。
接下來就是繞WAF的問題角骤。
參考利用PHP函數(shù)parse_str繞過IDS隅忿、IPS和WAF,只需要在參數(shù)num前加一個(gè)%20即可邦尊,如下

然后就是繞單引號(hào)和個(gè)別函數(shù)之類的過濾背桐。
嘗試如下:

  1. 因?yàn)椴荒苁褂靡?hào)和system,所以無法直接執(zhí)行系統(tǒng)命令胳赌,如lspwd等匙隔,所以使用?%20num=dirname(__FILE__)?%20num=print_r(scandir(dirname(__FILE__)))讀取當(dāng)前路徑和當(dāng)前目錄下的文件
    疑苫,一開始我以為flagindex.html里,所以想用highlight_file()去讀取文件纷责,但是不能使用引號(hào)的情況下捍掺,無法讀取指定文件。
  2. 既然num參數(shù)被加了黑名單過濾再膳,那可不可以在別的地方執(zhí)行命令挺勿?這里參考一葉飄零師傅無參Getshell,里面隨便用一個(gè)方法都能繞過過濾喂柒。我這里使用的是
  3. 還能通過編碼的方式來實(shí)現(xiàn)繞過不瓶,如使用eval(base64_decode(cHJpbnRfcihzY2FuZGlyKCcvJykpOzs7))
    其中base64編碼過的部分為print_r(scandir('/'));;;,為什么是三個(gè)分號(hào)我也沒搞懂灾杰。蚊丐。
  4. 還能使用a的方式來替代a['b']艳吠,從而繞過引號(hào)過濾麦备,如eval(get_defined_vars(){_GET}{a})&a=print_r(scandir('/'));,其中{_GET}{a}[_GET][a]一樣昭娩。

simple_upload

題目如下:

<?php 
namespace Home\Controller; 

use Think\Controller; 

class IndexController extends Controller 
{ 
    public function index() 
    { 
        show_source(__FILE__); 
    } 
    public function upload() 
    { 
        $uploadFile = $_FILES['file'] ; 
         
        if (strstr(strtolower($uploadFile['name']), ".php") ) { 
            return false; 
        } 
         
        $upload = new \Think\Upload();// 實(shí)例化上傳類 
        $upload->maxSize  = 4096 ;// 設(shè)置附件上傳大小 
        $upload->allowExts  = array('jpg', 'gif', 'png', 'jpeg');// 設(shè)置附件上傳類型 
        $upload->rootPath = './Public/Uploads/';// 設(shè)置附件上傳目錄 
        $upload->savePath = '';// 設(shè)置附件上傳子目錄 
        $info = $upload->upload() ; 
        if(!$info) {// 上傳錯(cuò)誤提示錯(cuò)誤信息 
          $this->error($upload->getError()); 
          return; 
        }else{// 上傳成功 獲取上傳文件信息 
          $url = __ROOT__.substr($upload->rootPath,1).$info['file']['savepath'].$info['file']['savename'] ; 
          echo json_encode(array("url"=>$url,"success"=>1)); 
        } 
    } 
}

已知的是使用了ThinkPHP的框架凛篙,發(fā)現(xiàn)以下代碼為開發(fā)者自己寫的過濾,懷疑存在問題

if (strstr(strtolower($uploadFile['name']), ".php") ) { 
         return false; 
} 

該代碼將判斷文件名是否存在.php栏渺。
打開thinkphp3.2.3源碼中/Library/Think/Upload.class.php呛梆,找到對(duì)應(yīng)的上傳文件處理過程代碼,如下:

 // 對(duì)上傳文件數(shù)組信息處理
$files   =  $this->dealFiles($files);    
foreach ($files as $key => $file) {
   $file['name']  = strip_tags($file['name']);
   if(!isset($file['key']))   $file['key']    =   $key;
/* 通過擴(kuò)展獲取文件類型磕诊,可解決FLASH上傳$FILES數(shù)組返回文件類型錯(cuò)誤的問題 */
   if(isset($finfo)){
       $file['type']   =   finfo_file ( $finfo ,  $file['tmp_name'] );
}

可以發(fā)現(xiàn)削彬,thinkphp框架會(huì)對(duì)filename進(jìn)行strip_tags操作


剝?nèi)?biāo)簽全庸,這樣的話我們文件后綴只需要在php中插入任何HTML標(biāo)簽即可繞過過濾,且可以正常解析融痛。
構(gòu)造一個(gè)上傳頁面

<html>
<body>
    <form action="http://cndljjs6roarctf.4hou.com.cn:37326/index.php/home/index/upload" method="post" enctype="multipart/form-data">
        <label for="file">Filename:</label>
        <input type="file" name="file" id="file" />
        <br />
        <input type="submit" name="submit" value="Submit" />
    </form>
</body>
</html>

上傳任意一個(gè)php文件壶笼,然后抓包修改后綴為p<img>hp,上傳成功

訪問目標(biāo)文件雁刷,得到flag

Easy java

點(diǎn)開help覆劈,發(fā)現(xiàn)url里有個(gè)Download?filename=,懷疑存在任意文件下載
GET改成POST沛励,發(fā)現(xiàn)下載成功责语。

下載WEB-INF/web.xml查看目錄結(jié)構(gòu)
查閱javaweb的目錄結(jié)構(gòu),以及得到的servlet-class值目派,可以下載到所需要的class文件
可以發(fā)現(xiàn)文件中有著一串base64編碼過的字符串坤候,解碼得到flag

Crypto

RSA

題目如下:

A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
p=next_prime(z*x*y)
q=next_prime(z)
A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c =  41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128

未知數(shù)有三個(gè),包括x企蹭,y白筹,z,我們能做的就是通過A谅摄,N恢復(fù)出未知數(shù)的值徒河。
先觀察A,可以發(fā)現(xiàn)有個(gè)迷惑性的運(yùn)算送漠,**2019顽照,我們要知道, 即使是2^{2019}闽寡,結(jié)果也是至少2019/3位的十進(jìn)制數(shù)代兵,而A僅僅為607位,因此我們可以知道(((y\%x)^5)\%(x\%y))的值爷狈,其實(shí)為1奢人。
接下來就是解方程了,我們可以通過化解等式得到x=(y+1)/(A-1-y^{316})淆院,而且很明顯何乎,A的主要是有y**316組成。這樣的話土辩,我們可以通過遍歷y來確定y的值支救,然后求得x。代碼如下:

for y in range(1000):
    if y**316>A:
        y-=1
        break
x = (y+1)/(A-1-y**316)

然后是如何根據(jù)N恢復(fù)出p拷淘,q各墨。
我們首先需要知道的是,z*x*yz其實(shí)并沒有相差太多启涯,所以next_prime(z*x*y)next_prime(z)也不會(huì)相差太多贬堵。
所以我們可以用求根的方法恃轩,然后在根值附件尋找,代碼如下:

z = gmpy2.iroot(n/(x*y),2)[0]
q = gmpy2.next_prime(z)
while True:
    if n % q == 0:
        break
    q = gmpy2.next_prime(q)
p = n/q

接下來就是正常的RSA的過程了黎做,另外叉跛,加密密鑰e可以試試幾個(gè)常用的就能試出來了,總的代碼如下

import gmpy2
from libnum import n2s
# A=(((y%x)**5)%(x%y))**2019+y**316+(y+1)/x
# p=next_prime(z*x*y)
# q=next_prime(z)
A =  2683349182678714524247469512793476009861014781004924905484127480308161377768192868061561886577048646432382128960881487463427414176114486885830693959404989743229103516924432512724195654425703453612710310587164417035878308390676612592848750287387318129424195208623440294647817367740878211949147526287091298307480502897462279102572556822231669438279317474828479089719046386411971105448723910594710418093977044179949800373224354729179833393219827789389078869290217569511230868967647963089430594258815146362187250855166897553056073744582946148472068334167445499314471518357535261186318756327890016183228412253724
n =  117930806043507374325982291823027285148807239117987369609583515353889814856088099671454394340816761242974462268435911765045576377767711593100416932019831889059333166946263184861287975722954992219766493089630810876984781113645362450398009234556085330943125568377741065242183073882558834603430862598066786475299918395341014877416901185392905676043795425126968745185649565106322336954427505104906770493155723995382318346714944184577894150229037758434597242564815299174950147754426950251419204917376517360505024549691723683358170823416757973059354784142601436519500811159036795034676360028928301979780528294114933347127
c =  41971850275428383625653350824107291609587853887037624239544762751558838294718672159979929266922528917912189124713273673948051464226519605803745171340724343705832198554680196798623263806617998072496026019940476324971696928551159371970207365741517064295956376809297272541800647747885170905737868568000101029143923792003486793278197051326716680212726111099439262589341050943913401067673851885114314709706016622157285023272496793595281054074260451116213815934843317894898883215362289599366101018081513215120728297131352439066930452281829446586562062242527329672575620261776042653626411730955819001674118193293313612128
for y in range(1000):
    if y**316>A:
        y-=1
        break
x = (y+1)/(A-1-y**316)
z = gmpy2.iroot(n/(x*y),2)[0]
q = gmpy2.next_prime(z)
while True:
    if n % q == 0:
        break
    q = gmpy2.next_prime(q)
p = n/q
d = gmpy2.invert(0x10001,(p-1)*(q-1))
m = pow(c,d,n)
print n2s(m)

babyrsa

import sympy
import random

def myGetPrime():
    A= getPrime(513)
    print(A)
    B=A-random.randint(1e3,1e5)
    print(B)
    return sympy.nextPrime((B!)%A)
p=myGetPrime()
#A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
#B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596

q=myGetPrime()
#A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
#B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026

r=myGetPrime()

n=p*q*r
#n=85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733
c=pow(flag,e,n)
#e=0x1001
#c=38620963949231568493951852806812359956058522979245676395704780066879051018892175913415575431734194586035432099562300809271498658506900105389975586615280808081596988894713047252672924018208747721253303054480800386069769084714127190055658807083226038640292692679215406182331245636616583141043207599068234065117886147748321058731290102675088056205224134057176167818706519201527516421824645801542347535393294450756726281744763656819345306146716190523210020241675468
#so,what is the flag?

主要的問題就是大數(shù)階乘模運(yùn)算怎么求
這里用到的是威爾遜定理蒸殿,當(dāng)且僅當(dāng)p為素?cái)?shù)時(shí):( p -1 )! ≡ -1 ( mod p )來減少階乘模的運(yùn)算量筷厘。
已知( A -1 )! ≡ -1 ( mod A ),B=A-r宏所,求(B)!≡? (mod A)酥艳,即(A-r)!≡? (mod A)
解過程如下\begin{align} ( A -1 )! &≡ -1 ( mod A ) \\ ( A -2 )!& ≡ -1 *(A-1)^{-1}( mod A ) \\ \cdots \\ ( A -r )!& ≡ -1 *(A-1)^{-1}(A-2)^{-1}\cdots(A-r+1)^{-1}( mod A ) \end{align}
代碼如下:

import gmpy2
import libnum
def getpq(A,B):
    rand = A - B
    b = -1
    for i in range(1,rand):
        tmp = (b%A)*gmpy2.invert(A-i,A)
        b = tmp%A
    return gmpy2.next_prime(b)

A1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467234407
B1=21856963452461630437348278434191434000066076750419027493852463513469865262064340836613831066602300959772632397773487317560339056658299954464169264467140596
p = getpq(A1,B1)

A2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858418927
B2=16466113115839228119767887899308820025749260933863446888224167169857612178664139545726340867406790754560227516013796269941438076818194617030304851858351026
q= getpq(A2,B2)

n = 85492663786275292159831603391083876175149354309327673008716627650718160585639723100793347534649628330416631255660901307533909900431413447524262332232659153047067908693481947121069070451562822417357656432171870951184673132554213690123308042697361969986360375060954702920656364144154145812838558365334172935931441424096270206140691814662318562696925767991937369782627908408239087358033165410020690152067715711112732252038588432896758405898709010342467882264362733

r=n/(p*q)
e=0x1001
d = gmpy2.invert(e,(p-1)*(q-1)*(r-1))
c=38620963949231568493951852806812359956058522979245676395704780066879051018892175913415575431734194586035432099562300809271498658506900105389975586615280808081596988894713047252672924018208747721253303054480800386069769084714127190055658807083226038640292692679215406182331245636616583141043207599068234065117886147748321058731290102675088056205224134057176167818706519201527516421824645801542347535393294450756726281744763656819345306146716190523210020241675468
m = pow(c,d,n)
print libnum.n2s(m)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市爬骤,隨后出現(xiàn)的幾起案子充石,更是在濱河造成了極大的恐慌,老刑警劉巖霞玄,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骤铃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡溃列,警方通過查閱死者的電腦和手機(jī)劲厌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門膛薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听隐,“玉大人,你說我怎么就攤上這事哄啄⊙湃危” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵咨跌,是天一觀的道長(zhǎng)沪么。 經(jīng)常有香客問我,道長(zhǎng)锌半,這世上最難降的妖魔是什么禽车? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮刊殉,結(jié)果婚禮上殉摔,老公的妹妹穿的比我還像新娘。我一直安慰自己记焊,他們只是感情好逸月,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遍膜,像睡著了一般碗硬。 火紅的嫁衣襯著肌膚如雪瓤湘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天恩尾,我揣著相機(jī)與錄音弛说,去河邊找鬼。 笑死特笋,一個(gè)胖子當(dāng)著我的面吹牛剃浇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播猎物,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼虎囚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蔫磨?” 一聲冷哼從身側(cè)響起淘讥,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堤如,沒想到半個(gè)月后蒲列,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搀罢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年蝗岖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榔至。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡抵赢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出唧取,到底是詐尸還是另有隱情铅鲤,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布枫弟,位于F島的核電站邢享,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏淡诗。R本人自食惡果不足惜骇塘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望韩容。 院中可真熱鬧款违,春花似錦、人聲如沸宙攻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽座掘。三九已至递惋,卻和暖如春柔滔,著一層夾襖步出監(jiān)牢的瞬間铣口,已是汗流浹背虎敦。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工庆亡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绿贞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓秦效,卻偏偏與公主長(zhǎng)得像恬涧,于是被迫代替她去往敵國(guó)和親穷绵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邓馒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容