云曦春季开学考复现(2025)
Crypto
划水的dp和dq
下载附件后是简单的RSA算法题,之所以说简单是因为给了公钥e
趁热打铁,昨天刚学的RSA,既然有p有q,也有e,而n=p*q,可以算出欧拉函数值phi=(p-1)*(q-1) 而这里因为昨天学到d*e=1 mod phi,所以libnum.invmod(e,phi)函数的作用就是求一个整数d,使得(e*d)%phi(除以phi取余)=1,求出d以后,就可以从c=(e,m,n)的模幂运算入手反推m。而c=(e,m,n)可以解释为求m的e次方,然后对取模,结果赋值给c,(pow(m,e,n)=m^e mod n),通俗的讲就是RSA加密时把明文m加密为了c,题目已经给出了c所以用私钥d,函数pow(c,d,n)就可以逆运算出m的值了
然后再long_to_bytes(m)就可以print出flag了
思路清晰以后创建py代码直接运行就可以
可报错了 ,仔细一看我都没有导入libnum库,自然运行不了,然后加入import libnum运行发现我的pycharm还是没有装libnum库,试了一下发现不能直接在pycharm里装,就只能打开终端尝试了好几次终于装上了
最后运行
虽然出flag了,,但我突然想到一个问题,我没用到dp和dq啊,附件既然给了dp dq肯定有用,而且题目也是划水的dp和dq,但又不知道怎么用,于是扔进 AI让其帮我解读一下
所以用dpdq运算会更简单一些的意思,然后我试了一下运行AI改进的代码
它是先计算m1m2两个的值,然后用中国剩余定理组合m,但代码却更复杂了
WEB
熟悉的正则
打开环境先进行代码审计
进行get传参时,把a、b拼接赋值给g
然后查看g中的字符,是否含有/ls|system|a|shell|cat|read|find|flag|handsome/i这串字符,
如果有就又将g赋值给key,同样的又判断key中是否有字符串/\.\.|flag/,如果有就报错“不行不行,再好好看看”
如果没有就把b赋值给gg,然后嘞,截取gg的第八位开始的后面四个字符再赋值给hhh
最后用include函数把base64加密后的a与hhh拼接
这里还原一下正则表达式/\\|\056\160\150\x70/i
其还原回来是|.php
i是修饰符,表示不区分大小
也就是说参数b的值必须包含字符|.php
总的来说,构造payload的思路就是参数a要含有flag或..字符(用于赋值key)并经过base64加密(include漏洞);参数b需接|.php字符(赋值ggg),且|.php后必须再接 ls|system|a|shell|cat|read|find|flag|handsome 中的某一字符串(用于赋值g),但其长度必须大于等于八个字符(用于绕过并赋值hhh)
先将flag进行base64加密(既然正则表达式 /\.\.|flag/ 还原为的字符是..或flag,按理来说a的值为base64编码 .. 也一样的,但我尝试了一下发现没有回显,也就是不对,是正则表达式还原错了吗)
所以payload为/?a=ZmxhZw==&b=|.php.handsome (这里用handsome是因为就这个字符串字符数为八个,其他都不足,当然也可以是8个a)
get flag
RCCE
打开环境进行代码审计
高亮函数展示当前文件,然后调试或展示当前代码。然后检查GET传参是否有参数cmd,如果有便赋值给$cmd变量然后定义黑名单正则表达式$blacklist,
并用preg_match
来检查$cmd是否匹配或含有黑名单,(还要注意黑名单后面的i指不区分大小写)如果匹配到了,就输出"师兄说RCE这辈子都学不会,是这样做的么?"如果没有,就执行exec($cmd)(php中执行外部命令的函数,执行命令后不会显示)
那么就需要让exec()函数执行后保存下来,上网查了一下命令
这里AI也提供了部分绕过该黑名单的字符和方法
得到提示后那么接下来构造payload即可 ?cmd=ls / | tee 1.txt
但要注意ls是黑名单,所以要将ls改一下绕过 l\s
然后exec()应该是已经执行过后并将结果保存到1.txt中了,url拼接一下就可以看到flag提示
最后传参抓取flag就可以了,然后把抓取结果保留到2.txt中
继续拼接访问得到flag