南京邮电大学2021的CTF

deft   ·   发表于 2021-03-15 22:41:51   ·   CTF&WP专版

web1 右键查看源代码

右键查看源码,即可发现
在这里插入图片描述

web2 图片也可以存信息

打开之后发现只有图片,我们右键保存到本地记事本打开,发现了flag
在这里插入图片描述

web3层层递进

看不出来
没啥思路,展开元素看看,发现了 隐藏网页,打开看看源码
在这里插入图片描述
发现了flag

web4

Not Found

web5

有页面看不出来

web6 sql注入

在这里插入图片描述

  1. $user = $_POST[user];
  2. $pass = md5($_POST[pass]);
  3. $query = @mysql_fetch_array(mysql_query("select pw from ctf where user='$user'"));
  4. if (($query[pw]) && (!strcasecmp($pass, $query[pw]))) {
  5. echo "<p>Logged in! Key: ntcf{**************} </p>";

这里的\$pass和\$user都可控制;我们这里可以考虑union联合查询

  1. ' union select md5(1) -- q

本地测试辅助理解:
本地mysql测试

这样我们就可以控制查询出的结果是1的md5值了,然后\$pass=1就行le
分析代码,这里就是sql注入单引号和小括号的闭合,在账号那里写,密码用md5了

‘) or 1=1 — q
这就成了

web7PHP伪协议

这个题要用php伪协议
用php://input 还不行
我们可以
php://filter参数详解

该协议的参数会在该协议路径上进行传递,多个参数都可以在一个路径上传递。具体参考如下:
|参数|描述 |
|—|—|
| resource=<要过滤的数据流> | 必须项。它指定了你要筛选过滤的数据流。|
|read=<读链的过滤器>|可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔|
|write=<写链的过滤器> | 可选项。可以设定一个或多个过滤器名称,以管道符(\ )分隔。|
|<; 两个链的过滤器>|任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。|

eg:
php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码(针对php文件需要base64编码)
参考这位同志的文章这里

继续我们写这个读取源码?file=php://filter/read=convert.base64-encode/resource=index.php
把base64解码出来即使源代码
php文件无法在前端直接显示出来将php文件转换成base64编码,解码后即可看到php文件源码。

  1. <html>
  2. <title>asdf</title>
  3. <?php
  4. error_reporting(0);
  5. if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
  6. $file=$_GET['file'];
  7. if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
  8. echo "Oh no!";
  9. exit();
  10. }
  11. include($file);
  12. //flag:nctf{edulcni_elif_lacol_si_siht}
  13. ?>
  14. </html>

web8 单身手速1

点击超链接之后发现有一个转瞬即逝的source.php
开启抓包试试吧
在这里插入图片描述
返回包里就有flag
根据返回包里显示他是返回的js代码跳转的,我们也可以禁用js,就直接能拿flag了

web9单身手速2

差不多一样的题,这个只是直接藏在返回的头里
在这里插入图片描述

web10请先登入

不出来
点进去发现又让我们先等人,和登入相关的我们可以考虑cookie
开启burpsuite抓包,发现cookie:login=0
在这里插入图片描述
flag:nctf{cookie_is_different_from_session

web11 robots.txt

刚点进来就提示让我们看robots.txt
我们看看这个文件(精简了下代码 )

  1. TIP:sql.php
  2. <?php
  3. $id = intval($_GET[id]);
  4. $query = @mysql_fetch_array(mysql_query("select content from ctf2 where id='$id'"));
  5. if ($_GET[id]==1024) {
  6. echo "<p>no! try again</p>";
  7. }
  8. else{
  9. echo($query[content]);
  10. }
  11. }
  12. ?>

intval() 函数用于获取变量的整数值。

在这里插入图片描述
在这里插入图片描述
这里1024前后我们发现都是无用信息,代码里写到是传参=1024就不行,不等于1024就能输出content了,但是我们又得满足查询的ID=1024,刚好有个intval的函数能取整帮我们取出1024
在这里插入图片描述

