BUUCTF-Web Comment
dirsearch扫出/.git/目录
遂用航神写的Githacker脚本 https://github.com/wangyihang/githacker
出来的源码并不完整,使用git log --reflog查看下记录
选择第一条修改的记录的commit执行git reset --hard bfbdf218902476c5c6164beedd8d2fcf593ea23b
这是恢复后的源码
1 <?php 2 include "mysql.php"; 3 session_start(); 4 if($_SESSION['login'] != 'yes'){ 5 header("Location: ./login.php"); 6 die(); 7 } 8 if(isset($_GET['do'])){ 9 switch ($_GET['do']) 10 { 11 case 'write': 12 $category = addslashes($_POST['category']); 13 $title = addslashes($_POST['title']); 14 $content = addslashes($_POST['content']); 15 $sql = "insert into board 16 set category = '$category', 17 title = '$title', 18 content = '$content'"; 19 $result = mysql_query($sql); 20 header("Location: ./index.php"); 21 break; 22 case 'comment': 23 $bo_id = addslashes($_POST['bo_id']); 24 $sql = "select category from board where id='$bo_id'"; 25 $result = mysql_query($sql); 26 $num = mysql_num_rows($result); 27 if($num>0){ 28 $category = mysql_fetch_array($result)['category']; 29 $content = addslashes($_POST['content']); 30 $sql = "insert into comment 31 set category = '$category', 32 content = '$content', 33 bo_id = '$bo_id'"; 34 $result = mysql_query($sql); 35 } 36 header("Location: ./comment.php?id=$bo_id"); 37 break; 38 default: 39 header("Location: ./index.php"); 40 } 41 } 42 else{ 43 header("Location: ./index.php"); 44 } 45 ?>
回到题目的登录界面,根据提示对密码后三位进行爆破,最后得到密码:zhangwei666
进入留言板,审计源码可以发现存在二次注入。三个参数存入board表的时候进行了转义,但之后查询的时候没有转义,造成二次注入。
sql语句有多行所以使用/**/过滤
在category
构造payload
在留言区提交*/#闭合就能显示结果了
利用load_file()读linux文件
www用户对bash进行了操作,查看.bash_history
发现.DS_Store文件
文件显示不全利用hex()读文件
发现flag文件
查看该文件,解码后得flag