划了两天水~
题目叫做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。