web12 - 跟随你的梦想

在这里插入图片描述
这个页面我没有直接找到源码,我上网参考别的文章沾出来的代码做的

  1. <?php
  2. function noother_says_correct($number)
  3. {
  4. $one = ord('1');
  5. $nine = ord('9');
  6. for ($i = 0; $i < strlen($number); $i++)
  7. {
  8. $digit = ord($number{$i});
  9. if ( ($digit >= $one) && ($digit <= $nine) )
  10. {
  11. return false;
  12. }
  13. }
  14. return $number == '54975581388';
  15. }
  16. $flag='*******';
  17. if(noother_says_correct($_GET['key']))
  18. echo $flag;
  19. else
  20. echo 'access denied';
  21. ?>

ord() 函数返回字符串的首个字符的 ASCII 值。
分析一下代码,这里是传参key然后用了自定义函数处理;函数就是拿了key的每个字母的ASCII是不是介于1-9之间,如果再就返回0,如果不在这个范围,就那个key的值判断登不等于54975581388
做法:PHP的==是不会比较两侧的类型的,既然这里他不让传参数字,那我们还得等于那一串,那我们就传参16进制的
在这里插入图片描述
?key=0xccccccccc

web13修改密码

在这里插入图片描述
发现账号我们改不了啊,我们抓个包

web14 token

在这里插入图片描述
查看源码就发现了admin的邮箱
这个站我们写个大写的Web14就不能访问了,判定应该是linux
linux vi编辑不正常退出时会产生filename.xxx.swp文件,可能有相关信息,我们可以试试看
在这里插入图片描述
下面的if里可以看到,要判定token如果不是0就退出,不是10位就退出,我们试试0000000000
在这里插入图片描述

web15 魔术引号

get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置 magic_quotes_gpc
当magic_quotes_gpc=On的时候,函数get_magic_quotes_gpc()就会返回1
当magic_quotes_gpc=Off的时候,函数get_magic_quotes_gpc()就会返回0
magic_quotes_gpc=On的情况下,如果输入的数据有单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。

htmlentities($str, ENT_QUOTES)这个函数会转换双引号和单引号。

在这里插入图片描述
这代码表示出来就这个样,然后mysql执行这个句子
我们在变量里的任何传参都会加上\
我们尝试打破原结构
?username=admin\&password= or 1-1 — q
这样的话,\和admin后的’->\’
而在mysql里\’是不参与闭合
于是我们就把 这一块包裹起来了
在这里插入图片描述

web16 sql注入

看源代码没看出来有括号的闭合
不过确实加了括号就可以,感觉是代码放错了
‘) or 1=1 — q
Key: ntcf{pass_the_exam}

web17 md5处理不了数组

  1. <?php
  2. var_dump(md5($_GET['a']));
  3. var_dump(md5($_GET['b']));
  4. if(md5($_GET['a']) == md5($_GET['b']))
  5. echo 'success';
  6. ?>

在这里插入图片描述
md5处理不了数组类型的东西,而且回返回null值

  1. <?php
  2. if (isset($_GET['a']) and isset($_GET['b'])) {
  3. if ($_GET['a'] != $_GET['b'])
  4. if (md5($_GET['a']) == md5($_GET['b']))
  5. die('Flag: '.$flag);
  6. else
  7. print 'Wrong.';
  8. }
  9. ?>

我们观察源代码发现,这里要求你输入的传参不能相等,但是我们下面还得md5之后相等,于是我们就可以写一个a[]=1&b[]2来绕过了

web18变量覆盖

该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。
该函数返回成功设置的变量数目。
extract这个函数可以把输入的数组按照键名和键值转换成变量
例如:
pass=1&thepassword_123=1
就会变成$pass=1 $thepassword_123=1
于是我们这里就实现了变量覆盖
把前面他定义好的 thepassword_123给覆盖了
nctf{bian_liang_fu_gai!}

