食品 網(wǎng)站源碼山東移動網(wǎng)站建設(shè)
題解
web:[極客大挑戰(zhàn) 2019]Secret File(文件包含漏洞)
打開鏈接是一個普通的文字界面
查看一下源代碼
?發(fā)現(xiàn)一個鏈接,點進去看看
再點一次看看,沒什么用
仔細(xì)看,有一個問題,當(dāng)點擊./action.php時,跳轉(zhuǎn)到了./end.php界面
我們直接把end換成action試試,可是每一次訪問又自動跳轉(zhuǎn)到end.php了,在原界面查看也是一樣,老是跳轉(zhuǎn)
中間肯定有一個界面,只是我們無權(quán)訪問,使用bp抓包試試
訪問一下這個文件試試
訪問一下flag.php ,被隱藏了,但是看源代碼也是什么都沒有
再返回上一個界面看看,在url中得到一個變量file,如果file中含有../、tp、input、data等字符串,則輸出out,否則執(zhí)行file所指的文件發(fā)現(xiàn)過濾了部分關(guān)鍵字,但是并未過濾filter,那么可以嘗試用php://filter來獲取flag.php的內(nèi)容
構(gòu)造payload:將源代碼轉(zhuǎn)換為base64編碼
secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
?base64解碼
misc:buuctf另一個世界
附件下載,是一張圖片
結(jié)合題目所說的另一個世界,考慮是圖片隱寫,使用010打開,拉到最后有一串稀奇古怪的二進制
轉(zhuǎn)成字符串試試
提交一下試試,居然真的就是flag
crypto:
昨天的RSA沒整完,接著搞,搞完了就不兌換reverse和pwn了
BUUCTF-RSA2(低解密指數(shù)攻擊)
下載附件在記事本中打開,得到兩個巨大的n和e
用rsa-wiener-attack得出d
腳本
N = 101991809777553253470276751399264740131157682329252673501792154507006158434432009141995367241962525705950046253400188884658262496534706438791515071885860897552736656899566915731297225817250639873643376310103992170646906557242832893914902053581087502512787303322747780420210884852166586717636559058152544979471
e = 46731919563265721307105180410302518676676135509737992912625092976849075262192092549323082367518264378630543338219025744820916471913696072050291990620486581719410354385121760761374229374847695148230596005409978383369740305816082770283909611956355972181848077519920922059268376958811713365106925235218265173085d = 8920758995414587152829426558580025657357328745839747693739591820283538307445
dd = hex(d)
dd = dd+"L"
print(dd)
import hashlib
flag = "flag{" + hashlib.md5(dd.encode("utf-8")).hexdigest() + "}"
print(flag)
?BUUCTF [BJDCTF2020]rsa_output
一開始沒看懂這是個啥,看了大佬的wp才知道{}中的是兩個n和e,massage是兩個c,仔細(xì)看,兩個n還是相同的
既然是知道了c1,c2和e1,e2以及一個共同的n,那么嘗試共模攻擊
腳本:
import gmpy2
from Crypto.Util.number import getPrime,long_to_bytese1 = 2767
e2 = 3659
n = 21058339337354287847534107544613605305015441090508924094198816691219103399526800112802416383088995253908857460266726925615826895303377801614829364034624475195859997943146305588315939130777450485196290766249612340054354622516207681542973756257677388091926549655162490873849955783768663029138647079874278240867932127196686258800146911620730706734103611833179733264096475286491988063990431085380499075005629807702406676707841324660971173253100956362528346684752959937473852630145893796056675793646430793578265418255919376323796044588559726703858429311784705245069845938316802681575653653770883615525735690306674635167111c1 = 20152490165522401747723193966902181151098731763998057421967155300933719378216342043730801302534978403741086887969040721959533190058342762057359432663717825826365444996915469039056428416166173920958243044831404924113442512617599426876141184212121677500371236937127571802891321706587610393639446868836987170301813018218408886968263882123084155607494076330256934285171370758586535415136162861138898728910585138378884530819857478609791126971308624318454905992919405355751492789110009313138417265126117273710813843923143381276204802515910527468883224274829962479636527422350190210717694762908096944600267033351813929448599
c2 = 11298697323140988812057735324285908480504721454145796535014418738959035245600679947297874517818928181509081545027056523790022598233918011261011973196386395689371526774785582326121959186195586069851592467637819366624044133661016373360885158956955263645614345881350494012328275215821306955212788282617812686548883151066866149060363482958708364726982908798340182288702101023393839781427386537230459436512613047311585875068008210818996941460156589314135010438362447522428206884944952639826677247819066812706835773107059567082822312300721049827013660418610265189288840247186598145741724084351633508492707755206886202876227_,s1, s2 = gmpy2.gcdext(e1, e2)
m = pow(c1, s1, n) * pow(c2, s2, n) % n
print(long_to_bytes(m))
?BUUCTF RSA2(dp泄露)
?下載附件,題目給出了e,n,dp,c
常規(guī)思路是將n分解為p和q,但是這里的n太大,不好分解,而這里給出了dp,可以利用bp寫腳本(公式代換在后面)
import gmpy2
from Crypto.Util.number import long_to_bytese = 65537
n = 248254007851526241177721526698901802985832766176221609612258877371620580060433101538328030305219918697643619814200930679612109885533801335348445023751670478437073055544724280684733298051599167660303645183146161497485358633681492129668802402065797789905550489547645118787266601929429724133167768465309665906113
dp = 905074498052346904643025132879518330691925174573054004621877253318682675055421970943552016695528560364834446303196939207056642927148093290374440210503657c = 140423670976252696807533673586209400575664282100684119784203527124521188996403826597436883766041879067494280957410201958935737360380801845453829293997433414188838725751796261702622028587211560353362847191060306578510511380965162133472698713063592621028959167072781482562673683090590521214218071160287665180751for i in range(1, e):if (dp * e - 1) % i == 0:if n % (((dp * e - 1) // i) + 1) == 0:p = ((dp * e - 1) // i) + 1q = n // (((dp * e - 1) // i) + 1)d = gmpy2.invert(e, (p-1)*(q-1))m = pow(c, d, n)print(m)
print(long_to_bytes(m))
?BUUCTF RSA1
題目給出p,q,dp,dq,c,沒有e
?腳本:
import gmpy2
from Crypto.Util.number import long_to_bytes
p = 8637633767257008567099653486541091171320491509433615447539162437911244175885667806398411790524083553445158113502227745206205327690939504032994699902053229
q = 12640674973996472769176047937170883420927050821480010581593137135372473880595613737337630629752577346147039284030082593490776630572584959954205336880228469
dp = 6500795702216834621109042351193261530650043841056252930930949663358625016881832840728066026150264693076109354874099841380454881716097778307268116910582929
dq = 783472263673553449019532580386470672380574033551303889137911760438881683674556098098256795673512201963002175438762767516968043599582527539160811120550041
c = 24722305403887382073567316467649080662631552905960229399079107995602154418176056335800638887527614164073530437657085079676157350205351945222989351316076486573599576041978339872265925062764318536089007310270278526159678937431903862892400747915525118983959970607934142974736675784325993445942031372107342103852
I = gmpy2.invert(q,p)
m1 = pow(c,dp,p)
m2 = pow(c,dq,q)
m = (((m1-m2)*I)%p)*q+m2
print(long_to_bytes(m))
?BUUCTF rabbit
下載附件,得到密文
直接在線解密得到flag
知識點
web
php filter協(xié)議:一種過濾器,可以作為一個中間流來過濾其他的數(shù)據(jù)流
作用:讀取或者寫入部分?jǐn)?shù)據(jù),且在讀取和寫入之前對數(shù)據(jù)進行一些過濾,例如base64編碼,rot13處理等
使用方法:一般語法為
php://filter/過濾器|過濾器/resource=待過濾的數(shù)據(jù)流
其中過濾器可以設(shè)置多個,按照鏈?zhǔn)降姆绞揭来螌?shù)據(jù)進行過濾處理
e.g.對<?php phpinfo();?>這個字符串進行了兩次base64編碼處理
echo file_get_contents("php://filter/read=convert.base64-encode|convert.base64-encode/resource=data://text/plain,<?php phpinfo();?>");
?crypto
5.低解密指數(shù)攻擊(維納攻擊)
適用情況:e很大,解密指數(shù)d較小,公鑰e和模數(shù)n是公開的
原理:
ed ≡ 1 (mod φ(n)),其中e是公鑰的加密指數(shù),d是私鑰的解密指數(shù),φ(n)是n的歐拉函數(shù)值(即(p-1)(q-1))。當(dāng)d較小時,攻擊者可以通過對e/N(N=pq)進行連分?jǐn)?shù)展開,找到一串?dāng)?shù)的分母,這個分母很有可能就是d。
工具:rsa-wiener-attack
下載工具后使用wiener攻擊腳本得出d的值(注意要將腳本和rsa-wiener-attack的py文件放在同一個目錄下)
import RSAwienerHacker
n =
e =
d = RSAwienerHacker.hack_RSA(e,n)
if d:print(d)
腳本:
N =
e = d =
dd = hex(d)
dd = dd+"L"
print(dd)
import hashlib
flag = "flag{" + hashlib.md5(dd.encode("utf-8")).hexdigest() + "}"
print(flag)
具體原理參考:RSA加密與解密(一)_rsa解密-CSDN博客
6.共模攻擊
適用情況:多組c,e但模數(shù)n相同,且e之間最好互質(zhì)
原理:當(dāng)多個密文使用相同的n進行加密時,可能通過密文之間的關(guān)系來獲取明文信息,而無需知道私鑰
c1 = m^e1 mod n??? =>c1^s1 = m^(e1*s1) mod n
c2 = m^e2 mod n??? =>c2^s2 = m^(e2*s2) mod n
兩者相乘,通過擴展歐幾里得定理,我們可知e1與e2互質(zhì),必存在s1和s2使e1*s1+e2*s2=1
由此可求出相對應(yīng)的s1和s2.
m=(c1*s1+c2*s2)%n
?腳本:
import gmpy2
from Crypto.Util.number import getPrime,long_to_bytese1 =
e2 =
n = c1 =
c2 = _,s1, s2 = gmpy2.gcdext(e1, e2)
m = pow(c1, s1, n) * pow(c2, s2, n) % n
print(long_to_bytes(m))
7.dp泄露
適用情況:題目提供dp或dq
原理:
dp=d%(p-1)
d = dp + k1 * (p-1)
d * e = 1 + k2(p-1)(q-1)
把第二個式子的d代換掉:
e * (dp + k1(p-1)) = 1 + k2(p-1)(q-1)
兩邊同時對(p-1)取模,消去k
e * dp % (p - 1) = 1
e * dp = 1 + k(p - 1)
再通過爆破k的方式求出p,進而求出d
?腳本:
import gmpy2
from Crypto.Util.number import long_to_bytese =
n =
dp = c = for i in range(1, e):if (dp * e - 1) % i == 0:if n % (((dp * e - 1) // i) + 1) == 0:p = ((dp * e - 1) // i) + 1q = n // (((dp * e - 1) // i) + 1)d = gmpy2.invert(e, (p-1)*(q-1))m = pow(c, d, n)print(m)
print(long_to_bytes(m))
8.dp,dq同時泄露
原理:
m1 = c^dpmodp
m2 = c^dqmodq
m = (((m1-m2)*I)%p)*q+m2
其中I為對pq求逆元
腳本:
import gmpy2
from Crypto.Util.number import long_to_bytes
p =
q =
dp =
dq =
c =
I = gmpy2.invert(q,p)
m1 = pow(c,dp,p)
m2 = pow(c,dq,q)
m = (((m1-m2)*I)%p)*q+m2
print(long_to_bytes(m))