首先访问题目链接;
试了一下xss,弹出一个登录框,需要登陆;
查看源码的时候发现了有write_do.php
这个文件;
想到会不会有git泄露;
我用的是gitExtract;
发现果然有git泄露,看看源代码;
看看都拿到了什么文件;
第一个write_do.php
中代码有缺省的情况,看了网上发现大家都用的是git恢复;
第二个文件write_do.php.8ef569
就是源代码文件了,具体我也没有去分析GitExtract的代码是什么,可能是直接就尝试git恢复了;
这里把源码贴出来好分析;
<?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");
}
?>
分析代码可以看到,当do参数为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;
category
、title
、content
参数以post方式上传,addslashes()
函数对其进行转义;
这里还有一张board
表,通过:
insert into board set category = $category',title = '$title',content = '$content'";
这个危险语句,将这三个参数插入表中;
当do=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);
bo_id
、content
参数以post方式上传,addslashes()
函数对其进行转义;
在board表中,select出id=$bo_id
的category值;
如果有返回信息,则$category
等于select出的category值;
最后插入表中;
先暂时分析到这里;
回头看看登录框的提示;
zhangwei***
,这是赤果果的提示啊,直接爆破试试;
跑出来了一个666
登陆进去后可以xss,但是没有什么作用,于是把目光重新放在代码上;
从前线的do=comment代码段中可以抽离出关键的代码进行分析;
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
我们可不可以尝试闭合第一个参数的输入,即category
,然后让content
等于想要获取的内容,再注释掉原来的content?
这也就意味着,我们需要构造这样的payload;
如此,我们可以达到这样的效果:
$sql = "insert into comment
set category = '',content=database(),
bo_id = ''";
真不错,赶紧试试能不能拿到有用的东西;
接着在留言里输入*/#
,即可select到database();
后续的注入就没有显示了,是我太菜了吗;
既然能用函数,就想到读文件函数load_file(),赶紧试试;
试试能不能直接读flag;
果然都是梦;
最后在/etc/passwd里发现了好东西;
我是www
用户,我爱bin/bash
;
读一下.bash_history
;
看到了“隐秘的角落”里留下的痕迹;
可以看到,cd /var/www/html
,凶手在这里作案,虽然在案发现场抹除了痕迹,但是却忽略了/tmp/html.zip
,该包解压后,里面应该有一个.DS_Store
,读读看看里面都是什么见不得人的东西;
我怎么看不太懂这个东西???
view-source一下,看来是乱码了,先hex()编码一下;
然后读一下hex编码的内容;
解码;
可以看到蛛丝马迹;
flag_8946e1ff1ee3e40f.php
读一下flag
可以拿到hex编码后的php文件内容;
解码得到flag;
<?php
$flag="flag{b20ed84a-e040-4717-a64e-0c1df3b9ae03}";
?>
flag{b20ed84a-e040-4717-a64e-0c1df3b9ae03}