最近看了下Hackone的平台,发现其中有一个共同协作的模式,通过达到一定标准才可以获得受邀的协作资格,其中的题目很有学习意义,特此记录和分享,大家可以先行探索再看题解。不需要节点,国内节点就可以访问,我把链接放在结尾。
题目的考察点有个很重要的就是需要从开发者的角度来进行推演,所以如果想要学好攻击一定要学会开发的一些思路,反之也是一样。题目内容难度按低到高,以Micro-CMS2开始后为个人认为比较有学习进阶意义的内容,如果有基础觉得开篇无意可以跳到Micro-CMS2开始看。
Micro-CMS1 考点:XSS+逻辑漏洞(水平越权)+sql注入
进去后是一个普通的页面,发现可以进行创建markdown文件
根据题目提示需要创建页面,打入xss发现成功,但并没有进行弹窗
回到首页成功弹窗拿到第一个flag
发现有编辑页面,尝试xss打入
得到明显有过滤script
猜测是替换script
发现整个
<script>变为<scrubbed> 翻译是清洗。
尝试使用不用script的payload的试试
成功得到
根据题目设置一共4个FLAG,目前只看到两个功能点,一个编辑,一个创建,拿到两个。再观察不同的页面发现,顺序在自己创建的页面进行大幅增加
猜测中间有隐藏的,发现page6禁止访问
如何访问,尝试了X-forward-for无果后,点击编辑页面发现路径为
page/edit/id
手动更改为6成功回显
尝试了功能点的XSS和接口的漏洞,最后一个需要另辟蹊径,尝试接口处的sql
单题的思路前面两点较为简单,编辑处的id替换遍历也是比较常见,最后的sql有点意外,但回顾起来并不是脑洞,反而因为本身具有数字查询特性,是一个很好的思路点。
Micro-CMS2 考点:sql注入,请求方式绕过
这是上面的升级版,根据英文提示,版本已经进行更新,并且增加了权限认证,只有管理员可以进行编辑,很明显需要我们获得这个权限。
思路:1.爆破弱密码 2.尝试打入万能密码
发现存在报错,推测存在sql注入
但这里并不可以直接用常规万能密码登陆0'or 1=1--来登陆,根据复盘他的登陆应该是先通过用户输入的用户名参数来进行查询对应的密码值,再将密码值来与用户输入的密码对照,所以一定要保证输出
所以我们可以用下图的思路来进行绕过
admin'union select '123'
有的人不懂为什么这样就可以,其实只要理解这个设置密码的思想即可,因为给的语句确实是不能运行,我们不能使用select * from user这一段,因为查询出的语句会大于对应条数造成失败查询
这里用更改后的sql进行查询来验证,可以看到只查询password列厚,我们可以用单个select设置密码为new_password。
登陆后在个人界面获得第一个flag
再根据模拟最大危害思路,sql注入尝试脱库看看是否有有用信息
方便直接使用sqlmap,但这里不知道什么原因sqlmap一直跑不出来,原因在于正常应该出现报错,但这里一直回显500,所以暂时跳过了
同时第二个flag的获取思路也很妙,我们正常访问编辑页面接口
/page/edit/
会自动跳转,尝试POST请求方式能得到不一样的信息,从开发者的思维来追溯,大致是后端对所有get访问的请求进行鉴权,但没有考虑到不同的请求方式,发散思维后实战中PUT的请求方式或许也可以是一种绕过。
Photo Gallery 考点:路径穿越;命令拼接;截断绕过;sql注入;
进来后发现是一些图片,我一般看到图片都会习惯性的看下图片地址,在很多地方图片一般和文件上传链接在一起,他的路径很有可能链接起来我们的碎片化信息。
可以猜测是文件自身内容
同时发现id=3极为特别
第一反应还是遍历+sql,理论上sql应该是可以出,但还是报500,后面复盘的时候发现只有linux能跑,windows跑不了,可能是字符原因?或者本身环境问题,没有深究,后续用kali跑出来了,包括上面的那个同样。
成功跑出来图片的位置表
所以第一个flag
^FLAG^d8f3e5982ac49c49f07e2e4a76180a2cbf46b7b58015b8462169723e772701d3$FLAG$
再从全局来看提示。
hint1.想象你会如何构建这个系统
发现id对应了对应的文件路径,既然前端是通过传输id进行获取对应图片内容,以开发者的思维来思考,前端显示从数据表select对应id得到的图片路径的数据,画了一个大概的模拟简单的思维图
注意这里查询的特点我特意猜测了sql语句,sql查询出来的值就被开发者默认为图片路径,那么此时我们如果能够控制这个值,是不是就能够去进行任意文件读取。
hint2.花点时间了解union
这个就很明显,有点类似上题的设置password值。我们只要构建对应的查询值就可以。但这里我们怎么知道对应需要的文件名呢,最开始肯定是直接尝试目录穿越读取些常规的敏感文件看看,但这里禁止了
hint3.了解uwsgi-nginx-flask-docker image的构建运行
这里就引导我们要去了解这个的一些固定运行文件
读取得到main
查询
成功读取
把源码拖出来审计下
发现这段比较特别
rep +='Space used: '+ subprocess.check_output('du -ch %s || exit 0'%' '.join('files/'+ fn for fn in fns), shell=True, stderr=subprocess.STDOUT).strip().rsplit('n', 1)[-1] +''
可以看到subprocess是调用了shell函数的,所以我们马上开始研究这段代码,可以看到就是我们入门都会遇到的
ping 127.0.0.1;ls 这个题型
得出下面的结论
那现在我们要如何控制这个filename,他是系统内部进行一个拼接文件名来进行执行的一个操作,所以我们需要控制文件名,而控制文件名需要用到堆叠注入,正好这里可以,所以我们就要用前面的sql注入点来把文件名进行更改
fetch?id=3; UPDATE photos SET filename=";echo $(printenv)" WHERE id=3; commit;
成功回显,但这里会发现他只显示了一个
回到这里
rep +='Space used: '+ subprocess.check_output('du -ch %s || exit 0'%' '.join('files/'+ fn for fn in fns), shell=True, stderr=subprocess.STDOUT).strip().rsplit('n', 1)[-1] +''
从代码逻辑来看,du -ch 命令会计算所有指定文件的总磁盘使用量,并生成一个总计行
(total)。.rsplit('n', 1)[-1]
作用是从输出中提取最后一行,即总计行。
使用echo ${env}来获取
两者区别
·echo $(printenv):
o输出所有环境变量及其值在一行中,以空格分隔。
o适合需要将所有环境变量作为单个字符串的情况,但不适用于需要处理每个变量的情况。
·env:
o每个环境变量及其值占一行。
o更适合需要逐行处理环境变量的场景,如脚本中遍历环境变量。
以上就是本次的全部内容,因为到这已经够27分了😊,其他的题目也很有意思,如果你想要学习更深入一定要抽空做一些,对于思路的拓展很有帮助。
https://ctf.hacker101.com/ctf
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...