AWD:web_yunnan_1

0x00 环境搭建

1、进入 cd awd-platform-master
在这里插入图片描述
2、创建赛题和队伍数量:
在这里插入图片描述

3、启动
在这里插入图片描述
4、查看SSH密码
在这里插入图片描述
5、查看到队伍映射的端口
在这里插入图片描述
6、访问端口:
在这里插入图片描述
7、同样可以使用ssh账户登录自己的服务器,下载对应的源文件

0x01 漏洞&修复

sql注入漏洞读取flag

漏洞挖掘

1、通过搜索框中发现查询逻辑:
在这里插入图片描述
2、根据查询逻辑写注入语句:
在这里插入图片描述

漏洞修复

1、找到对应的页面 sqlgunsearch.php
2、查看代码:

<?php
/**
* Author:sqlgun
* Email:sqlgun@qq.com
* Date: 2011-6-8
* http://hi.baidu.com/sqlgun
*/
define('GUY','true');
require 'common.inc.php';
global $_system;

if(isset($_POST['key'])){
        $_key=trim($_POST['key']);
}else{
        echo '<script type="text/javascript">alert("非法访问!");location.href="index.php";</script>';
}

if(isset($_GET['page'])){
        $_page=$_GET['page'];
        if(empty($_page)|| !is_numeric($_page)||$_page<0|| ($_page>0 && $_page<1)){
                $_page=1;
        }else{
                $_page=intval($_page);
        }
}else{
        $_page=1;
}
$_pagenums=$_system['pagenums'];
$_pageopen=($_page-1)*$_pagenums;
echo "select id from news where title like '%$_key%'";
$_result=mysql_query("select id from news where title like '%$_key%'");
$_nums=mysql_num_rows($_result);
$_pages=ceil($_nums/$_pagenums);
$_results=mysql_query("select id,title,date from news  where title like '%$_key%' order by date DESC limit $_pageopen,$_pagenums");

?>

3、修改方案
最简单的就是把echo 打印的后台逻辑给去掉,那%也就不容易闭合
另外就是使用PDO方式,预编译修复

后台登录sql注入

漏洞挖掘

1、首页输入框中随便输入查询内容,在最上面曝出了查询逻辑,通过表可以看出,这里是没有任何过滤,尝试知道后台登录页面,使用sql万能密码登录:
在这里插入图片描述
2、找到登录页面:
在这里插入图片描述
3、但是通过首页的暴露出来的查询逻辑构造登录 admin%’ or 1=1 # 但是无法登录,然后在后台找到登录页面的sql查询语句,找到查询数据的语句:select * from admin where admin=’{KaTeX parse error: Expected 'EOF', got '}' at position 13: _html[admin]}̲' and password=…_html[‘password’]}’ 发现参数是有花括号的,因此在够着登录账户是为: admin}’ or 1=1 # 这样就能闭合登录,知道闭合方式之后就可以尝试注入获取数据库中的内容,寻找flag
注意点:
1、在使用万能密码的时候,密码需要随便填点东西
2、注释需要使用 # ,在这是使用 – 不能注释成功

<?php
/**
* Author:sqlgun
* Email:sqlgun@qq.com
* Date: 2011-5-22
* http://hi.baidu.com/sqlgun
*/
session_start();
define('GUY','true');
require '../common.inc.php';
if($_GET['action']=='login'){
/* 	if($_SESSION['code']!=$_POST['yzm']){
	echo'<script type="text/javascript"> alert("验证码错误!");location.href="login.php"; </script>';	
	exit;	
	} */
	if(empty($_POST['admin'])){
	echo'<script type="text/javascript"> alert("请输入用户账号再登录!");location.href="login.php"; </script>';			
		exit;
	}
	if(empty($_POST['password'])){
	echo'<script type="text/javascript"> alert("请输入用户密码再登录!");location.href="login.php"; </script>';			
		exit;
	}	
	$_html=array();
	$_html['admin']=trim($_POST['admin']);
	$_html['password']=md5(trim($_POST['password']));	
	$_result=@mysql_query("select * from admin where admin='{$_html[admin]}' and password='{$_html['password']}'")or die('登录错误');
	if(!!$_rows=mysql_fetch_array($_result)){
		setcookie('login',md5($_rows['admin']));
        $_SESSION['user']=md5($_rows['admin']);
		header('location:index.php');
	}else{
		echoalerthistory('登录账号信息错误!');
	}
}
?>

