为了让各位能够好好查看一下,我违规操作了(QAQ)放在随笔里面了(Orz)
本文转自
findneo:https://www.cnblogs.com/findneo/p/nupt-ctf-writeup.html
南邮CTF平台网址:
- http://ctf.nuptsast.com/challenges
- http://ctf.nuptzj.cn/challenges
WEB
签到题
nctf{flag_admiaanaaaaaaaaaaa}
ctrl+u或右键查看源代码即可。在CTF比赛中,代码注释、页面隐藏元素、超链接指向的其他页面、HTTP响应头部都可能隐藏flag或提示信息。在渗透测试中,开发者留下的多余注释和测试页面有时也能提供线索。
md5 collision
nctf{md5_collision_is_easy}
<?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";} ?>
利用PHP弱类型,前人发现md5('QNKCDZO')='0e830400451993494058024219903391',md5('240610708')='0e462097431906509019562988736854',而因为使用松散比较的缘故,var_dump('0e830400451993494058024219903391'=='0e462097431906509019562988736854');值为真,因此访问 http://chinalover.sinaapp.com/web19/?a=240610708 即可。
1、在PHP中,@被称为错误控制操作符(error control operator),前置@符号的表达式产生的任何错误都将被忽略。
2、1992年发布的MD5算法是一种广泛使用的哈希算法,最初被设计用来作为加密算法,在被证明不安全后只能用来做数据完整性校验。MD5算法为消息产生128位摘要,常表示为32位十六进制串,由[0-9a-e]组成。
3、PHP的比较操作符主要有两类——松散比较和严格比较,于是就有了equal(==)和Identical(===)两种相等,主要区别在于前者会在比较前根据上下文对操作数进行类型转换(type juggling)而后者不会。这种juggle总的来说利大于弊,但确实容易玩脱。
此处只谈涉及字符串和数值的松散比较。根据本地实验结合官方文档,我们可以总结出来,这种类型转换的行为关键在于两点,一是判断字符串是否处于数字语境(in a numeric context),二是如何为处于数字语境的字符串取值。
当操作符为==
时,若有一个操作数为int/float
或两个操作数is_numeric()
均为真,则判断为处于数字语境;当操作符为数字操作符,如+-/*
时,则判断为处于数字语境。(此段为实验支持下的个人猜测,未找到依据。)
根据PHP官方文档 ,如果一个字符串被认定处于数字语境,那么它的取值取决于字符串的前面一部分,如果字符串以有效的数字型数据【Valid numeric data ,正则匹配表达为 \s(\d+\.?\d*|\.\d+)([eE]\d+)?\s
,含有[eE]的视为科学计数法】开头,那么字符串取开头部分的数值,否则取0 。实验发现1e
也被取值为1而不是0,这有点奇怪 :(
<?php
$a1=1; $b1="1"; $c1="1padding"; $a2=.1; $b2=".1"; $c2=".1padding"; $a3=1.; $b3="1."; $c3="1.padding"; $a4=1.1; $b4="1.1"; $c4="1.1padding"; $a5=1.e1; $b5="1.e1"; $c5="1.e1padding"; $a6=.1e1; $b6=".1e1"; $c6=".1e1padding"; $a7=1.1e1; $b7="1.1e1"; $c7="1.1e1padding"; $a8=1e1; $b8="1e1"; $c8="1e1padding"; var_dump($a8==$b8);//true var_dump($a8==$c8);//true var_dump($b8==$c8);//false var_dump($a8+$b8);//float(20) var_dump($a8+$c8);//float(20) var_dump($b8+$c8);//float(20)
4、其他符合/0[eE]\d{30}/
的MD5值:
string(strlen($var)) $var | string(strlen(md5($var))) md5($var) |
---|---|
QNKCDZO | 0e830400451993494058024219903391 |
s878926199a | 0e545993274517709034328855841020 |
s155964671a | 0e342768416822451524974117254469 |
s1502113478a | 0e861580163291561247404381396064 |
s214587387a | 0e848240448830537924465865611904 |
s878926199a | 0e545993274517709034328855841020 |
s1091221200a | 0e940624217856561557816327384675 |
s1885207154a | 0e509367213418206700842008763514 |
s1836677006a | 0e481036490867661113260034900752 |
s1184209335a | 0e072485820392773389523109082030 |
s1665632922a | 0e731198061491163073197128363787 |
s532378020a | 0e220463095855511507588041205815 |
240610708 | 0e462097431906509019562988736854 |
签到2
<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 尚未登录或口令错误 <form action="./index.php" method="post"> <p>输入框:<input type="password" value="" name="text1" maxlength="10"><br> 请输入口令:zhimakaimen <input type="submit" value="开门"> </form> </html>
nctf{follow_me_to_exploit}
maxlength="10" 而口令 zhimakaimen 有11位,数据在前端就会被截断掉。这时有两种做法,一种是在chrome/Firefox浏览器的开发者工具中将 maxlength="10" 字段修改为 maxlength="11" 或是更大的值;另一种是使用hackbar或burp直接向 http://teamxlc.sinaapp.com/web1/02298884f0724c04293b4d8c0178615e/index.php post text1=zhimakaimen 。客户端的行为都是可控的,所以熟悉HTML和JavaScript是重要的。
这题不是WEB
nctf{photo_can_also_hid3_msg}
下载图片并用winhex打开,在末尾发现字符串。一个简单的隐写。
层层递进
nctf{this_is_a_fl4g}
查看源代码,跟随链接,依次访问SO.html
-> S0.html
->SO.htm
->S0.htm
->404.html
,在最后一个页面里的注释部分可找到flag。还是查看源代码,细心就会发现异常。
AAencode
nctf{javascript_aaencode}
aaencode是一种把js代码编码成日语颜文字的编码方式,使用Unicode编码查看,然后 在线解码 。工具作者颇有幽默感。
单身二十年
nctf{yougotit_script_now}
访问 http://chinalover.sinaapp.com/web8/search_key.php 会被重定向到 http://chinalover.sinaapp.com/web8/no_key_is_here_forever.php ,重定向会被浏览器自动处理,burp抓包则可见flag。
你从哪里来
你是从 google 来的吗?
传送门:题目地址
nctf{http_referer}
给请求加上referer: https://www.google.com
即可。从https://github.com/otakekumi/NUPT_Challenges/blob/master/WEB/%E4%BD%A0%E4%BB%8E%E5%93%AA%E9%87%8C%E6%9D%A5/index.php 看到源代码可能有点问题。
<?php
$referer = $_SERVER['referer'];
if ($referer === "https://www.google.com/ " || $referer === "https://www.google.com"){ echo "nctf{http_referer}"; }else{ echo "are you from google?"; } ?>
第二行应该是$referer = $_SERVER['HTTP_REFERER'];
?
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;} echo CLsI("+7DnQGFmYVZ+eoGmlg0fd3puUoZ1fkppek1GdVZhQnJSSZq5aUImGNQBAA==");