题解
web:[极客大挑战 2019]Secret File(文件包含漏洞)
打开链接是一个普通的文字界面
查看一下源代码
发现一个链接,点进去看看
再点一次看看,没什么用
仔细看,有一个问题,当点击./action.php时,跳转到了./end.php界面
我们直接把end换成action试试,可是每一次访问又自动跳转到end.php了,在原界面查看也是一样,老是跳转
中间肯定有一个界面,只是我们无权访问,使用bp抓包试试
访问一下这个文件试试
访问一下flag.php ,被隐藏了,但是看源代码也是什么都没有
再返回上一个界面看看,在url中得到一个变量file,如果file中含有../、tp、input、data等字符串,则输出out,否则执行file所指的文件发现过滤了部分关键字,但是并未过滤filter,那么可以尝试用php://filter来获取flag.php的内容
构造payload:将源代码转换为base64编码
secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
base64解码
misc:buuctf另一个世界
附件下载,是一张图片
结合题目所说的另一个世界,考虑是图片隐写,使用010打开,拉到最后有一串稀奇古怪的二进制
转成字符串试试
提交一下试试,居然真的就是flag
crypto:
昨天的RSA没整完,接着搞,搞完了就不兑换reverse和pwn了
BUUCTF-RSA2(低解密指数攻击)
下载附件在记事本中打开,得到两个巨大的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,仔细看,两个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
常规思路是将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协议:一种过滤器,可以作为一个中间流来过滤其他的数据流
作用:读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码,rot13处理等
使用方法:一般语法为
php://filter/过滤器|过滤器/resource=待过滤的数据流
其中过滤器可以设置多个,按照链式的方式依次对数据进行过滤处理
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.低解密指数攻击(维纳攻击)
适用情况:e很大,解密指数d较小,公钥e和模数n是公开的
原理:
ed ≡ 1 (mod φ(n)),其中e是公钥的加密指数,d是私钥的解密指数,φ(n)是n的欧拉函数值(即(p-1)(q-1))。当d较小时,攻击者可以通过对e/N(N=pq)进行连分数展开,找到一串数的分母,这个分母很有可能就是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但模数n相同,且e之间最好互质
原理:当多个密文使用相同的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互质,必存在s1和s2使e1*s1+e2*s2=1
由此可求出相对应的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))