输入密码,就能登录成功:
在这里插入图片描述

漏洞修复

1、找到对应的文件 …/sqlgunadmin/login.php

<?php
/**
* Author:sqlgun
* Email:sqlgun@qq.com
* Date: 2011-5-22
* http://hi.baidu.com/sqlgun
*/
session_start();
define('GUY','true');
require '../common.inc.php';
if($_GET['action']=='login'){
/* 	if($_SESSION['code']!=$_POST['yzm']){
	echo'<script type="text/javascript"> alert("验证码错误!");location.href="login.php"; </script>';	
	exit;	
	} */
	if(empty($_POST['admin'])){
	echo'<script type="text/javascript"> alert("请输入用户账号再登录!");location.href="login.php"; </script>';			
		exit;
	}
	if(empty($_POST['password'])){
	echo'<script type="text/javascript"> alert("请输入用户密码再登录!");location.href="login.php"; </script>';			
		exit;
	}	
	$_html=array();
	$_html['admin']=trim($_POST['admin']);
	$_html['password']=md5(trim($_POST['password']));	
	$_result=@mysql_query("select * from admin where admin='{$_html[admin]}' and password='{$_html['password']}'")or die('登录错误');
	if(!!$_rows=mysql_fetch_array($_result)){
		setcookie('login',md5($_rows['admin']));
        $_SESSION['user']=md5($_rows['admin']);
		header('location:index.php');
	}else{
		echoalerthistory('登录账号信息错误!');
	}
}
?>

修改方案:进行pdo预处理()

<?php
session_start();
define('GUY','true');
require '../common.inc.php';
if($_GET['action']=='login'){
/* 	if($_SESSION['code']!=$_POST['yzm']){
	echo'<script type="text/javascript"> alert("验证码错误!");location.href="login.php"; </script>';	
	exit;	
	} */
	if(empty($_POST['admin'])){
	echo'<script type="text/javascript"> alert("请输入用户账号再登录!");location.href="login.php"; </script>';			
		exit;
	}
	if(empty($_POST['password'])){
	echo'<script type="text/javascript"> alert("请输入用户密码再登录!");location.href="login.php"; </script>';			
		exit;
	}	
	$_html=array();
	$_html['admin']=trim($_POST['admin']);
	$_html['password']=md5(trim($_POST['password']));	
	// $_result=@mysql_query("select * from admin where admin='{$_html[admin]}' and password='{$_html['password']}'")or die('登录错误');
	// if(!!$_rows=mysql_fetch_array($_result)){
	// 	setcookie('login',md5($_rows['admin']));
    //     $_SESSION['user']=md5($_rows['admin']);
	// 	header('location:index.php');
	// }else{
	// 	echoalerthistory('登录账号信息错误!');
	// }
	$dbh = new PDO("mysql:host=localhost;dbname=sqlgunews;charset=utf8","root","root");
	$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,flase);

	$sql = "select * from amdin where admin=? and password=?";
	stmt = $dbh->prepare($sql);
	$stmt->bindParam(1,$_html['admin']);
	$stmt->bindParam(2,$_html['password']);
	$stmt->execute();
	$result = $stmt->fetchAll();

	if(!!$result){
		setcookie("login",md5($_rows['admin']));
		$_SESSION['user']=md5($_rows['admin']);
		header('location:index.php');
	} else{
		echo "登录信息错误";
	}
}
?>

在尝试使用完成密码登录,登录失败
在这里插入图片描述
在这里插入图片描述

任意文件下载

漏洞挖掘

1、扫描目录:扫描了一下目录,没有发现有价值的东西,查看了一下源码发现后台目录
在这里插入图片描述
2、登录该目录:
在这里插入图片描述
3、直接使用弱口令,admin/admin即可登录
在这里插入图片描述
4、在日志下载处,发现可以下载log,使用bp和wireshark查看了,没有看出什么东西,就是下载不了
在这里插入图片描述

在这里插入图片描述
5、然后查看教程,去查看了源码,找到下载的php文件,在文件中发现下载日志的代码要求是get请求
在这里插入图片描述
6、根据代码要求构造payload, paylaod: /sqlgunadmin/downlog.php?downlog=down&filepath=/flag

在这里插入图片描述

漏洞修复

