WEB
1宇弛、簽到題
進(jìn)入網(wǎng)頁之后只有一行字”key在哪里匿辩?”腰耙,直接右鍵,查看網(wǎng)頁源代碼铲球,
nctf{flag_admiaanaaaaaaaaaaa}
2挺庞、md5 collision
源碼
<?php
$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";}
?>
3、簽到2
這里給了我們一個(gè)口令要我們輸入稼病,就輸入試試选侨。
發(fā)現(xiàn)提示的還是“尚未登錄或口令錯(cuò)誤”。先看看源碼:
發(fā)現(xiàn)文本框最大長度限制為10個(gè)字符然走,但要輸入的口令長度為11援制。
所以我們可以直接修改maxlength為11,輸入口令得到FLAG:
第二種方法就是通過Burp Suite抓包然后修改提交的口令芍瑞。
可以看到原始提交的口令為zhiamkaime將其修改為zhimakaimen就可以得到FLAG了晨仑。
4、這貨不是web
提目提示
真的拆檬,你要相信我洪己!這題不是WEB
點(diǎn)擊連接看到的是一句話和一張動(dòng)圖,查看源碼竟贯,發(fā)現(xiàn)只有一個(gè)2.gif答捕,只有先從這個(gè)圖片下手了。屑那。
下載下來用notepad++打開拱镐,全是亂碼(這是肯定的了),直接搜索nctf得到FLAG持际。
5痢站、層層遞進(jìn)
依次從網(wǎng)頁源代碼里點(diǎn)擊so.html->so.html->so.htm->so.htm->404.html。最后在源代碼找到FLAG选酗,
nctf{this_is_a_fl4g}
6阵难、AAencode
是JS的一種加密方式,直接F12扔控制臺里就可以直接跑出來芒填。
7呜叫、單身20年
點(diǎn)擊“在這里找key”發(fā)現(xiàn)什么東西一閃而過,查看源碼發(fā)現(xiàn)“./search_key.php”殿衰,點(diǎn)擊之后瞬間就被轉(zhuǎn)到“no_key_is_here_forever.php”的頁面上了朱庆。
我們可以F12->setting->Disable JavaScript
得到KEY
或者可以用Burp Suite
8、你從哪里來
HTTP頭部字段參考這篇博客闷祥。
這里將Refere:https://google.com/就行了娱颊。
9傲诵、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=="));?>
關(guān)于eval函數(shù)這里有一篇文章
將eval改成echo就能顯示FALG了。
10箱硕、文件包含
這道題要用到php://filter
可以讓文件以base64格式輸出拴竹,再解碼就得到FLAG。
flag:nctf{edulcni_elif_lacol_si_siht}
11剧罩、單身一百年也沒用
F12答案就在請求頭里面
FLAG:nctf{this_is_302_redirect}
12栓拜、Download
查看網(wǎng)頁原碼發(fā)現(xiàn)
<p><a href="download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM=" target="_blank">星星點(diǎn)燈</a></p>
<p><a href="download.php?url=YnV4aWFuZ3poYW5nZGEubXAz" target="_blank">不想長大</a></p>
這里只有似乎只有download.php這個(gè)文件,base64('download.php')=ZG93bmxvYWQucGhw
構(gòu)造URL=https://way.nuptzj.cn/web6/download.php?url=ZG93bmxvYWQucGhw
下載的到downlaod.php源碼
<?php
error_reporting(0);
include("hereiskey.php");
$url=base64_decode($_GET[url]);
if( $url=="hereiskey.php" || $url=="buxiangzhangda.mp3" || $url=="xingxingdiandeng.mp3" || $url=="download.php")
{ $file_size = filesize($url);
header ( "Pragma: public" );
header ( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
header ( "Cache-Control: private", false );
header ( "Content-Transfer-Encoding: binary" );
header ( "Content-Type:audio/mpeg MP3");
header ( "Content-Length: " . $file_size);
header ( "Content-Disposition: attachment; filename=".$url);
echo(file_get_contents($url)); exit; } else { echo "Access Forbidden!"; }
?>
發(fā)現(xiàn)文件hereiskey.php
?url=?url=aGVyZWlza2V5LnBocA==
得到FLAG:nctf{download_any_file_666}
13惠昔、COOKIE
TIP:0==not
那么1==yes
在請求頭中可以看到:Set-Cookie:Login=0
修改為Login=1,就可以得到FLAG:nctf{cookie_is_different_from_session}
14幕与、MYSQL
一上來就給我們科普robots.txt,就是告訴爬蟲那些東西不能爬镇防。
那我們就來訪問一下這個(gè)文件啦鸣。
這里有個(gè)intval函數(shù):成功時(shí)返回 var
的 integer 值,失敗時(shí)返回 0来氧。 空的 array 返回 0诫给,非空的 array 返回 1。
隨便輸入個(gè)大于1024小于1025的小數(shù)就行了
FLAG:nctf{query_in_mysql}
15饲漾、SQL INJECTION 3
這道題出了點(diǎn)問題蝙搔,但是思路是GBK寬字節(jié)注入缕溉。
當(dāng)我們輸入id='考传,會(huì)被顯示為id='\''
。'被自動(dòng)轉(zhuǎn)義為\'
了证鸥。
輸入id=%df'則會(huì)顯示為id='運(yùn)''僚楞。\沒了。
16枉层、/x00
直接給出了源碼
<pre>if (isset ($_GET['nctf'])) {
if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
echo '必須輸入數(shù)字才行';
else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)
die('Flag: '.$flag);
else
echo '騷年泉褐,繼續(xù)努力吧啊~';
}</pre>
這里ereg有兩個(gè)漏洞
- %00截?cái)嗉坝龅?00則默認(rèn)為字符串的結(jié)束
- 當(dāng)ntf為數(shù)組時(shí)它的返回值不是FALSE
strpos — 查找字符串首次出現(xiàn)的位置
所以有兩個(gè)方法去攻這道題目
- 令id=1%00%23biubiubiu
- 令nctf為數(shù)組則,nctf[]=111
0鸟蜡!==false膜赃。
FLAG:nctf{use_00_to_jieduan}
17、bypass again
$_GET()可以處理數(shù)組類型的數(shù)揉忘,但是md5()不能跳座,所以構(gòu)造參數(shù)a[]=1&b[]=2。就可以得到FLAG:Flag: nctf{php_is_so_cool}泣矛。
18疲眷、變量覆蓋
<?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函數(shù)。
總的來說就是從數(shù)組中將變量導(dǎo)入到當(dāng)前的符號表您朽。
所以只需要覆蓋$pass
和$thepassword_123
讓他們相等狂丝。
19、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>";
}
?>
這里有兩次判斷,第一次是把輸入的參數(shù)id直接和"hackerDJ"比較几颜,要求不能相同倍试。
然后就是經(jīng)過一次urldeconde之后的參數(shù)id與"hackerDJ"比較,要求相同菠剩。
其實(shí)url編碼就是一個(gè)字符ascii碼的十六進(jìn)制易猫。
我們可以只對第一個(gè)字母h編碼,h的url編碼是%68具壮,再編碼一次就是%2568准颓。
所以令id=%2568ackerDJ,就可以得到FLAG:nctf{php_is_best_language}棺妓。
20攘已、偽裝者
要求本地登陸才能的到flag。
偽造消息頭怜跑,添加X-Forwarded-For:127.0.0.1样勃。就可以得到FLAG:nctf{happy_http_headers}。
21性芬、Header
FLAG就在header中峡眶。
nctf{tips_often_hide_here}
22、上傳繞過
先上傳了一個(gè)1.txt的文件植锉,提示如下
再上傳一個(gè)1.jpg的文件辫樱,提示如下
但是前面已經(jīng)提示過只允許上傳jpg,gif,png類型的。
看第二個(gè)錯(cuò)誤提示它是**怎么識別文件后綴的 **
它是根據(jù)./uploads目錄下的basename進(jìn)行識別的
在我們上傳的時(shí)候會(huì)出現(xiàn)./uploads 在后面添加1.php
會(huì)出現(xiàn)這樣的提示
basename=1.php1.jpg
所以現(xiàn)在需要在1.php后面進(jìn)行截?cái)唷?/p>
首先在/uploads/后面添加"1.php "(這里有個(gè)空格)
然后在Hex中找到20(空格的16進(jìn)制)修改為00俊庇,提交就行了狮暑。
23、SQL注入1
這道題直接給出了源碼
<pre><?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];
?>
</pre>
trim() 函數(shù)移除字符串兩側(cè)的空白字符或其他預(yù)定義字符辉饱。
$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";與 $query = mysql_fetch_array(mysql_query($sql));
一起構(gòu)成了一條查詢語句搬男,my_query()執(zhí)行的就是上一句中的查詢語句。
所以我們可以在user處進(jìn)行注入彭沼,輸入“admin')#”可以把后面的password注釋掉缔逛。可以得到FLAG姓惑。
24褐奴、passcheck
核心源碼
<?php
$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的漏洞,可以參考我的一篇文章挺益。
flag:nctf{strcmp_is_n0t_3afe}
25歉糜、起名真難
核心代碼
<?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';
?>
ord()函數(shù)返回字符串的首個(gè)字符的 ASCII 值键思。
這道題就是要輸入等于54975581388的數(shù)但又不能出現(xiàn)阿拉伯?dāng)?shù)字缆瓣。
所以只能換成16進(jìn)制了,54975581388==0xccccccccc
chinalover.sinaapp.com/web12/index.php?key=0xccccccccc
The flag is:nctf{follow_your_dream}
26西疤、密碼重置
Tips:重置管理員賬號:admin 的密碼
點(diǎn)擊連接發(fā)現(xiàn)這些東西
URL中user1后面的字符串用base64解密后是ctfuser。
要求的是修改admin的密碼夯缺,所以
27蚤氏、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?";
}
?>
總的來說就是輸一個(gè)序列化過后的字符串并且類中的變量始終保持相同,這里可以用引用 a=&b踊兜。
構(gòu)造序列化函數(shù)
class just4fun{
var $enter;
var $secret;
function just4fun(){
$this -> enter = &$this -> secret;
}
}
echo serialize(new just4fun());
另pass的參數(shù)為輸出的序列化值就可以得到flag竿滨。
28、sql injection4
直接看源碼
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;
htmlentities($str, ENT_QUOTES)這個(gè)函數(shù)會(huì)轉(zhuǎn)換雙引號和單引號捏境。這里就不能用單引號來就行閉合了于游,只能用斜杠來進(jìn)行轉(zhuǎn)義。
相當(dāng)于查詢語句'SELECT*FROME users WHERE name='username' AND pass='password';';
所以當(dāng)我們就需要閉合name的'垫言,而在mysql查詢語句中轉(zhuǎn)義字符不參與閉合贰剥。所以構(gòu)造url:?username=&password=or%201=1%23,就可以得到flag筷频。
29蚌成、綜合題
打開網(wǎng)址出現(xiàn)一串顏表情,直接放到console中跑凛捏,得到1bc29b36f623ba82aaf6724fd3b16718.php担忧。我們直接去訪問這個(gè)頁面出現(xiàn)“哈哈哈哈哈哈你上當(dāng)啦,這里什么都沒有坯癣,TIP在我腦袋里”這句提示瓶盛。然后在headers中發(fā)現(xiàn)'tip:history of bash'。
搜索了一下發(fā)現(xiàn)
Bash shell在“~/.bash_history”(“~/”表示用戶目錄)文件中保存了500條使用過的命令坡锡,這樣可以使你輸入使用過的長命令變得容易蓬网。每個(gè)在系統(tǒng)中擁有賬號的用戶在他的目錄下都有一個(gè)“.bash_history”文件窒所。
打開這個(gè)文件看到zip -r flagbak.zip ./*
的提示鹉勒。
構(gòu)造url:teamxlc.sinaapp.com/web3/b0b0ad119f425408fc3d45253137d33d/flagbak.zip將文件下載并解壓得到最后的flag。
31吵取、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>");
}
}
?>
關(guān)鍵代碼
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw])))
需要結(jié)果集$query
中的md5值和$pass
的相同禽额。
這里$user
和$pass
都是可控的,所以變相的$query
皮官,也可控脯倒。
就能得到key。
33捺氢、密碼重置2
TIPS:
1.管理員郵箱觀察一下就可以找到
2.linux下一般使用vi編輯器藻丢,并且異常退出會(huì)留下備份文件
3.弱類型bypass
在源代碼中直接找到了郵箱admin@nuptzj.cn
現(xiàn)在就需要找到token,我們看到提示2,搜了一下發(fā)現(xiàn)當(dāng)你打開一個(gè)文件摄乒,vi就會(huì)生成這么一個(gè).(filename)swp文件以備不測悠反,如果你正常退出残黑,那么這個(gè)這個(gè)swp文件將會(huì)自動(dòng)刪除。
我們直接找到這個(gè)文件:/.submit.php.swp
發(fā)現(xiàn)關(guān)鍵代碼
所以令token為0000000000就行了
34.file_get_contents
??直接查看源碼斋否,看到提示信息梨水。
file_get_contents — 將整個(gè)文件讀入一個(gè)字符串</br>
直接用php偽協(xié)議上傳file就行了
35.變量覆蓋
??直接給出了源碼:
<!--foreach($_GET as $key => $value){
$$key = $value;
}
if($name == "meizijiu233"){
echo $flag;
}-->
??先講講foreach()函數(shù),定義如下:
foreach 語法結(jié)構(gòu)提供了遍歷數(shù)組的簡單方式茵臭。foreach 僅能夠應(yīng)用于數(shù)組和對象疫诽,如果嘗試應(yīng)用于其他數(shù)據(jù)類型的變量,或者未初始化的變量將發(fā)出錯(cuò)誤信息旦委。有兩種語法:
foreach (array_expression as
key =>
value 并且數(shù)組內(nèi)部的指針向前移一步(因此下一次循環(huán)中將會(huì)得到下一個(gè)單元)缨硝。
第二種格式做同樣的事逼龟,只除了當(dāng)前單元的鍵名也會(huì)在每次循環(huán)中被賦給變量 $key。
??同時(shí)這道題還涉及了$$
變量覆蓋追葡。
$$這種寫法稱為可變變量腺律,一個(gè)可變變量獲取了一個(gè)普通變量的值,作為這個(gè)可變變量的變量名。
<?php
$a = "hello";
echo "$a\n"; //輸出hello
$$a="world";
echo "$a\n"; //輸出hello
echo "${$a}\n"; //輸出word
echo "$a ${$a}\n"; //輸出hello world
echo "$a $hello"; //輸出hello world
?>
??這里普通變量是'$a'值為'hello'宜肉,可變變量是'$$a'值為'world'匀钧,可以看到上例通過將普通變量的值(hello)作為變量名獲取到了可變變量的值(world)。
??這道題我們傳入變量?name=meizijiu233
,通過foreach()函數(shù)谬返,進(jìn)行變量賦值$key=name,$value=meizijiu233
,然后語句$$key=$value
,即$$key=$name=meizijiu233
之斯。