南京邮电大学ctf

WEB

1、签到题

进入网页之后只有一行字”key在哪里?”,直接右键,查看网页源代码,

image

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

image

这里给了我们一个口令要我们输入,就输入试试。

发现提示的还是“尚未登录或口令错误”。先看看源码:

image

发现文本框最大长度限制为10个字符,但要输入的口令长度为11。

image

所以我们可以直接修改maxlength为11,输入口令得到FLAG:

image

第二种方法就是通过Burp Suite抓包然后修改提交的口令。

image

可以看到原始提交的口令为zhiamkaime将其修改为zhimakaimen就可以得到FLAG了。


4、这货不是web

提目提示

真的,你要相信我!这题不是WEB

点击连接看到的是一句话和一张动图,查看源码,发现只有一个2.gif,只有先从这个图片下手了。。

下载下来用notepad++打开,全是乱码(这是肯定的了),直接搜索nctf得到FLAG。

image

5、层层递进

依次从网页源代码里点击so.html->so.html->so.htm->so.htm->404.html。最后在源代码找到FLAG,

image

nctf{this_is_a_fl4g}


6、AAencode

是JS的一种加密方式,直接F12扔控制台里就可以直接跑出来。


image

7、单身20年

点击“在这里找key”发现什么东西一闪而过,查看源码发现“./search_key.php”,点击之后瞬间就被转到“no_key_is_here_forever.php”的页面上了。

我们可以F12->setting->Disable JavaScript

image

得到KEY

image

或者可以用Burp Suite

image
image

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=="));?>

关于eval函数这里有一篇文章

将eval改成echo就能显示FALG了。

image

10、文件包含

这道题要用到php://filter

构造URL:http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

可以让文件以base64格式输出,再解码就得到FLAG。

flag:nctf{edulcni_elif_lacol_si_siht}


11、单身一百年也没用

F12答案就在请求头里面

image

FLAG:nctf{this_is_302_redirect}


12、Download

查看网页原码发现

<p><a href="download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM=" target="_blank">星星点灯</a></p>

<p><a href="download.php?url=YnV4aWFuZ3poYW5nZGEubXAz" target="_blank">不想长大</a></p>

这里只有似乎只有download.php这个文件,base64('download.php')=ZG93bmxvYWQucGhw

构造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!"; } 
?>

发现文件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,就是告诉爬虫那些东西不能爬。

那我们就来访问一下这个文件。

image

这里有个intval函数:成功时返回 var 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。

随便输入个大于1024小于1025的小数就行了

http://chinalover.sinaapp.com/web11/sql.php?id=1024.1

FLAG:nctf{query_in_mysql}


15、SQL INJECTION 3


这道题出了点问题,但是思路是GBK宽字节注入。

当我们输入id=',会被显示为id='\''。'被自动转义为\'了。

输入id=%df'则会显示为id='運''。\没了。


16、/x00

直接给出了源码

 <pre>if (isset ($_GET['nctf'])) {
         if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE)
             echo '必须输入数字才行';
         else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE)   
             die('Flag: '.$flag);
         else
             echo '骚年,继续努力吧啊~';
     }</pre>

这里ereg有两个漏洞

  1. %00截断及遇到%00则默认为字符串的结束
  2. 当ntf为数组时它的返回值不是FALSE

strpos — 查找字符串首次出现的位置

所以有两个方法去攻这道题目

  1. 令id=1%00%23biubiubiu
  2. 令nctf为数组则,nctf[]=111

0!==false。

FLAG:nctf{use_00_to_jieduan}


17、bypass again

$_GET()可以处理数组类型的数,但是md5()不能,所以构造参数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函数。

总的来说就是从数组中将变量导入到当前的符号表。

所以只需要覆盖$pass$thepassword_123让他们相等。

image

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>";
 }
 ?>

这里有两次判断,第一次是把输入的参数id直接和"hackerDJ"比较,要求不能相同。

然后就是经过一次urldeconde之后的参数id与"hackerDJ"比较,要求相同。

其实url编码就是一个字符ascii码的十六进制。

我们可以只对第一个字母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、上传绕过

先上传了一个1.txt的文件,提示如下

image

再上传一个1.jpg的文件,提示如下

image

但是前面已经提示过只允许上传jpg,gif,png类型的。

看第二个错误提示它是**怎么识别文件后缀的 **
它是根据./uploads目录下的basename进行识别的
在我们上传的时候会出现./uploads 在后面添加1.php

image

会出现这样的提示

image

basename=1.php1.jpg

所以现在需要在1.php后面进行截断。

首先在/uploads/后面添加"1.php "(这里有个空格)

然后在Hex中找到20(空格的16进制)修改为00,提交就行了。

image

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() 函数移除字符串两侧的空白字符或其他预定义字符。

$sql="select user from ctf where (user='".$user."') and (pw='".$pass."')";与 $query = mysql_fetch_array(mysql_query($sql));

