| AWD:web_yunnan_1 
 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");
 
 ?>
 
 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
 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
 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
 输入密码,就能登录成功:
 
 
 漏洞修复
 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('登录账号信息错误!');
 }
 }
 ?>
 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
 修改方案:进行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
 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
 46
 47
 在尝试使用完成密码登录,登录失败
 
 
 
 任意文件下载
 漏洞挖掘
 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>
 
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 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);
 }
 }
 ?>
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 后台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")
 }
 }
 ?>
 1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 修改之后只能下载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;
 }
 ?>
 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
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 修改之后代码:
 
 (($file_ext == "jpg")|| ($file_ext == "png")|| ($file_ext == "gif")|| ($file_ext == "bmp")|| ($file_ext == "jpg"))
 1
 在使用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
 ————————————————
 版权声明:本文为CSDN博主「ju1uk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 原文链接:https://blog.csdn.net/qq_38618396/article/details/108240630
 下载地址:
 用PHP生成静态html分页列表的代码
 ecshopB2B2C多商家入驻小京东V5.0在线聊天单仓库+供应商后台版
 |