整理(web)
0X01(签到题)
右键看源码,得到flag。
0X02(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";}
?>
根据给出的源码的意思,要提交的a不等于QNKCDZO,还要满足 $md51 == $md52
,这里不是要md5值完全一样,因为比较时用的是松散比较==
,QNKCDZO的md5值为0e830400451993494058024219903391
,这里因为是==的比较只比较两个操作数的“值”是否相等,而无论类型是否相同。如果比较一个整数和字符串,则字符串会被转换为整数。如果比较两个数字字符串,则作为整数比较。字符串转换为整数时,是从左到右,直到遇到非数字字符为止。也就是说 ‘123abc456’ 会被转换成 123,而不是 123456。另外字符串开始的空格会被忽略,比如 ‘ 234abc’ 转换为 234。这里它的md5第二位是e,也就是比较只比较第一个数字0,找一个md5值符合第一位为0,第二位为字母的就行。
知识点:
PHP
松散比较
0X03(签到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>
让输入zhimakaimen
,注意到maxlength="10"
,所以通不过,F12修改一下就行。
0x04(这题不是WEB)
讲真,这题真不是web,把图片保存到本地,记事本打开得到flag,算是隐写。==。
0X05(单身二十年)
burp suite拦截发到repeater,查看响应,flag就在里面。
<script>window.location="./no_key_is_here_forever.php"; </script>
key is : nctf{yougotit_script_now}
跳转过程地址栏隐约看到了search.php,就怀疑有其他网页,但是一闪而过,所以burp截住看。上面是search那个网页的源码。可以看出直接重定向到no_key_is_here_forever.php
了,flag也就在里面。
window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面
知识点:burp suit使用。
0X06(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才能输出啊。我是直接放虚拟机里面访问得到的。后来知道有在线php代码测试这是链接。
eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。
知识点:php
0X07(单身一百年也没用)
burp截取,发送repeater,查看响应。
知识点:302重定向。
0X08(Download~!)
源码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Game 19</title>
<link href="templatemo_style.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="templatemo_container">
<div id="templatemo_header">
<div id="website_title">
</div>
</div>
<div id="templatemo_menu">
<ul>
<li><a href="#" class="current">Tips</a></li>
<li><b>down</b></li>
</ul>
</div>
<div id="templatemo_content_wrapper">
<div id="templatemo_content">
<div class="content_title_01">听会歌吧</div>
<div class="horizontal_divider_01"> </div>
<div class="cleaner"> </div>
<p>为了让大家更轻松的比赛,为大家准备了两首歌让大家下载</p>
<p><a href="download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM=" target="_blank">星星点灯</a></p>
<p><a href="download.php?url=YnV4aWFuZ3poYW5nZGEubXAz" target="_blank">不想长大</a></p>
<div class="cleaner"> </div>
</div>
<div class="cleaner"> </div>
</div>
<div id="templatemo_footer">
</div>
</div>
</body>
</html>
点那两首歌的链接可以下载,看源码,发现下载链接.
<p><a href="download.php?url=eGluZ3hpbmdkaWFuZGVuZy5tcDM=" target="_blank">星星点灯</a></p>
<p><a href="download.php?url=YnV4aWFuZ3poYW5nZGEubXAz" target="_blank">不想长大</a></p>
这里url=?说明了下载的东西,可以发现是base64加密过的,复制后base64decode验证是base64,但是要改为什么(下载什么)呢?他说了想下什么下什么,把download.php下载下来看看(把download.php经过base64加密后替换掉原来url=后面的字符串)。得到这个
??<?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!";
}
?>
剩下的一样来就行了。
0X09(MYSQL)
根据提示查看robots.txt,如下:
别太开心,flag不在这,这个文件的用途你看完了?
在CTF比赛中,这个文件往往存放着提示信息
TIP:sql.php
<?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]);
}
}
?>
根据提示需要访问sql.php,同时需要提供参数id。这里关键是intval()函数。intval()将变量转成整数类型。而且id!=1024,所以1024.1就可以了。
知识点:
- robots.txt
- intval()函数
###0X10()