一起构成了一条查询语句,my_query()执行的就是上一句中的查询语句。

所以我们可以在user处进行注入,输入“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的漏洞,可以参考我的一篇文章

image

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()函数返回字符串的首个字符的 ASCII 值。

这道题就是要输入等于54975581388的数但又不能出现阿拉伯数字。

所以只能换成16进制了,54975581388==0xccccccccc

chinalover.sinaapp.com/web12/index.php?key=0xccccccccc

The flag is:nctf{follow_your_dream}


26、密码重置

Tips:重置管理员账号:admin 的密码
点击连接发现这些东西


image.png

URL中user1后面的字符串用base64解密后是ctfuser。
要求的是修改admin的密码,所以


image.png

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?";
}
?>

总的来说就是输一个序列化过后的字符串并且类中的变量始终保持相同,这里可以用引用 a=&b。
构造序列化函数

class just4fun{
     var $enter;
     var $secret;
     function just4fun(){
          $this -> enter = &$this -> secret;
     }
}
echo serialize(new just4fun());

另pass的参数为输出的序列化值就可以得到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)这个函数会转换双引号和单引号。这里就不能用单引号来就行闭合了,只能用斜杠来进行转义。

image.png

相当于查询语句'SELECT*FROME users WHERE name='username' AND pass='password';';
所以当我们就需要闭合name的',而在mysql查询语句中转义字符不参与闭合。所以构造url:?username=&password=or%201=1%23,就可以得到flag。


29、综合题

打开网址出现一串颜表情,直接放到console中跑,得到1bc29b36f623ba82aaf6724fd3b16718.php。我们直接去访问这个页面出现“哈哈哈哈哈哈你上当啦,这里什么都没有,TIP在我脑袋里”这句提示。然后在headers中发现'tip:history of bash'。
搜索了一下发现
Bash shell在“~/.bash_history”(“~/”表示用户目录)文件中保存了500条使用过的命令,这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个“.bash_history”文件。
打开这个文件看到zip -r flagbak.zip ./*的提示。
构造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>");
  }
}
?>

关键代码
$query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
if (($query[pw]) && (!strcasecmp($pass, $query[pw])))
需要结果集$query中的md5值和$pass的相同。
这里$user$pass都是可控的,所以变相的$query,也可控。

image.png

就能得到key。


33、密码重置2

TIPS:
1.管理员邮箱观察一下就可以找到
2.linux下一般使用vi编辑器,并且异常退出会留下备份文件
3.弱类型bypass

在源代码中直接找到了邮箱admin@nuptzj.cn
现在就需要找到token,我们看到提示2,搜了一下发现当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测,如果你正常退出,那么这个这个swp文件将会自动删除。

image.png

我们直接找到这个文件:/.submit.php.swp
发现关键代码
image.png

所以令token为0000000000就行了


34.file_get_contents

  直接查看源码,看到提示信息。

file_get_contents — 将整个文件读入一个字符串</br>
直接用php伪协议上传file就行了


Snipaste_2019-10-22_13-39-33.png

35.变量覆盖

  直接给出了源码:

<!--foreach($_GET as $key => $value){  
        $$key = $value;  
}  
if($name == "meizijiu233"){
    echo $flag;
}-->

  先讲讲foreach()函数,定义如下:

foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:

foreach (array_expression as value)</br> &emsp;&emsp;statement</br> foreach (array_expression askey => value)</br> &emsp;&emsp;statement</br> 第一种格式遍历给定的array_expression数组。每次循环中,当前单元的值被赋给value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。

第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。

Snipaste_2019-10-22_13-40-58.png

  同时这道题还涉及了$$变量覆盖。
$$这种写法称为可变变量,一个可变变量获取了一个普通变量的值,作为这个可变变量的变量名。

<?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()函数,进行变量赋值$key=name,$value=meizijiu233,然后语句$$key=$value,即$$key=$name=meizijiu233

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • 这次来看看某著名大学—— 南京邮电大学的CTF题目吧~ (Ps:因本人较懒,所以做题时都是手工+度娘,几乎没有用到...
    BestBDs阅读 1,897评论 1 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,559评论 18 139
  • php面试题及答案(转载)收藏 基础题: 1.表单中 get与post提交方法的区别? 答:get是发送请求HTT...
    积_渐阅读 1,615评论 0 37
  • 骚客皆好山水色, 画里川河罗绸缎。 满塘睡莲花开好, 不见肥鱼戏蝶蜂。 一风经吹叶更生, 前沿几十鸟美眷。 只怜闲...
    山屈生阅读 165评论 0 1
  • 收入达到3万以上的直播间发展普遍存在以下3大瓶颈 1. 没有流量,新流量引入难 2. 内容优质,但是不懂运营,难做...
    一泉阅读 1,598评论 0 3