修补方案:白名单的方式,只能请求/home/nsfocus/log.txt
具体步骤:1、在前端将下载的方式修改为get的请求方式
2、后端加白名单

downlog.html 前端修改:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="css/addadmin.css"/>
<title>下载日志</title>
</head>
<div id="modify">
<p>下载日志</p>
<form method="get" action="downlog.php">
<ul>
<li>日志:<input type="text" name="filepath" value="/home/nsfocus/log.txt" /></li>
<li><input type="submit" value="下载" /></li>
</ul>
</form>

downlog.php 后台修改之前代码:

<?php
    if($_GET["downlog"] == "down"){
        if(isset($_GET["filepath"])){
            $file_path=$_GET["filepath"];
            $fp=fopen($file_path,"r");
            $file_size=filesize($file_path);
            Header("Content-type:application/octet-stream");
            Header("Accept-Ranges:bytes");
            Header("Accept-Length:".$file_size);
            Header("Content-Disposition:attachment;filename=log.txt")
            $buffer=1024;
            $file_count=0;
            while(!feof($fp)&&$file_count<$file_size){
                $file_con=fread($fp,$buffer);
                $file_count+=$buffer;
                echo $file_con;
            }
            fclose($fp);
        }
    }
?>

后台php修改之后的代码:

<?php
    if(isset($_GET["filepath"])){
        $file_path=$_GET["filepath"];
        if($file_path==="/home/nsfocus/log.txt"){
            $fp=fopen($file_path,"r");
            $file_size=filesize($file_path);
            Header("Content-type:application/octet-stream");
            Header("Accept-Ranges:bytes");
            Header("Accept-Length:".$file_size);
            Header("Content-Disposition:attachment;filename=log.txt")
            $buffer=1024;
            $file_count=0;
            while(!feof($fp)&&$file_count<$file_size){
                $file_con=fread($fp,$buffer);
                $file_count+=$buffer;
                echo $file_con;
            }
            fclose($fp);
        }else{
            die("File not found")
        }
    }
?>

修改之后只能下载log.txt

任意文件上传

漏洞挖掘

找到文件上传的点:
在这里插入图片描述
上传图片马:
在这里插入图片描述
然后用冰蝎链接成功:
在这里插入图片描述

漏洞修复

修复方案:
白名单检测后缀/对上传的文件进行重命名,并自动添加后缀

通过之前bp转包,找到文件上传的文件是:/sqlgunadmin/kindedit/php/upload_json.php
通过之前链接的冰蝎,下载upload_json.php:

<?php
/**
 * KindEditor PHP
 * 
 * 本PHP程序是演示程序,建议不要直接在实际项目中使用。
 * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置。
 * 
 */

require_once 'JSON.php';

$php_path = dirname(__FILE__) . '/';
$php_url = dirname($_SERVER['PHP_SELF']) . '/';

//文件保存目录路径
$save_path = $php_path . '../attached/';
//文件保存目录URL
$save_url = $php_url . '../attached/';
//定义允许上传的文件扩展名
$ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp');
//最大文件大小
$max_size = 1000000;

$save_path = realpath($save_path) . '/';

//有上传文件时
if (empty($_FILES) === false) {
	//原文件名
	$file_name = $_FILES['imgFile']['name'];
	//服务器上临时文件名
	$tmp_name = $_FILES['imgFile']['tmp_name'];
	//文件大小
	$file_size = $_FILES['imgFile']['size'];
	//检查文件名
	if (!$file_name) {
		alert("请选择文件。");
	}
	//检查目录
	if (@is_dir($save_path) === false) {
		alert("上传目录不存在。");
	}
	//检查目录写权限
	if (@is_writable($save_path) === false) {
		alert("上传目录没有写权限。");
	}
	//检查是否已上传
	if (@is_uploaded_file($tmp_name) === false) {
		alert("临时文件可能不是上传文件。");
	}
	//检查文件大小
	if ($file_size > $max_size) {
		alert("上传文件大小超过限制。");
	}
	//获得文件扩展名
	$temp_arr = explode(".", $file_name);
	$file_ext = array_pop($temp_arr);
	$file_ext = trim($file_ext);
	$file_ext = strtolower($file_ext);
	//检查扩展名
    if (($_FILES["imgFile"]["type"] == "image/gif")|| ($_FILES["imgFile"]["type"] == "image/jpeg")|| ($_FILES["imgFile"]["type"] == "image/jpg")|| ($_FILES["imgFile"]["type"] == "image/pjpeg")|| ($_FILES["imgFile"]["type"] == "image/x-png")|| ($_FILES["imgFile"]["type"] == "image/png")){
        //创建文件夹
        $ymd = date("Ymd");
        $save_path .= $ymd . "/";
        $save_url .= $ymd . "/";
        if (!file_exists($save_path)) {
            mkdir($save_path);
        }
        //新文件名
        $new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $file_ext;
        //移动文件
        $file_path = $save_path . $new_file_name;
        if (move_uploaded_file($tmp_name, $file_path) === false) {
            alert("上传文件失败。");
        }
        @chmod($file_path, 0644);
        $file_url = $save_url . $new_file_name;
        
        header('Content-type: text/html; charset=UTF-8');
        $json = new Services_JSON();
        echo $json->encode(array('error' => 0, 'url' => $file_url));
        exit;
    }
    else{
        alert("不被允许的文件格式!");
    }
}

