划了两天水~
题目叫做easy php,然而感觉并不easy啊:)。。解题步骤主要是源码审计,sql注入,ssrf,文件上传。。
看了下主要有注册,登录,发表签名和心情,删除签名的功能。
注册和登录页面需要提交验证码: substr(md5($input,0,5))==$captcha
|
|
0x01. 通过加~
获取到源码:index.php
,user.php
,config.php
等,views/下有login等其他php文件源码。
0x02. 通过phpinfo,得到session文件位于../../var/lib/php5/sess_xxxxxx
,也可通过获取进程的文件描述符来获取../../proc/self/fd/24
0x03. 通过源码审计发现user.php中的publish函数处存在insert注入。
我们POST提交的signature和mood参数,未经过滤就传进了insert()函数,在insert函数中,先调用了get_column函数将数组元素用反引号包裹,并用逗号隔开:`signature`,`mood`
。(先在session中获取自己的用户id。
|
|
|
|
|
|
|
|
0x04. 访问index.php?action=index
,得到admin帐号密码为admin:nu1ladmin
。然而admin的登录要求为ip为127.0.0.1
0x05. **源码审计发现Mood类在user.php中的showmess函数中会反序列化并调用,又发现phpinfo中SoapClient开启。搜索一波后,发现可以通过反序列化构建SoapClient对象,构造POST包让服务端请求login页面,造成SSRF。
|
|
在CRLF注入的基础上,我们可以得到:
|
|
运行nc -lvvp 80
来监听80端口。
|
|
Apache收到后将识别为三个POST包:
因此,我们可先获取一个新的session,作为admin账户的session,并获取其验证码,生成payload:
|
|
得到我们的payload,通过已登录的用户X在publish页面中POST。
|
|
此时访问用户X的index.php?action=index
页面。返回状态码500,反序列化成功。
0x06. 以admin的session登录,通过源码发现在publish函数处可upload图片文件
|
|
upload函数将文件名改为filename.time().rand(1,100).'jpg'
,然后保存在了/app/adminpic/
下,同时对文件内容的进行了检测,若存在<?php
,则执行clean_danger.sh
。
|
|
在phpinfo
中,我们可以看到,short_open_tag = Off
,但是依然可以使用<?=
来执行php代码。
0x07. 上传一个crxxx.jpg
|
|
从服务端返回的时间,转化成Unix时间戳,然后对rand(1,100)
进行爆破。即可得到真实文件名。通过index.php?action=xxxx.jpg
包含,就生成了/var/www/html/kkzxc123.php
。
0x08. 菜刀连接,根据run.sh
中数据库密码,可在数据库中拿到flag。
- 对于另外一题
funning eating cms
,主要是考察parse_url()
存在解析的漏洞,遇到:
时,会直接返回false。