web19请输入a

在这里插入图片描述
别的地方看到的代码,我是内有直接找到..
在这里插入图片描述
输入a,但是我输入a就出错
变量md51的值是经过md5加密的字符串QNKCDZO,字符串QNKCDZO经过md5加密之后的值为:0e830400451993494058024219903391。之后的变量a,分析源代码可知,如果a的值不为QNKCDZO,并且md5的值也为0e830400451993494058024219903391,则会输出flag。根据之前的了解,不过好像除了QNKCDZO,并没有其他字符串的md5值为0e830400451993494058024219903391。再回头看源码,注意到判断md51和md52是否相等的时候,使用$md51 == $md52,这里使用的是 == 而不是 === ,也就是说md51和md52不需要完全相等。

拓展:一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的啦!所以,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。

这个题目也是这个原理,如果你提前知道md5碰撞的概念,同时知道了在php中md5中的0e的比较,这道题目就非常简单了。

如果md的值是以0e开头的,那么就与其他的0e开头的md5值是相等的
————————————————
参考:https://blog.csdn.net/qq_38603541/article/details/97125995
常见md5碰撞
在这里插入图片描述

web20

notfound

web21请输入密码!

我们在url栏发现输入没效果,我们试试post
发现可以,确实是post
strcmp
比较两个字符串(区分大小写):
0 - 如果两个字符串相等

<0 - 如果 string1 小于 string2 \>0 - 如果 string1 大于 string2
传入的期望类型是字符串类型的数据,但是如果我们传入非字符串类型的数据的时候,这个函数将会有怎么样的行为呢?实际上,当这个函数接受到了不符合的类型,这个函数将发生错误,但是在5.3之前的php中,显示了报错的警告信息后,将return 0 !!!! 也就是虽然报了错,但却判定其相等了。这对于使用这个函数来做选择语句中的判断的代码来说简直是一个致命的漏洞,当然,php官方在后面的版本中修复了这个漏洞,使得报错的时候函数不返回任何值。但是我们仍然可以使用这个漏洞对使用老版本php的网站进行渗透测试

网站我直接没看到源码按钮,右键也看不到啊,从别的参考文章copy过来的,是网站源码接口没了吗

  1. <?php
  2. $pass=@$_POST['pass'];
  3. $pass1=***********;//被隐藏起来的密码
  4. if(isset($pass))
  5. {
  6. if(@!strcmp($pass,$pass1)){
  7. echo "flag:nctf{*}";
  8. }else{
  9. echo "the pass is wrong!";
  10. }
  11. }else{
  12. echo "please input pass!";
  13. }
  14. ?>

post的地方写个pass[]=1数组就行了
flag:nctf{strcmp_is_n0t_3afe}

web22 google

Referer: https://www.google.com/
我为啥拿不到flag啊,没反应,估计是挂了

web23 meizijiu

在这里插入图片描述
file_get_contents() 把整个文件读入一个字符串中。
php://input 可以访问请求的原始数据的只读流,在POST请求中访问POST的data部分
在这里插入图片描述
感觉挂了,什么都不显示

web24 键值分离

利用$$
在这里插入图片描述
在这里插入图片描述

web25

啥也没有,空白

web26

Not Found

web27

Not Found

web28

用户名金币积分时间理由
小唐gkd 50.00 0 2021-03-17 21:09:24 一个受益终生的帖子~~
小唐gkd 50.00 0 2021-03-17 21:09:23 一个受益终生的帖子~~
Track-聂风 50.00 0 2021-03-17 17:05:52 一个受益终生的帖子~~

打赏我,让我更有动力~

1 条回复   |  直到 2021-8-11 | 2295 次浏览

abcabc
发表于 2021-8-11

这个是安全的目标靶场?有网址么?

评论列表

  • 加载数据中...

编写评论内容
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.