目录
0x01 [SWPUCTF 2023 秋季新生赛]If_else
0x02 [SWPUCTF 2023 秋季新生赛]RCE-PLUS
0x03 [SWPUCTF 2023 秋季新生赛]Pingpingping
0x04 [SWPUCTF 2023 秋季新生赛]一键连接!
0x05 [SWPUCTF 2023 秋季新生赛]NSS_HTTP_CHEKER
0x06 [SWPUCTF 2023 秋季新生赛]NSS大卖场
0x07 [SWPUCTF 2023 秋季新生赛]UnS3rialize
0x08 [SWPUCTF 2023 秋季新生赛]ez_talk
0x09 [SWPUCTF 2023 秋季新生赛]查查need
进题看看源码。
但是由于if和else只能执行一个,而且$被ban了,所以a和b的值不能手动改。所以只能在判断语句中直接执行eval命令,然后直接输出就行了。不过要把后面给注释掉,payload:
check=1==1) eval(system('cat /f*')); /*
然后访问check.php:
找到了flag。
进题看源码。
看到shell_exec和blacklist,知道是无回显rce。不过他过滤的都是无关紧要的东西。就payload:
/?cmd=ls /|tee a.txt
然后访问a.txt,找到了flag就在根目录。
接着payload:
/?cmd=cat /f*|tee a.txt
接着访问a.txt:
找到了flag。
进题看源码。
发现他需要传参Ping_ip.exe,但是网页传参会自动替换".",所以在前面用"["来先代替下划线,防止"."被过滤。当不显示报错图片时,说明传参成功了:
然后在他用system("ping -c 3 ")给我们三个ping回显的工具,我们直接用ls /看看能不能回显,payload如下:
/?Ping[ip.exe=127.0.0.1;ls /
发现有回显,我们直接cat /f*即可,payload:
/?Ping[ip.exe=127.0.0.1;cat /f*
找到了flag。
进题源码:
发现需要md5值相等,一开始想到的是:用0e开头的md5值为0进行比较,但是尝试了发现不行。因为这种方法应该只能用于md5值弱比较上。如果是"==="就可能难以实现。看了wp发现可以数组绕过,尝试一下:
发现前两关都可以这样用数组绕过。第三关他说要用data协议。但我去用php伪协议中的php://input来传参了。发现可以,然后需要蚁剑连接。payload如下:
然后发包,蚁剑连接试试。但是我蚁剑连不上,又回头去data协议了,因为用php协议发现post不能传参了,只能用data协议,然后用post传参Nss就行了,payload:
然后就得到了flag。
http题,进题:
一次性payload结束:
GET: /?this_is_get=get_%1t
POST: this_is_post=p03t
Cookie: this_is_cookie=cookie_suki_desu~
User-Agent: NSSCTF
X-Forwarded-For: 127.0.0.1
得到了flag。
进题是一个大卖场,我看了hint,发现给了一个username,以为是正常的sql注入,但是发现没有回显。所以我去看了wp。wp说是update注入。然后我去复现。
用burp抓包看看信息,发现了每次买道具都是/buy/n,其中n是商品代号。而且flag是8。然后我们直接在网页上payload,因为burp里payload发不出去了。payload:
/buy/1';UPDATE items SET price=1;#
然后发现空格被过滤了,把空格换成%09就行。然后把金额改成1元,买了flag然后去背包看看就行。中间发现单引号要用%27进行url编码,不然出不来答案:
找到了flag。
进题源码:
可以看到NSS对象里,有一个system的函数,这是pop链的终点,然后回头找,找到了C里的want,这被当作函数调用了。接下来看了wp。用T里的sth触发__get()方法,而这之前要触发__toString()方法,那么在F中用echo notes进行文本调用来触发。所以最终pop链:
然后由于__wakeup()函数需要绕过,则我们用对象属性不匹配来绕过,即原本出来的答案:
O:1:"F":3:{s:4:"user";s:4:"SWPU";s:6:"passwd";s:3:"NSS";s:5:"notes";O:1:"T":1:{s:3:"sth";O:1:"C":1:{s:6:"whoami";O:3:"NSS":1:{s:3:"cmd";s:9:"cat /flag";}}}}
我们将其修改为:
O:1:"F":4:{s:4:"user";s:4:"SWPU";s:6:"passwd";s:3:"NSS";s:5:"notes";O:1:"T":1:{s:3:"sth";O:1:"C":1:{s:6:"whoami";O:3:"NSS":1:{s:3:"cmd";s:9:"cat /flag";}}}}
这样他的反序列化之前的__wakeup()函数就会被绕过了。
然后再用base64编码就可以得到答案了:
得到了flag。
进题文件上传:
然后就正常上传一句话木马,习惯性的改了文件头,上传成功:
发现我的木马进去了,然后蚁剑连接,找到了flag在根目录。
进题以为是正常爆破,但是尝试了好久没试出来,所以看了wp。wp上说是sql注入....然后我就去找到了注入点是student_id,并且是双引号闭合,然后用order by找到列数为5,然后用联合注入。发现注入不了,看了wp,说是要统一为utf-8字符集。即:
collate utf8_general_ci
然后就是正常的注入过程,到最后一个获取grade的时候,我们知道flag肯定在grade里面。但是由于成绩太多了,所以flag无法显示了。
wp的方法是用MAX(grade)获取grade中最大值,就是flag。但我去查了那个附件中的表格,发现里面有499个学生,所以用concat加上limit 500,1就可以直接输出flag了:
找到了flag。