function alert($msg) {
	header('Content-type: text/html; charset=UTF-8');
	$json = new Services_JSON();
	echo $json->encode(array('error' => 1, 'message' => $msg));
	exit;
}
?>

修改之后代码:

(($file_ext == "jpg")|| ($file_ext == "png")|| ($file_ext == "gif")|| ($file_ext == "bmp")|| ($file_ext == "jpg"))

在使用burp去发包,可以看到无法在上传成功:
在这里插入图片描述

0x02 知识点&对抗思路

知识点积累

1、php注释问题:php多行注释要在<?php ?>中才生效;
2、php中 === 问题:https://jingyan.baidu.com/article/f71d6037a7e52b1ab641d1dc.html

对抗思路

1、遇到任意文件下载,最好的方法是白名单,设置只能下载的文件

0x03 参考文章

https://blog.csdn.net/weixin_41652128/article/details/90290769

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一个awd攻防比赛的裁判平台。 版本:beta v2.0 开发语言:python3 + django 平台分为两个部分 裁判机 靶机 通过特定接口,来实现靶机flag与服务器的通信 搭建流程 裁判机 安装所需环境 裁判机:python3+django 全局搜索woshiguanliyuan,并修改为随机字符串,此处为管理平台地址 /untitled/urls.py path('woshiguanliyuan/',views.admin,name='admin'), path('woshiguanliyuan/table/',views.admin_table,name='admin_table'), /app/views.py if 'woshiguanliyuan' not in request.META['HTTP_REFERER']: 第31和47换为你的目录 列:("/var/www/awd_platform/app/qwe.txt","a") 修改app/management/commands/init.py,添加用户 #['用户名','用户靶机token','用户靶机token'] user=[ ['123456','FF9C92C7SDFABB71566F73422C','FF9C92C7SDFABB71566F73422C'], ['aaabbb','311F8A54SV9K6B5FF4EAB20536','311F8A54SV9K6B5FF4EAB20536'] ] 修改/app/views.py第行d89f33b18ba2a74cd38499e587cb9dcd为靶机中设置的admin_token值的md5 if('d89f33b18ba2a74cd38499e587cb9dcd'==hl.hexdigest()): 运行 python3 manage.py init python3 manage.py manage.py runserver --insecure 靶机 安装所需环境 靶机:python+requests 修改send_flag.py参数,并将其放入靶机,设权限700。 靶机 sudo python send_flag.py。 靶机生成flag脚本,send_flag.py import requests import time import random import string import hashlib token='woshiwuxudong' # 红队 baji='311F8A54SV9K6B5FF4EAB20536' def getFlag(): #return ''.join(random.sample(string.ascii_letters + string.digits, 48)) m = hashlib.md5(''.join(random.sample(string.ascii_letters + string.digits, 48)).encode(encoding="utf-8")).hexdigest() return m while(1): f=open('/flag','w') flag=getFlag() f.write(flag) data={ 'flag':flag, 'token':token, 'baji':baji, } r=requests.post('http://127.0.0.1/caipanflag/',data=data) print(r.text) f.close() time.sleep(300) 重要须知 更新作者基础上: 1.增加flag验证一次性失效性,使得每个用户都并且仅可以提交一次flag 2.增加排名情况 3.flag改为MD5 4.增加丢失flag一轮扣100分

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值