目录
本文章只展示二次注入过程,后续获取flag并不展示
靶场
网站流程、密码的破解和目录的查询以及对于源代码获取
密码暴力破解
网站目录扫描
网站源代码获取
网站流程
尝试注入
注入代码
本文章只展示二次注入过程,后续获取flag并不展示
靶场
可以进入在线的ctf靶场
网站流程、密码的破解和目录的查询以及对于源代码获取
首先刚进来有个留言板可以发帖
密码暴力破解
当你点击发帖的时候会提示你要登陆
登陆已经给你了部分信息这个时候可以使用bp抓包然后暴力破解一下
抓到的包
尝试暴力破解,暴力破解出密码为666尝试登陆、登陆成功,但是没有什么作用
网站目录扫描
使用dirmap或者dirsearch扫描该网站,它会有一个.git文件。.git文件可以理解为github本地仓库的一个数据库文件,也就意味着只要.git泄露就有可能还原你在本地提交的所有代码,如何还原你可以用手工,也可以用工具githack
扫描出来的目录文件
网站源代码获取
使用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_do.php这就是刚刚扫出来的页面源代码
看源码开关语句的结果等于write的结果,这里是没有办法注入的,这里的原因是应为categriy、title、content都被addslashes过滤函数保护了,当你提交了上面三个参数,他会将三个参数提交道数据库里面
下面comment是在留言版的详情里
点击详情就会跳转到comment.php的页面里
在comment.php点击提交的话就会跳转页面会write_do.php中
尝试注入
然后对于网站代码的分析,我们发现代码等于write的时候是没有办法进行注入的,也就是下面这一块
然后再往下看,再开关为comment下的bo_id也不可以进行注入了因为被过滤了
再往下看
sql变量中的category是没有过滤的,虽然他在插入数据库的时候是进行了过滤的,但是你要是插入了'的话插入的数据是被转义了,但是入库的时候‘是不会被转义的,也就是进入数据库后你的转义字符会消失
category处输入 ',content=database(),/*
content处输入*/#
这个时候再往下看刚刚再数据库查到的值在这里使用这不就可以进行注入了
注入代码
这里有一个需要注意的点,上面代码中是多行需要多行注释,将content注释掉
前面的'是为了闭合category的单引号,/*是为了注释掉下面的content
然后content处的*/#是为了和前面的多行注释配合,然后#是为了注释掉content原本的'
category处输入 ',content=database(),/*
content处输入*/#
然后这里content是后面详情里的content
然后我们是在详情里写代码,conment的注释代码
database()已经被读出来了